Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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

Алгоритм 13.2. Алгоритм Уклонения. | Алгоритм 13.3. Шаблоны со случайным выбором. | Листинг 13.2. Муха (FLY.C). | Листинг 13.3. Одинокая муха. (DFLY.C). | Листинг 13.4. Умная «Муха» (BFLY.C). | Состояние Существо 3: Хныкалка | Алгоритм 13.6. Использование плотности вероятностей в выборе состояния. | Алгоритм 13.7. Путь наружу. | Последовательный порт Базовый адрес порта | Штырьковый разъем |


Читайте также:
  1. Quot;антитеррористическая операция" на Филиппинах.
  2. Берлинская операция. Встреча на Эльбе. Капитуляция Германии
  3. В) консервативная, а при появлении осложнений - операция
  4. В) консервативная, а при появлении осложнений - операция
  5. Кооперация и политические партии
  6. Кооперация и профессиональное движение
  7. Корреспонденции счетов по операциям начисления заработной платы, других выплат и удержаниям из начисленных выплат.

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 подобной проблемы никогда не возникает по ряду причин, о которых говорить слишком долго. Необходимость регулирования доступа к общим данным возникает только для полностью многозадачных систем. Тем не менее, введение «семафоров» - хорошая практика, даже если на данном этапе такая техника и не нужна. Все, мы почти у цели!

Чтение символа из буфера

Теперь нам необходимо иметь возможность считывать символ из буфера. Это легко. В принципе, достаточно запомнить новый индекс, указывающий на текущую ячейку буфера, из которой будет прочитан следующий символ. Но что если мы попытаемся прочитать символ и изменить индекс, в то время как основная программа уже исчерпала все входные данные, пришедшие от преры­вания? В этом случае функция просто-напросто будет возвращать символ 0. Листинг 14.2 содержит подходящую программу.


Дата добавления: 2015-07-12; просмотров: 83 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Вектор Номер Адресная функция| Листинг 14.2. Функция Serial Read.

mybiblioteka.su - 2015-2024 год. (0.006 сек.)