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