侵权投诉
订阅
纠错
加入自媒体

uc/os任务切换分析

2010-12-06 21:59
络遇
关注

  1、 SoftwareInterrupt的编写

  当发生软件中断时,程序通过异常向量表跳转到软中断的汇编与C接口程序SoftwareInterrupt处,下图为SoftwareInterrupt的流程图。

  程序:

  SoftwareInterrupt

  LDR SP, StackSvc ; 重新设置堆栈指针,堆栈指向的是SVC模式下的堆栈

  STMFD SP!,{R0-R3,R12,LR}

  STMFD SP!, {R0-R3, R12, LR} ;此时R0-R3, R12,在svc和用户模式下都是同一物理地址,lr为svc下的寄存器,保存着中断返回地址

  MOV R1, SP ; R1指向参数存储位置(svc下的堆栈指针地址)

  这个不知道用在哪??

  MRS R3, SPSR ;R3中放SWI前的CPSR(即被中断的任务的cpsr),在切换函数中用到

  TST R3, #T_bit ; 中断前是否是Thumb状态

  LDRNEH R0, [LR,#-2] ; 是: 取得Thumb状态SWI号

  BICNE R0, R0, #0xff00

  LDREQ R0, [LR,#-4] ; 否: 取得arm状态SWI号

  BICEQ R0, R0, #0xFF000000

  ; r0 = SWI号,R1指向参数存储位置

  CMP R0, #1

  LDRLO PC, =OSIntCtxSw

  LDREQ PC, =__OSStartHighRdy ; SWI 0x01为第一次任务切换

  BL SWI_Exception

  LDMFD SP!,{R0-R3,R12,PC}^;

  LDMFD SP!, {R0-R3, R12, PC}^ R12处的上一堆栈指针(&R12+4)存放的为LR,所以就把LR装入PC

  分析:因为执行任务切换时(执行新任务)堆栈指针会指向用户的堆栈,这样下一次进入管理模式(在osintctxsw中就会用到管理模式)就会破坏用户堆栈,从而导致程序执行不正确。所以程序在一开始设置堆栈指针。软中断指令使处理器进入管理模式,而用户程序处于系统/用户模式,其它异常也有自己的处理器模式,都有各自的堆栈指针,不会因为给堆栈指针赋值而破坏其它处理器模式的堆栈而影响其它程序的执行。返回的地址已经存储在连接寄存器LR中而不是存储在堆栈中。由于进人管理模式自动关中断,所以这段程序不会被其它程序同时调用,设置的堆栈指针指向的位置肯定是空闲位置,后一次调用不会影响前一次调用。这样就可以保证“LDR SP, StackSvc”进行正确的堆栈指针设置。

  因为ARM处理器核具有两个指令集,在执行Thumb指令的状态时不是所有寄存器都可见(参考ARM的相关资料),而且任务又可能不在特权模式(不能改变CPSR)。为了兼容任意一种模式,本移植使用软中断指令SWI使处理器进入管理模式和ARM指令状态,并使用功能0实现OS_TASK_SW()的功能,

  附: (1)LR没有入栈:

  从SWI和Undef异常返回时使用:

  movs pc, LR;

   从FIQ、IRQ和预取终止返回时使用:

  SUBS PC, LR,#4;

   从数据异常返回时使用:

  SUBS PC, LR,#8

  (2)LR有入栈:

  在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM “∧”,达到同样效果。 例如:

  LDMFD SP!, {PC}∧

  2 、OSIntCtxSw的编写:

  在μC/OS-Ⅱ中,任务切换只是简单的将处理器寄存器保存到将被挂起的任务的堆栈中,并且将更高优先级的任务从堆栈中恢复出来。处于就绪状态的任务的堆栈结构看起来就像刚发生过中断并将所有的寄存器保存到堆栈中的情形一样。换句话说,μC/OS-Ⅱ要运行处于就绪状态的任务必须要做的事就是将所有处理器寄存器从任务堆栈中恢复出来,并且执行中断的返回。

  在μC/OS-Ⅱ中,用户级任务调度时会调用宏(或者函数)OS_TASK_SW(),它是在μC/OS-Ⅱ从低优先级任务切换到最高优先级任务时被调用的,μC/OS-Ⅱ建议OS_TASK_SW()通过某种途径最终调用函数OSCtxSw()。函数OSCtxSw()是与系统相关的,μC/OS-Ⅱ提供的OSCtxSw()函数原型如下:

 

1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号