切勿输入vApplicationIdleHook

时间:2013-05-30 11:32:10

标签: embedded freertos lpc consumption

我正在使用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 ....

谢谢! ...对不起我的英语

1 个答案:

答案 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版本),但是我更喜欢第二个版本,它解决了另一个类似的问题。