1. 系统节拍时钟相关的API函数
函数 | 描述 |
---|---|
SysTick_Handler() | 系统节拍中断服务函数,即SysTick定时器中断函数 |
xPortSysTickHandler() | 调用函数xTaskIncrementTick(),根据其返回值判断是否触发PendSV中断 |
xTaskIncrementTick() | 系统节拍中断服务函数最终调用该函数完成主要工作,主要是判断下一个阻塞任务是否超时和是否需要进行任务切换等 |
2. 系统节拍时钟定时器
2.1 系统节拍时钟定时器SysTick介绍
在FreeRTOS中,系统的运行是由系统节拍时钟驱动的,同时任务的延时和阻塞都是以系统节拍时钟周期为单位,系统时钟节拍定时器使用的是SysTick定时器,在FreeRTOSConfig.h中需要设置:
#define configTICK_RATE_HZ (1000) //时钟节拍频率,这里设置为1000,周期就是1ms
在FreeRTOS中,系统节拍时钟周期为时钟节拍频率的导数,即T=1/f,比如设置时钟节拍频率为1000,则系统节拍时钟周期为1/1000(s),即为1ms。
2.2 系统节拍时钟定时器配置
在开启任务调度器时,会调用函数vTaskStartScheduler(),该函数会调用函数xPortStartScheduler()配置系统节拍定时器,如下:
BaseType_t xPortStartScheduler( void )
{
/*****************************************
此处省略部分代码
*****************************************/
/*
* 每个中断占据一个8位的优先级寄存器设置,数值越小,优先级越高
* 设置PendSV和SysTick中断的优先级为0xF0,即最低优先级
*/
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
/* 初始化系统节拍定时器,即系统的SysTick定时器 */
vPortSetupTimerInterrupt();
/*****************************************
此处省略部分代码
*****************************************/
return 0; /* 一般不会返回 */
}
可以知道,调用了portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI设置SysTick的中断优先级,其中:
#define portNVIC_SYSTICK_PRI ( ( ( uint32