RTX isr_evt_set служба задерживается - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над крошечным гекконом Silicon Labs EFM, работающим на RTX с использованием цепочки инструментов с 4,22 кронштейнами. У меня есть следующая конфигурация для RTX: - NVIC группировка 7.1 - Системная отметка и ожидание Системный приоритет прерывания службы 224. - Оба прерывания включены и никогда не отключаются моим потоком кода. - регистры PRIMASK и BASEPRI оба равны 0.

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

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

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

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

Я ожидаю, что прерывание "Pend system service" будет запущено после прерывания RTC. Можете ли вы объяснить, почему кортекс возвращается в режим Thread после прерывания RTC?

1 Ответ

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

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

...