FreeRTOS原理剖析:系统节拍时钟分析

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值