当前位置:   article > 正文

OSStartHighRdy()

osstarthighrdy
  1. µC/OS-II 的移植需要用户改写OS_CPU_A.ASM中的四个函数:
  2. OSStartHighRdy()
  3. OSCtxSw()
  4. OSIntCtxSw()
  5. OSTickISR()
  1. 该函数由SStart()函数调用,功能是运行优先级最高的就绪任务,在调用OSStart()之前,用户必须先调用OSInit(),并且已经至少创建了一个任务(请参考OSTaskCreate()和OSTaskCreateExt()函数)。OSStartHighRdy()默认指针OSTCBHighRdy指向优先级最高就绪任务的任务控制块(OS_TCB)(在这之前OSTCBHighRdy已由OSStart()设置好了)。图F9.3给出了由函数OSTaskCreate()或 OSTaskCreateExt()创建的任务的堆栈结构。很明显,OSTCBHighRdy->OSTCBStkPtr指向的是任务堆栈的顶端。
  2. 函数OSStartHighRdy()的代码见程序清单L9.3

  1. 为了启动任务,OSStartHighRdy()从任务控制块(OS_TCB)[程序清单L9.3(1)]中找到指向堆栈的指针,然后运行POP DS [程序清单L9.3(2)], POP ES [程序清单L9.3(3)], POPA [程序清单L9.3(4)], 和 IRET [程序清单L9.3(5)]指令。此处笔者将任务堆栈指针保存在任务控制块的开头,这样使得堆栈指针的存取在汇编语言中更容易操作。
  2. 当执行了IRET指令后,CPU会从(SS:SP)指向的堆栈中恢复各个寄存器的值并执行中断前的指令。SS:SP+4指向传递给任务的参数pdata。

  1. 程序清单L 9.3 OSStartHighRdy().
  2. _OSStartHighRdy PROC FAR
  3. MOV AX, SEG _OSTCBHighRdy ; 载入 DS
  4. MOV DS, AX ;
  5. LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr (1)
  6. MOV SS, ES:[BX+2] ;
  7. MOV SP, ES:[BX+0] ;
  8. ;
  9. POP DS ; 恢复任务环境 (2)
  10. POP ES ; (3)
  11. POPA ; (4)
  12. ;
  13. IRET ; 运行任务 (5)
  14. _OSStartHighRdy ENDP


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/406339
推荐阅读
相关标签
  

闽ICP备14008679号