【问题标题】:Never enter in vApplicationIdleHook永远不要进入 vApplicationIdleHook
【发布时间】:2013-05-30 11:32:10
【问题描述】:

我正在使用 LPC1769 和 FreeRTOS 编写应用程序。 有两个任务,每个任务都做一些事情并调用vTaskDelay一段时间。

我有兴趣在任务延迟时加入睡眠模式...

在 FreeRTOSConfig.h 我已经设置了

   #define configUSE_IDLE_HOOK          1       

在vApplicationIdleHook(void)中

void vApplicationIdleHook( void )
{
    LPC_SC -> PCON = 0x0;
    SCB->SCR = 0x0;
    __WFI();
}

但应用永远不会进入 vApplicationIdleHook... 我已经尝试输入代码来切换 LED 并且什么都没有......

怎么了?在 FreRTOS 文档中,我能看到的唯一必要条件是设置 configUSE_IDLE_HOOK....

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

【问题讨论】:

  • 有时当您不知道从哪里开始时,对整个代码库进行递归 grep(搜索)以查找 USE_IDLE_HOOK 等标识符可以帮助您找到它启用的相关代码 - 然后您查看向上返回并弄清楚什么允许或不允许代码到达那里。
  • 如果您有一个从不锁定其执行的线程,您可能永远不会进入 IDLEhook,因为系统永远不会处于空闲状态。
  • 您正在使用什么类型的调度以及其他 2 个进程的优先级是什么?

标签: embedded freertos lpc consumption


【解决方案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 的在线描述说它的参数是滴答声和由 FreeRTOS: osDelay vs HAL_delay

表示 osDelay 的参数是毫秒。

这里我使用的是第一个版本(cimsis_os2.h 版本),但我更喜欢解决另一个类似问题的第二个版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2023-03-05
    • 2014-08-04
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多