Информатика и технология программирования


Средства обработки прерываний в Си


Когда мы переходим с уровня архитектуры на уровень языка программирования, понятие прерывания должно, естественно, интерпретироваться несколько по-иному. Но при этом основные свойства прерывания должны сохраняться - процедура, асинхронность, прозрачность. Компилятор должен генерировать для прерывания такой код, чтобы указанные свойства соблюдались с учетом особенностей выполнения скомпилированной программы. Перечислим их :



- обработчик прерывания должен представлять собой функцию ;



- вызов этой функции должен осуществляться асинхронно, то есть ее имя (или указатель на нее) должно быть связано с вектором прерывания процессора ;



- функция должна быть " прозрачной" по отношению к исполнительной системе компилятора, то есть выполняемая Си-программа не должна замечать процесса прерывания ;



- функция должна иметь доступ как к глобальным (внешним), так и к локальным (автоматическим) переменным .

Для обработки прерываний в Си предусмотрен специальный вид функций с ключевым словом interrupt следующего вида (здесь и далее синтаксис приводится для Си++ - расширений файлов исходного текста вида . cpp ):


void interrupt INTR(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs) { } // или


void interrupt INTR( ...) { }

Особенности работы компилятора при трансляции такой функции состоят в следующем:



- перед началом программного кода функции генерируются команды сохранения в стеке всех регистров процессора - ax, bx, cx, dx, es, ds, si, di, bp, кроме сохраняемых аппаратно - регистра флагов, cs,ip и регистров указателя стека - ss,sp, которые остаются без изменения (переключения стека не происходит);



- ds устанавливается на сегмент данных Си-программы. Этим обеспечивается возможность работы с внешними переменными;



- в bp копируется текущее значение sp - этим обеспечивается возможность работы с автоматическими переменными;



- перед выходом из функции генерируются команды восстановления регистров из стека;



- выход из функции производится командой выхода из прерывания -
RETI.

Поскольку формальные параметры функции - это ожидаемое состояние стека, а функция обслуживания прерывания помещает в стек регистры в известной последовательности, то список формальных параметров функции обработки прерывания представляет собой содержимое регистров процессора в момент прерывания.


Начало  Назад  Вперед



Книжный магазин