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


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OSStart是UCOS-II中的一个函数,其作用是启动操作系统并开始任务调度。其源代码如下: ```c void OSStart(void) { #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0u; #endif OS_ENTER_CRITICAL(); /* Disable interrupts */ #if OS_TASK_CREATE_EXT_EN > 0u while (OSTaskCreateExt((void (*)(void *))OS_IdleTask, /* Create the Idle Task */ (void *)0, (OS_STK *)&OSIdleTaskStk[OS_IDLE_TASK_STK_SIZE - 1u], (INT8U )OS_IDLE_PRIO, (INT16U )OS_IDLE_PRIO, (OS_STK *)&OSIdleTaskStk[0u], (INT32U )OS_IDLE_TASK_STK_SIZE, (void *)0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR | OS_TASK_OPT_IDLE)) != OS_NO_ERR) { ; } #else OSTaskCreate((void (*)(void *))OS_IdleTask, /* Create the Idle Task */ (void *)0, (OS_STK *)&OSIdleTaskStk[OS_IDLE_TASK_STK_SIZE - 1u], (INT8U )OS_IDLE_PRIO); #endif #if OS_SCHED_LOCK_EN OSSchedLockTime = 0uL; /* Initialize locking time variable */ #endif OSRunning = OS_TRUE; /* OS is running */ OS_EXIT_CRITICAL(); /* Enable interrupts */ OS_Sched(); /* Start multitasking (i.e. give control to the scheduler) */ } ``` 该函数的主要作用是启动操作系统并开始任务调度,其中包括以下几个步骤: 1.通过宏定义判断是否需要分配存储CPU状态寄存器的空间。 2.禁止中断,进入临界区。 3.创建空闲任务,并分配其优先级。 4.初始化任务锁定时间变量。 5.将OSRunning设置为OS_TRUE,表示操作系统已经在运行。 6.退出临界区,允许中断。 7.调用OS_Sched函数开始任务调度。 需要注意的是,该函数在调用OS_Sched函数之前,必须先创建空闲任务,否则系统无法进行任务调度。同时,该函数还会关闭中断以确保系统的可靠性和实时性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值