Служба RTX isr_evt_set задерживается

Я работаю над аппаратным обеспечением крошечного геккона Silicon Labs EFM, запуская RTX с использованием цепочки инструментов 4.22 arm. У меня есть следующая конфигурация для RTX: - Группировка NVIC 7.1 - System Tick & Pend Приоритет прерывания системной службы 224. - Оба прерывания включены и никогда не отключаются моим потоком кода. - Регистры PRIMASK и BASEPRI равны 0.

Коду RTX в моем проекте уже несколько лет, и я не уверен, какая это версия.

Я заметил следующую проблему: при использовании isr_evt_set для запуска задачи из прерывания RTC выполнение задачи задерживается. Я обнаружил, что прерывание «Pend System service» не вызывается, когда прерывание RTC заканчивается.

isr_evt_set переводит «Ожидающую системную службу» в состояние ожидания при вызове из прерывания RTC. После завершения прерывания RTC прерывание «Ожидание системного обслуживания» не становится активным. Вместо этого процессор возобновляет режим потока и выполняет задачу с низким приоритетом (управление питанием).

Я установил бит SLEEPONEXIT регистра SCB в 0 в прерывании RTC. Прерывание «Ожидание системного обслуживания» в конечном итоге выполняется примерно через 4-10 циклов RTC.

Я ожидаю, что прерывание «Ожидание системного обслуживания» будет запущено после прерывания RTC. Можете ли вы объяснить, почему кортекс возвращается в режим потока после прерывания RTC?


person amit katz    schedule 27.04.2018    source источник


Ответы (1)


  1. В руководстве Cortex M3 указано, что «Pend System Service» является исключением, и процессор должен вернуться в режим Thread для его обслуживания.

  2. Я обнаружил, что перед прерыванием RTC задача, ответственная за перевод системы в спящий режим, использует tsk_lock(). Когда isr_evt_set вызывается из прерывания RTC, его запрос на активацию «ожидания системной службы» буферизуется и обслуживается только после того, как процессор возобновляет режим потока и использует tsk_unlock(), который немедленно устанавливает флаг ожидания NVIC для «ожидания системной службы». Используя отладчик, я вижу, что PendSV_Handler() вызывается вскоре после вызова tsk_unlock().

person amit katz    schedule 30.04.2018