时钟节拍类似于人体心脏的跳动,人体依赖心脏的跳动将血液输入身体各个部位,支撑生命活动。时钟节拍的是操作系统的时基,操作系统依赖于时钟节拍推动 CPU 去执行指令。
1 时钟节拍原理
时钟节拍是系统以固定的频率产生中断(时基中断),并在中断处理与时间相关的事件,推动所有任务向前运行。时钟节拍需要依赖于硬件定时器,STM32 通常使用 systick 时钟作为 MCU 的内核定时器。
2 系统时钟初始化
初始化流程
void BSP_Tick_Init (void)
{
CPU_INT32U cpu_clk_freq;
CPU_INT32U cnts;
//获取CPU内核时钟频率(SysTick 工作时钟)
cpu_clk_freq = BSP_CPU_ClkFreq();
//根据用户设置的时钟节拍频率计算 SysTick 定时器的计数值
#if (OS_VERSION >= 30000u)
/* Determine nbr SysTick increments */
cnts = (cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz);
#else
/* Determine nbr SysTick increments. */
cnts = (cpu_clk_freq / (CPU_INT32U)OS_TICKS_PER_SEC);
#endif
//调用 SysTick 初始化函数,设定定时器的计数值,并启动定时器
/* Init uC/OS periodic time src (SysTick). */
OS_CPU_SysTickInit(cnts);
}
3 系统时钟中断管理
根据系统时钟的初始化,在系统计数达到后,产生时钟中断,并调用中断处理函数 OS_CPU_SysTickHandler。
/*
*********************************************************************************************************
* SYS TICK HANDLER
*
* Description: Handle the system tick (SysTick) interrupt, which is used to generate the uC/OS-II tick
* interrupt.
*
* Arguments : None.
*
* Note(s) : 1) This function MUST be placed on entry 15 of the Cortex-M3 vector table.
*********************************************************************************************************
*/
void OS_CPU_SysTickHandler (void)
{
CPU_SR_ALLOC(); //分配保存中断状态的局部变量,后面关中断的时候可以保存中断状态
//ISR表示 interrupt service routine
//CPU_CRITICAL_ENTER 和 CPU_CRITICAL_EXIT 之间形成临界区,避免期间程序运