Сколько времени у вас есть, чтобы ответить на запрос данных, и сколько времени потребуется на предварительную выборку для следующего запроса? Если время предварительной выборки невелико, я бы изменил ваш приоритет прерываний - это сохраняет буфер заполненным для прерывания запроса данных.
В противном случае нет чистого способа делать то, что вы хотите, с нуля - это то, для чего нужны операционные системы. Если вы работаете в операционной системе, процедура прерывания запроса данных может запросить сигнал из процедуры прерывания предварительной выборки и вернуться из прерывания и ждать, пока программа прерывания запроса данных не отправит сигнал о завершении блока.
В чистом виде вы можете попробовать заставить подпрограмму предварительной выборки вызывать прерывание запроса данных после того, как каждый буфер готов. Затем DRIR выполняет серию проверок, когда просыпается.
- Was I woken by a Data Request?
- yes: Do I have data to send?
- yes: Send data, clear interrupt request, return from interrupt
- нет: увеличение счетчика «необходимых блоков» на 1, очистка запроса прерывания, возврат из прерывания
- no: must have been woken by a Prefetch complete, is "blocks needed" zero?
- yes: buffer has data, but not needed yet, return
- нет: отправьте 1 блок данных, уменьшите количество «необходимых блоков» до нуля или пока буфер не станет пустым, возврат
Нет никакой гарантии, что вы получите данные вовремя, но, по крайней мере, так есть шанс, что прерывание с более низким приоритетом завершится.
Кстати, я не думаю, что NVIC может принудительно остановить выполняющееся в данный момент прерывание для другого с более высоким приоритетом. Приоритеты действительно имеют значение, когда прерывания происходят одновременно (или когда прерывания уже замаскированы, т. Е. При обслуживании другого прерывания).
Многие операционные системы предоставляют двухэтапный процесс прерывания, в котором процедура прямого прерывания минимальна, насколько это возможно, чтобы очистить прерывание, и уведомляет отдельный поток прерывания для обработки более длинных и подробных частей запроса. См. http://en.wikipedia.org/wiki/Interrupt_handler.
Поскольку процедура прямого прерывания небольшая и быстрая, она позволяет назначать приоритеты соответствующим потокам прерывания для управления порядком выполнения.
person
Rich Hendricks
schedule
04.03.2014