[an error occurred while processing this directive]
|
Здравствуйте коллеги
У меня перед глазами лежит документация на RTU188 пр-ва fastwel
Для работы с прерываниями тут приводится следующий код
// Пример работы с прерываниями
// в модуле RTU188
#define Msk 0xXXX // маска
#define MskRg 0xFF28 //Регистр управления
#define EOIRg 0xFF22 // Регистр окончания обработки прерывания
void interrupt Handler(void);
void interrupt (*oldhandler)();
main ()
{
// Инициализация нового вектора
oldhandler = getvect(Vector);
setvect(Vector, Handler);
_AX=(inport(MskRg)) & ~Msk
outportb(MskRg,_AL);
// Восстановление старого вектора
_AX=(inport(MskRg)) | Msk
outportb(MskRg,_AL);
setvect(Vector, oldhandler);
}
void interrupt Handler()
{
// End of interrupt
_AX=Vector;
outportb (EOIRg,_AL);
}
Вопрос в следующем Вот, что получается FF28=254 Помогите разобраться
E-mail:
info@telesys.ru
Регистр FF28 16-ти разрядный нам нужно занулить 10бит(разрешить прерывания)
напрямую : outportb(MskRg,inportb(MskRg) &~Msk); делать нельзя. Может мы
не правильно понимаем устройство 0186 архитектуры, но командой
_AX=(inport(MskRg)) & ~Msk мы заносим в AX нужную нам конфигурацию (при выводе содержимого регистра мы это видим),
а командой
outportb(MskRg,_AL); мы заносим в MskRg только 8 бит непонятно чего
Вот пример может быть он не правильный
#include
#include
#define Msk 0xFFFF //Разрешаем все прерывания
#define MskRg 0xFF28
main()
{
unsigned int R=inportb(0xff28);
printf("FF28=%u\n",R);
_AX=(inport(MskRg))&~Msk;
R=_AX;
printf("_AX= %u\n",R);
R=_AL;
printf("_AL=%u\n",R);
outportb(MskRg,_AX);
R=inportb(0xff28);
printf("FF28=%u\n",R);
}
FF28=254 // это то, что лежит по умолчанию после перезагрузки контроллера
(прерывания запрещены).
_AX=0, // вроде тоже правильно
_AL=7,// Непонятно, что такое
FF28=6//??????????????
Что бы понять логику задали значение MAS=0x000, получили:
_AX=64510.
_AL=11.
FF28=7.
Ответы
Перейти к списку ответов
|||
Конференция
|||
Архив
|||
Главная страница
|||
Содержание