freertos中的idle钩子函数bug思考

最近在写一个小项目,freertos中的idle空闲函数的优先级最低,只有当所有的任务进入阻塞或者挂起的时候才会运行,由此机制可以将单片机的低功耗任务放到idle函数中运行。其中的钩子函数(Hook)可以实现这个功能。

定义好configUSE_IDLE_HOOK这个宏后,再去实现Hook函数

但是在实现时出现了HardFault,程序直接卡死,如下图所示:

仿真发现问题出现在vApplicationIdleHook()函数,究其原因是因为调用了vTaskDelay函数发生了阻塞

总结:

空闲任务hook函数绝不能阻塞或挂起空闲任务。

以任何方式阻塞空闲任务都可能导致没有任何一个任务进入运行状态的情况。

FreeRTOS中,钩子函数Hook Functions)是一组预定义的回调函数,它们为系统行为的定制提供了灵活性。用户可以在特定事件发生时插入自己的代码,以执行一些特定的任务。FreeRTOS定义了几种不同类型的钩子函数,主要包括任务创建钩子、任务删除钩子、调度器开关钩子、空闲任务钩子和定时器钩子。 以下是使用钩子函数的基本步骤: 1. 定义钩子函数钩子函数是预先定义好的函数原型,用户需要根据这些原型定义自己的函数。例如,任务创建钩子函数的原型是: ```c void vApplicationTaskCreateHook( TaskHandle_t xTask, const char * pcName ); ``` 2. 设置钩子函数: 在使用钩子函数之前,需要在系统初始化后,通过相应API函数将自定义的钩子函数注册到系统中。例如,设置任务创建钩子函数是: ```c void vApplicationSetTaskCreateHook( TaskHookFunction_t pxHook ); ``` 3. 实现钩子函数: 在自定义的钩子函数中编写所需执行的代码。这些函数将在系统事件发生时被调用。 4. 启动调度器: 在主函数中启动调度器后,系统会自动在适当的时候调用这些钩子函数。 例如,下面是一个简单的任务创建钩子函数实现示例: ```c void vApplicationTaskCreateHook( TaskHandle_t xTask, const char * pcName ) { /* 在这里添加用户代码,比如在任务创建时记录日志 */ printf( "Task %s is created\r\n", pcName ); } ``` 在实际使用中,需要在合适的地方注册钩子函数,例如在`main()`函数中: ```c void main( void ) { /* 初始化硬件、创建任务等 */ /* 设置任务创建钩子 */ vApplicationSetTaskCreateHook( vApplicationTaskCreateHook ); /* 启动调度器 */ vTaskStartScheduler(); /* 如果调度器启动失败,会进入此分支 */ for( ;; ); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值