之前一直看的都是linux,linux是非实时的操作系统,高优先级的任务不会立刻被调度,在linux中为了满足进程交互性的需求,发明了时间片,给所有任务都分配时间片,(后面再继续分析两种的不同。)
ucos是一种实时操作系统。 当一个高优先级的任务准备就绪后,它会立刻被调度,并且一直执行直到任务结束,或是任务被其他更高优先级的任务抢占,亦或是任务需要等待信号量而变成休眠状态。在ucos中没有时间片的概念。 当然,与linux类似,ucos也通过时钟的tick来驱动,每次时钟tick时,发生中断,中断函数结束时,就会进行任务切换,因为可能会有高优先级的任务变成了就绪状态,如果有就立刻运行更高优先级的任务。
下面具体分析。
1. 栈的初始化
首先,对于每一种处理模式,都有各自的sp指针(user模式和system模式是共用的)。在板子初始化时,会调用InitStacks
;function initializing stacks
InitStacks
;Don''t use DRAM,such as stmfd,ldmfd......
;SVCstack is initialized before
;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UndefStack ; UndefStack=0x33FF_5C00
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack ; AbortStack=0x33FF_6000
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=IRQStack ; IRQStack=0x33FF_7000
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode
ldr sp,=FIQStack ; FIQStack=0x33FF_8000
bic r0,r0,#MODEMASK|NOINT
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack ; SVCStack=0x33FF_5800
;USER mode has not be initialized.
mov pc,lr
;The LR register won''t be valid if the current mode is not SVC mode.
arm刚启动时,默认是svc模式,上面进行的工作就是通过msr 改变cpsr寄存器,从而进入不同的模式&#