- RTOS需要一个时基来驱动,系统任务调度的频率等于该时基的频率;通常该时基由一个定时器来提供,也可以从其它周期性的信号源获得
- Crotex-M内核中有一个系统定时器SysTick,它内嵌在NVIC中,是一个24位的递减计算器,每计数一次时间为:1/SysClk;
- 当重载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,如此循环往复;
- SysTick寄存器介绍:
- 初始化与裸机例程相同,暂不做详细介绍;
- 中断内放入调度函数OSSched();
- 例程:
/********************************************************* * 函数名:void SysTick_Handler(void); * 描述 :中断,任务切换 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ void SysTick_Handler(void) { OSTimeTick(); //时间片函数; 调度任务 } /********************************************************* * 函数名:OSTimeTick(void) * 描述 :调用任务调度函数 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ void OSTimeTick(void) { OSSched(); //任务调度 } /********************************************************* * 函数名:void OS_CPU_SysTickInit(CPU_INT32U ms); * 描述 :设置中断频率为10ms * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ void OS_CPU_SysTickInit(CPU_INT32U ms) { //设置重装载寄存器的值 SysTick->LOAD = ms * SystemCoreClock / 1000 - 1; //配置中断优先级为最低 NVIC_SetPriority(SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //复位当前计数器的值 SysTick->VAL = 0; //选择时钟源、使能中断、使能计数器 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk| SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; } int main(void) { OS_ERR err; CPU_IntDis(); OS_CPU_SysTickInit(10); OSInit(&err); //初始化相关的全局变量 OSTaskCreate( (OS_TCB *) &Task1TCB, (OS_TASK_PTR) Task1, (void *) 0, (CPU_STK*) &Task1Stk[0], (CPU_STK_SIZE) TASK1_STK_SIZE, (OS_ERR *) &err ); OSTaskCreate( (OS_TCB *) &Task2TCB, (OS_TASK_PTR) Task2, (void *) 0, (CPU_STK*) &Task2Stk[0], (CPU_STK_SIZE) TASK2_STK_SIZE, (OS_ERR *) &err ); OSRdyList[0].HeadPtr = &Task1TCB; OSRdyList[1].HeadPtr = &Task2TCB; OSStrart(&err); //启动OS,无返回值 } void delay(uint32_t count) { for(;count!=0;count--); } void Task1(void *parg) { for(;;) { flag1 = 0; delay(100); flag1 = 1; delay(100); // OSSched(); } } void Task2(void *parg) { for(;;) { flag2 = 0; delay(100); flag2 = 1; delay(100); // OSSched(); } }
- 总结:
- 中断是RTOS处理异常事件的重要机制;
- 为了处理任务延时、调度等一些与时间有关的事件,任何一个RTOS都应该有一个系统时钟;
- SysTick是嵌套在内核中的,所以使得OS在Crotex-M中编写的定时器代码不必修改,移植工作相对简单;
- 中断的频率决定CPU的调度越高、系统的负荷就越重;一直在不断的进入中断;任务的执行时间就减小;
- uC/OS-III官方推荐的为10ms;或者高点也可以; 本例程采用10ms的中断频率;
【12】从0到1教你写uC/OS-III————>时间片
最新推荐文章于 2020-04-19 21:41:37 发布