А вот как это может выглядеть со стороны программной реализации чтобы не пропускать данные uart во время обработчиков Int50 (считаем что аппаратно оба прерывания разделены как описано постом выше):
Расчет на то, что в обработчиках прерывания UART первой командой делается DI, а предпоследней (перед reti) делаем EI.
Обработчик INT50Hz DI/EI не делает. Для защиты от повторного вхождения в самого себя он переставляет вектор своего обработчика на фиктивный обработчик, единственная функция которого запомнить было ли еще одно прерывание INT50Гц во время обработчика (и обработать его при выходе, если было). Так в наcтоящее время сделано в CP/M и я планировал это оставить в таком виде, т.к. пока не вижу подводных камней.
Таким образом, прерывание UART во время обработчика INT50Hz спокойно отработает (т.к. идет не на фиктивный обработчик Int50, вектор которого по адресу +FF, а на реальный обработчик UART по адресу +FD), оно ни на какой алгоритм не повлияет, т.к. лишь спуливает принятый байт в буфер, ничего тяжелого (типа переключения страниц, управления SP) тут не делается, в отличие от обработчика INT50Hz.
А вот прерывание INT50Hz во время обработчика UART работать не будет (из-за DI). Что, КМК, правильно.
Насколько все это хорошо наложится одно на другое покажет только будущее.![]()





Ответить с цитированием