void OSStart (void)

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位。只有在特权模式下才能修改状态寄存器


 

你可能感兴趣的:(void OSStart (void))