ARM Cortex-M4 Приоритеты прерываний

Я использую микроконтроллер ARM Cortex M4. Если у меня есть обработчик прерываний для GPIO с приоритетом 2 и драйвер SPI с приоритетом 3 (т. е. с более низким приоритетом, чем у GPIO), и я вызываю (блокирующий) SPI, считываемый из обработчика прерываний GPIO, будет ли работать функция SPI? ?


person tosa    schedule 15.09.2016    source источник
comment
Зависит от того, будет ли указанная функция опрашивать контроллер SPI или ждать поступления прерывания...   -  person Notlikethat    schedule 16.09.2016
comment
Блокировка чтения (или блокировка чего-либо) в обработчике прерывания — очень плохая идея. Прерывания всегда должны быть как можно более быстрыми.   -  person Realtime Rik    schedule 19.09.2016


Ответы (1)


Ответ на ваш вопрос зависит от того, как он блокирует передачу, как сказал @Notlikethat.

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

Если ваш драйвер SPI управляется прерываниями, он не будет работать. Поскольку вы выполняете прерывание с приоритетом 2 (GPIO), прерывание с приоритетом 3 (SPI) не будет выполняться, пока прерывание GPIO не завершится. В зависимости от того, как написан ваш драйвер SPI, это может привести к полному зависанию вашей системы или тайм-ауту.

Если ваш драйвер SPI управляется DMA, то ответ не так ясен и зависит от того, как работает драйвер. В этом случае возможно, что ваша транзакция завершится, но если функция заблокировала ожидание прерывания DMA, она может никогда не поступить в зависимости от ее приоритета.

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

person rjp    schedule 16.09.2016
comment
Я использую MCU Nordic nRF52 без RTOS. Проблема, с которой я (буду) сталкиваться, заключается в том, что у меня есть датчик SPI, который готовит данные каждые 4 мс, которые будут считываться SPI при каждом прерывании и сохраняться в буфере. После считывания ряда выборок данные будут обработаны. Ожидается, что обработка займет 10 мс. Следовательно, ожидается, что еще 2 выборки будут готовы и сохранены (в двойном буфере) во время обработки. Поскольку RTOS нет, мне нужно каким-то образом позволить прерываниям чтения новых данных вытеснять обработчик обработки. продолжение - person tosa; 16.09.2016
comment
Поэтому я думал о том, чтобы чтение SPI происходило непосредственно в обработчике прерываний GPIO, чтобы функция обработки данных могла запускаться из основного (с более низким приоритетом). Какой самый простой (и надежный) способ решить эту проблему? Спасибо! - person tosa; 16.09.2016
comment
Судя по цифрам, которые вы мне только что дали, похоже, вы не сможете идти в ногу со временем. Если каждые 4 мс у вас будут новые данные, требующие 10 мс для обработки, через 1 секунду у вас будет невыполненный журнал из 150 необработанных образцов. В каком контексте происходит обработка? Это в одном из прерываний или в основном процессе? - person rjp; 16.09.2016
comment
Привет, rjp, извините, я не ясно выразился ... после того, как число выборок считано, значит, после, скажем, 100 выборок, то есть 400 мс при 4 мс / с, данные 100 с обрабатываются. Следовательно, меня беспокоит отсутствие двух выборочных чтений во время обработки события. Событие обработки произойдет в основном контексте (самом низком) через флаг, указывающий, что данные готовы к обработке. - person tosa; 16.09.2016
comment
Должно ли прерывание GPIO иметь более высокий приоритет, чем прерывание SPI? - person rjp; 16.09.2016
comment
Нет, но даже если они имеют одинаковый приоритет, не будет ли эта проблема все еще существовать? Я мог бы сделать SPI прерыванием с более высоким приоритетом, но тогда мне нужно будет изменить исходный код драйвера Nordic GPIO, чтобы понизить его приоритет (поскольку он имеет наивысший допустимый приоритет), потенциально открывая еще одну банку червей. - person tosa; 17.09.2016