Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Листинг 14.1. Операция ISRvoid _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 подобной проблемы никогда не возникает по ряду причин, о которых говорить слишком долго. Необходимость регулирования доступа к общим данным возникает только для полностью многозадачных систем. Тем не менее, введение «семафоров» - хорошая практика, даже если на данном этапе такая техника и не нужна. Все, мы почти у цели! Чтение символа из буфера Теперь нам необходимо иметь возможность считывать символ из буфера. Это легко. В принципе, достаточно запомнить новый индекс, указывающий на текущую ячейку буфера, из которой будет прочитан следующий символ. Но что если мы попытаемся прочитать символ и изменить индекс, в то время как основная программа уже исчерпала все входные данные, пришедшие от прерывания? В этом случае функция просто-напросто будет возвращать символ 0. Листинг 14.2 содержит подходящую программу.
|