Embedded 切勿进入VapplicationDLook

Embedded 切勿进入VapplicationDLook,embedded,freertos,lpc,consumption,Embedded,Freertos,Lpc,Consumption,我正在用LPC1769和FreeRTOS编写一个应用程序。 有两个任务,每个任务都做一些事情并在特定时间内调用vTaskDelay 我想在任务延迟时加入睡眠模式 在FreeRTOSConfig.h中,我设置了 #define configUSE_IDLE_HOOK 1 在VApplicationDLook中(无效) 但应用程序从未进入vApplicationIdleHook。。。 我已经试着把代码切换到led,但什么都没有 怎么了?在FreRTOS文档中,

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

我想在任务延迟时加入睡眠模式

在FreeRTOSConfig.h中,我设置了

   #define configUSE_IDLE_HOOK          1       
在VApplicationDLook中(无效)

但应用程序从未进入vApplicationIdleHook。。。 我已经试着把代码切换到led,但什么都没有

怎么了?在FreRTOS文档中,我能看到的唯一必要条件是设置configUSE\u IDLE\u HOOK

谢谢!
... 对不起,我的英语也有这个问题。我用Atolic 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中,我创建了一个任务。它的优先级并不重要

部分代码:

测试1

在上面的代码中:注释掉AAA行;在BBB和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的在线描述(表示其参数为滴答声)与

也就是说osDelay的参数是毫秒


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

我的程序中也有这个问题。我用Atolic 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中,我创建了一个任务。它的优先级并不重要

部分代码:

测试1

在上面的代码中:注释掉AAA行;在BBB和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的在线描述(表示其参数为滴答声)与

也就是说osDelay的参数是毫秒


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

有时当您不知道从哪里开始时,执行递归grep(搜索)一个标识符(如USE_IDLE_HOOK)可以帮助您找到它所启用的相关代码,然后向上看,找出什么允许或不允许代码到达那里。如果您有一个线程从未锁定其执行,您可能永远不会进入IDLEhook,因为系统永远不会处于空闲状态。您使用的是什么类型的调度,其他两个进程的优先级是什么?有时,当您不知道从哪里开始时,执行递归grep(搜索)一个标识符(比如USE_IDLE_HOOK)可以帮助您找到它所启用的相关代码,然后向上看并找出是什么
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
    }
}