Работа с прерываниями
На некоторых платформах часть линий ввода-вывода может работать как входы прерываний. Чтобы включить нужную линию прерывания, выберите её свойством io.intnum и включите свойством io.intenabled:
'enable interrupt line #0
io.intnum=PL_INT_NUM_0
io.intenabled=YES
После включения линии любое изменение её состояния порождает событие on_io_int. Аргумент linestate этого события кодируется по битам: каждый бит значения соответствует одной линии прерывания. Для PL_INT_NUM_0 это бит 0, для PL_INT_NUM_1 - бит 1 и так далее. Бит аргумента linestate устанавливается, когда на соответствующей линии прерывания обнаружено изменение состояния (из LOW в HIGH или из HIGH в LOW). Обработчик события on_io_int может затем определить, что вызвало прерывание:
sub on_io_int(linestate as byte)
'check if it is the interrupt line #0 that has caused the interrupt
if (linestate and &h01) <>0 then
'yes, interrupt has been triggered by the interrupt line #0
...
end if
end sub
Учтите, что слово «прерывание» здесь употребляется в довольно вольном смысле. В традиционных микроконтроллерах изменение состояния линии прерывания почти мгновенно приостанавливает выполнение основного кода и передаёт управление «процедуре обработки прерывания». Отсюда и термин: выполнение основного кода прерывается.
В случае объекта io. изменение состояния линии прерывания не прерывает выполнение ни одного обработчика событий и не меняет порядок ожидающих событий в очереди. Событие on_io_int добавляется в конец очереди событий и не обрабатывается, пока не будут обработаны все более ранние события. Таким образом, на самом деле ничего не прерывается. Заметьте также, что скорость реакции на прерывание здесь не гарантируется: время между обнаружением изменения состояния линии и выполнением обработчика события on_io_int зависит от числа событий, ожидающих в очереди раньше, и поэтому не может быть точно определено заранее.
Кроме того, в очереди событий может ожидать только одно событие on_io_int. Пока предыдущее не обработано, новое не создаётся (это предотвращает переполнение очереди событий). Поэтому некоторые кратковременные изменения состояния могут остаться незамеченными.
Итог: «прерывания» объекта io. следует рассматривать как более удобную альтернативу программному опросу линий ввода-вывода.
Обратите внимание: названия линий прерываний, такие как PL_INT_NUM_0, определяются перечислением pl_int_num, которое зависит от платформы. Объявление этого перечисления приведено в документации по платформе вашего устройства (например, для EM1000 она находится здесь).