Программирование игр для Windows. Советы профессионала


Вектор Номер Адресная функция - часть 2


Листинг 14.1. Операция ISR.

void _interrupt _far Serial_Isr(void)

{

// Это процедура обработки прерывания СОМ-порта. Она очень проста.

// При вызове она читает полученный символ из регистра 0 порта

//и помещает его в буфер программы. Примечание: язык Си сам

// заботится о сохранении регистров и восстановлении состояния

// запрещаем работу всех других функций

//во избежание изменения буфера

serial_lock = 1;

// записываем символ в следующую позицию буфера

ser_ch = _inp(open_port + SER_RBF);

// устанавливаем новую текущую позицию буфера

if (++ser_end > SERIAL_BUFF_SIZE-1) ser_end = 0;

// помещаем символ в буфер

ser_buffer[ser_end] = ser_ch;

++char_ready;

/ / восстанавливаем состояние контроллера прерываний

_outp(PIC_ICR,0x20);

// разрешаем работу с буфером

serial_lock = 0;

} // конец функции

Программа из Листинга 14.1 выполняет все то, о чем мы говорили. Однако стоит обратить внимание на одну маленькую деталь. В программу включена переменная serial_lock, которая оберегает основную программу от конфликт тов связанных с обращением к буферу, пока ISR обновляет его. Такой прием называется «блокировкой» или «семафором». В DOS'e подобной проблемы никогда не возникает по ряду причин, о которых говорить слишком долго. Необходимость регулирования доступа к общим данным возникает только для полностью многозадачных систем. Тем не менее, введение «семафоров» - хорошая практика, даже если на данном этапе такая техника и не нужна. Все, мы почти у цели!




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



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