[uCOS/uCGUI] UCOS 中的任务切换问题

yjkally   2009-10-8 08:45 楼主
UCOS任务切换用的是汇编代码,看不太懂


  1. #define  uCOS                 0x80                    /* Interrupt vector # used for context switch    */

  2. #define  OS_TASK_SW()         asm  INT   uCOS


基于PC的汇编代码


  1. _OSCtxSw    PROC   FAR
  2. ;
  3.             PUSHA                                  ; Save current task's context
  4.             PUSH   ES                              ;
  5.             PUSH   DS                              ;
  6. ;
  7.             MOV    AX, SEG _OSTCBCur               ; Reload DS in case it was altered
  8.             MOV    DS, AX                          ;
  9. ;
  10.             LES    BX, DWORD PTR DS:_OSTCBCur      ; OSTCBCur->OSTCBStkPtr = SS:SP
  11.             MOV    ES:[BX+2], SS                   ;
  12.             MOV    ES:[BX+0], SP                   ;
  13. ;
  14.             CALL   FAR PTR _OSTaskSwHook           ; Call user defined task switch hook
  15. ;
  16.             MOV    AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy
  17.             MOV    DX, WORD PTR DS:_OSTCBHighRdy   ;
  18.             MOV    WORD PTR DS:_OSTCBCur+2, AX     ;
  19.             MOV    WORD PTR DS:_OSTCBCur, DX       ;
  20. ;
  21.             MOV    AL, BYTE PTR DS:_OSPrioHighRdy  ; OSPrioCur = OSPrioHighRdy
  22.             MOV    BYTE PTR DS:_OSPrioCur, AL      ;
  23. ;
  24.             LES    BX, DWORD PTR DS:_OSTCBHighRdy  ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
  25.             MOV    SS, ES:[BX+2]                   ;
  26.             MOV    SP, ES:[BX]                     ;
  27. ;
  28.             POP    DS                              ; Load new task's context
  29.             POP    ES                              ;
  30.             POPA                                   ;
  31. ;
  32.             IRET                                   ; Return to new task
  33. ;
  34. _OSCtxSw    ENDP

  35.             PAGE                                   ; /*$PAGE*/


看它的意思好像是调用了0x80的中断,然后不知道怎么跑的了?汇编代码也看不太懂。。。

回复评论 (4)

帮顶一下.

低级的CPU(ARM7或更低)是不是按时间片(固定时间)自动进行任务切换的? 请指正.
点赞  2009-10-8 09:10
楼主是在X86的PC上跑的?
点赞  2009-10-8 09:42
貌似找到设置中断向量的地方了

  1. PC_VectSet(uCOS, OSCtxSw);    /* Install uC/OS-II's context switch vector */


  2. void PC_VectSet (INT8U vect, void (*isr)(void))
  3. {
  4. #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
  5.     OS_CPU_SR  cpu_sr;
  6. #endif   
  7.     INT16U    *pvect;
  8.    
  9.    
  10.     pvect    = (INT16U *)MK_FP(0x0000, vect * 4);     /* Point into IVT at desired vector location     */
  11.     OS_ENTER_CRITICAL();
  12.     *pvect++ = (INT16U)FP_OFF(isr);                   /* Store ISR offset                              */
  13.     *pvect   = (INT16U)FP_SEG(isr);                   /* Store ISR segment                             */
  14.     OS_EXIT_CRITICAL();
  15. }



看了好几天UCOS了,还是感觉乱乱的,感觉看到汇编的代码有点怕。。。
大家学UCOS的时候有没有什么好的方法?
点赞  2009-10-8 10:04
引用: 引用 2 楼 pigeon0411 的回复:
楼主是在X86的PC上跑的?

是啊,在PC上,用的BC45编译和调试的。主要是为了学习一下操作系统。
点赞  2009-10-8 10:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复