void OSStart (void)
{
INT8U y;
INT8U x;
if (OSRunning == FALSE) {
y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
x = OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy(); /* Execute target specific code to start task */
}
}
首先判断若OSRunning 为假,注意此刻OSRunning为假。如果为假,就找出就绪表里的就绪任务的最高优先级,并放入OSPrioHighRdy 里,然后赋给表征表征当前任务优先级的变量OSPrioCur ;然后通过优先级在OSTCBPrioTbl数组里找到最高优先级的任务控制块,并把这个任务控制块交给当前任务控制块OSTCBCur管理,也就是最高优先级的任务成为了当前的任务;然后调用函数OSStartHighRdy( );
OSStartHighRdy( )是位于OS_CPU_A.S里的一段汇编程序,代码如下:
OSStartHighRdy
LDR r0,=OSRunning
MOV r1, #1
STRB r1, [r0] ;这三句指令将OSRunning设置为1
; LDR r4, addr_OSTCBCur ;这句指令源程序中作了屏蔽,和下句指令的作用是一样的
LDR r5, addr_OSTCBHighRdy ;把最高优先级的任务控制块的地址给了寄存器;r5=0x0c01322c
LDR r5, [r5] ;r5=0x0c013404
LDR sp, [r5] ;sp=0x0c016c68,sp 指向当前任务的堆栈
; STR r5, [r4] ;这句话源程序中被屏蔽掉
LDMFD sp!,{r4} ;数据出栈,放入r4中
MSR CPSR_cxsf, r4 ; CPSR should be SVC32Mode Panel;
LDMFD sp!, {r0-r12, lr, pc } ;数据出栈,分别放入r0——r12,lr,pc寄存器中,也就是新的任务获得了cpu使 使用权
下面程序就去执行获得了cpu使用权的任务。
;MSR是写状态寄存器指令,在ARM处理器中,只有MSR指令可以直接设置状态寄存器CPSR或者SPSR,cxs分别表示CPSR的0-7,8-15,16-23,24-31位。只有在特权模式下才能修改状态寄存器