我们直接打开FreeRTOSconfig.h
, 可以看到里面有configUSE_TICK_HOOK
等设置,是否启动hook函数,这里选择了1
,启用。
c
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 1
#define configCPU_CLOCK_HZ ( SystemCoreClock )
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configMAX_PRIORITIES ( 56 )
以configUSE_TICK_HOOK
为例,它的作用就是在每一次心跳产生时,调用回调函数,这个回调函数在哪里呢?我们可以在cmsis_os2.c
中看到一个weak函数,代表你可以在外部任何地方重新定义这个函数。
c
/**
Dummy implementation of the callback function vApplicationTickHook().
*/
#if (configUSE_TICK_HOOK == 1)
__WEAK void vApplicationTickHook (void){}
#endif
在cubemx生成的freertos.c
中,重新void定义了vApplicationTickHook
,那么它就会替代掉上面定义的weak函数。
你可以在这个函数中填充你的代码了,例如产生500次 tick hook 回调,即1000ms,就翻转一次LED灯,就又实现了LED闪烁的功能。
危险
请不要在Hook函数中使用阻塞的函数!!
c
void vApplicationTickHook( void )
{
// 你的代码
static uint16_t timecount=0;
timecount += 1;
if(timecount>500)
{
timecount = 0;
HAL_GPIO_TogglePin(LED_T_GPIO_Port, LED_T_Pin);
}
}
学会使用TickHook,再次实现呼吸灯~