3568|4

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

UCOS 中的任务切换问题 [复制链接]

 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的中断,然后不知道怎么跑的了?汇编代码也看不太懂。。。

最新回复

是啊,在PC上,用的BC45编译和调试的。主要是为了学习一下操作系统。  详情 回复 发表于 2009-10-8 10:08
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帮顶一下.

低级的CPU(ARM7或更低)是不是按时间片(固定时间)自动进行任务切换的? 请指正.
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主是在X86的PC上跑的?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
貌似找到设置中断向量的地方了

  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的时候有没有什么好的方法?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 pigeon0411 的回复:
楼主是在X86的PC上跑的?

是啊,在PC上,用的BC45编译和调试的。主要是为了学习一下操作系统。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表