Как избежать прерывания голодания во вложенной системе прерываний? - PullRequest
0 голосов
/ 23 мая 2018

Я изучаю прерывания и не могу понять, что происходит, когда слишком много прерываний до точки, когда ЦП не может обработать цикл переднего плана или завершить существующие прерывания.Я прочитал эту статью https://www.cs.utah.edu/~regehr/papers/interrupt_chapter.pdf, но не до конца понял, как может помочь планировщик, если просто слишком много прерываний?

Мы переключаемся на более быстрый процессор, если прерывания не могут бытьпропустил?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Действительно, всякий раз, когда происходит конфликт по поводу общего ресурса, существует вероятность голодания.Планировщики, обсуждаемые в статье, ограничивают частоту прерываний, обеспечивая тем самым некоторое время обработки без прерываний в течение каждого интервала.Во время периодов высокой активности обработка прерываний отключена, и планировщик переключается в режим опроса, где он периодически запрашивает состояние строк запроса прерываний, эффективно подавляя поток прерываний.Операционная система стремится сделать как можно меньше в каждом обработчике прерываний - задачи часто просто ставятся в очередь, чтобы их можно было потом обработать на другом этапе.Есть много соображений и компромиссов, которые входят в любой алгоритм планирования.

0 голосов
/ 23 мая 2018

В целом вам нужно понять, сколько времени занимает каждая часть вашей программы.Это довольно легко измерить на практике в реальном времени с помощью осциллографа.Если вы активируете GPIO при входе и деактивируете его при выходе из прерывания, вы не только узнаете, сколько времени потребляет ISR, но и как часто он срабатывает. Если вы делаете это для каждого ISR, вы получаетехорошая идея, сколько времени им нужно.Затем вы можете сделать что-то похожее в main (), чтобы получить приблизительную оценку полного цикла выполнения программы, main + прерывания.

Что касается лучшего решения, очевидно, что нужно уменьшить количество прерываний.,Используйте опрос, если это возможно.Используйте DMA.Используйте последовательные периферийные устройства (UART, CAN и т. Д.) С аппаратной буферизацией, а не с интенсивными прерываниями.Используйте аппаратный ШИМ вместо выходных таймеров сравнения.И так далее.Эти вещи нужно учитывать на ранней стадии, когда вы выбираете подходящий MCU для вашего проекта.Если вы выбрали неправильный MCU, то вам, очевидно, придется измениться.Вращение с часами процессора звучит как быстрое и грязное исправление.Получите правильный дизайн вместо этого.

0 голосов
/ 23 мая 2018

Да, вам пришлось переключиться на более быстрый процессор!Вы должны были убедиться, что у mainloop достаточно времени.Поэтому очень важно, чтобы служба прерываний была как можно более короткой и выполняла некоторые тесты рабочих нагрузок процессора.

...