Skip to content

我们直接打开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,再次实现呼吸灯~