Никогда не входите в vApplicationIdleHook
Я пишу приложение с LPC1769 и FreeRTOS. Есть две задачи, каждая задача что-то делает и вызывает vTaskDelay в течение определенного времени.
Я заинтересован в переходе в спящий режим, пока задачи задерживаются...
В FreeRTOSConfig.h я установил
#define configUSE_IDLE_HOOK 1
В vApplicationIdleHook(пусто)
void vApplicationIdleHook( void )
{
LPC_SC -> PCON = 0x0;
SCB->SCR = 0x0;
__WFI();
}
Но приложение никогда не входит в vApplicationIdleHook... Я уже пытался поставить код для переключения привело и ничего...
Что случилось? В документации FreRTOS единственное, что я вижу, это set configUSE_IDLE_HOOK....
Спасибо! ... и извините за мой английский
0 ответов
У меня тоже была эта проблема в моей программе. Я добавил vApplicationIdleHook в свой Stm32 NucleoF446RE с Atollic TrueSTUDIO, только чтобы протестировать его без особой необходимости. Я помню, что был вызван vApplicationIdleHook и он мог что-то напечатать, но, продолжая работу с моим приложением, теперь vApplicationIdleHook больше не вызывается и ведет себя плохо. Я не пишу здесь много кода, так как все будет слишком длинным, но подсказки легко понять и для такого любителя, как я.
Настоящая рабочая организация:
1) в FreeRTOSConfig.h добавляю две строки
#define configIDLE_SHOULD_YIELD 0
#define configUSE_IDLE_HOOK 1
2) в main.c я добавляю только свое определение void vApplicationIdleHook(void): нет необходимости объявлять его вперед. Я поместил в эту функцию точку проверки: вовсе не osDelay или, что еще хуже, бесконечный цикл.
3) в main.c создаю задачу. Его приоритет не имеет значения.
Частичный код:
int uuu = 0;
int main(void)
{
//create StartTaskDef with osPriorityLow
//boilerplate code...
}
void vApplicationIdleHook(void)
{
uuu++; // CCC
}
void StartTaskDef(void *argument)
{
const TickType_t xDelayms = pdMS_TO_TICKS(2); // cimsis_os2.h version
while (1) // AAA
{
osDelay(xDelayms); // BBB cimsis_os2.h version
}
}
Тест 1.
В приведенном выше коде: закомментируйте строку AAA; поставить точку останова в строках BBB и CCC; компилировать и отлаживать. Отладка по порядку остановится на: BBB (в любом случае более высокий приоритет); CCC; CCC; CCC; ... BBB будет поражен только один раз, потому что его задача выполняется один раз, а затем завершается. Для каждого попадания CCC uuu увеличивается на 1.
Тест 2.
Оставьте приведенный выше код в том виде, в каком он есть со строкой AAA. поставить точку останова в строках BBB и CCC; компилировать и отлаживать. Отладка по порядку остановится на: BBB (в любом случае более высокий приоритет); CCC; CCC; CCC;... Для каждого попадания CCC uuu увеличивается на 1. Это кажется странным, поскольку теперь строка AAA представляет собой бесконечный цикл, а отладка больше не достигает BBB. Поэтому удалите точку останова в строке CCC и возобновите отладку. Теперь отладка остановится на: BBB;BBB; BBB;... Проверка uuu на каждой остановке отладки теперь показывает, что uuu увеличилось не на единицу, а на тысячи. Это означает, что пока выполнялась строка BBB (StartTaskDef спал), vApplicationIdleHook мог действовать тысячи раз.
Соображения.
Отладка vApplicationIdleHook сложнее, чем другие объекты этой операционной системы, но ее можно интерпретировать, ей следует доверять и, возможно, улучшить. Существует некоторая путаница между онлайн-описанием osDelay в cimsis_os2.h, в котором указывается, что его аргумент - это галочка, и описанием, данным FreeRTOS: osDelay vs HAL_delay
который говорит, что аргумент osDelay составляет миллисекунды.
Здесь я использовал первую версию (версия cimsis_os2.h), но предпочитаю вторую, которая решает другую аналогичную проблему.