我正在使用LPC1769和FreeRTOS编写应用程序。 有两个任务,每个任务都做一些事情并在一定时间内调用vTaskDelay。
我有兴趣加入睡眠模式,而任务延迟......
在FreeRTOSConfig.h中我设置了
#define configUSE_IDLE_HOOK 1
在vApplicationIdleHook(void)
中void vApplicationIdleHook( void )
{
LPC_SC -> PCON = 0x0;
SCB->SCR = 0x0;
__WFI();
}
但是app永远不会进入vApplicationIdleHook ...... 我已经尝试将代码放到切换导向而没有任何东西......
有什么问题?在FreRTOS文档中,我能看到的唯一必要条件是设置configUSE_IDLE_HOOK ....
谢谢! ...对不起我的英语
答案 0 :(得分:1)
我的程序中也有这个问题。我在带有Atollic TrueSTUDIO的Stm32 NucleoF446RE中添加了vApplicationIdleHook,仅用于测试它,而没有特别的需要。我记得曾经调用过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的调试比此操作系统的其他对象要难,但是可以解释,应该信任并且应该加以改进。有 cimsis_os2.h的osDelay在线描述(其参数为ticks)和 FreeRTOS: osDelay vs HAL_delay
表示osDelay的参数是毫秒。
在这里,我使用了第一个版本(cimsis_os2.h版本),但是我更喜欢第二个版本,它解决了另一个类似的问题。