在rtthread中,任务调度是发生在tick定时中断,在中断中会处理任务的调度工作
一、rtt 使用rt_system_scheduler_start这个接口启动任务调度。那么是在什么时候使能的定时tick中断的呢?
如果任务调度启动之前产生定时中断,可能会使得该任务的第一次运行时间片减少,也可能会出现获取到错误的线程指针,导致访问线程数据出错发生异常
如果任务启动之后在去产生或者使能定时器中断,这个就要在任务中进行开启中断,因为rtt在启动调度的时候,就会跳转到最高优先级任务中去。但是这样做也不通用,而且也会带来一些不确定因素
二、RTT如何实现在启动调度运行第一个任务的同时开启定时中断?
仔细阅读跟踪代码发现,在切换到第一个任务时候,使用的api是rt_hw_context_switch_to,阅读其源代码,可以发现在最后一句,通过恢复PC LR跳转到目标任务,于此同时设置了SPSR寄存器。所以在跳转时硬件也会把SPSR寄存器恢复到CPCR寄存器中。此时的CPCR设置中开启了处理器全局中断。所以达到了跳转到第一个任务的同时启动定时器,任务调度
ldmfd sp!, {r1}
msr spsr_cxsf, r1 /* original mode /
ldmfd sp!, {r0-r12,lr,pc}^ / irq return */
原作者:jhb
|