ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
14 октября
1547844 Топик полностью
Nikolay_Po (Вчера, 18:12, просмотров: 55) ответил Eddy_Em на Достаточно такие критические секции просто обложить disable_irq / enable_irq.
Эдуард, выглядит так, будто ты умнее всех и нас учишь. А если представить себе, что выполняется секция высокоприоритетного прерывания интерфейса. И нужно вызвать другую, более приоритетную, чем main() задачу, долгую, длинную функцию, но менее приоритетную чем прерывания железа. 

Программному прерыванию даётся приоритет ниже приоритета аппаратных прерываний. И это программное прерывание может быть вызвано из любого кода, как из аппаратного прерывания, так и из пользовательского кода. И запретить disabe_irq (как это обычно делает продвинутый ардуинщик) - нельзя - обработка длинная, но должны обслуживаться аппаратные прерывания.

Железо принимает поток данных. И если принят очередной блок данных (команда), то в программном прерывании запускается обработчик данных (команды) и высокоприоритетное прерывание завершается, освобождая ЦП для других высокоприоритетных прерываний. А программное прерывание выполняется своим чередом промеж высокоприоритетных аппаратных. Профит - обработка команды приоритетнее usermode. И прерывания железа не блокируются. Без всяких RTOS.