关于UCOS-II中任务切换函数OSIntctxswio()的汇编解析

Q: 新旧任务级的切换是不是必须在管理模式下切换   切换后新任务的运行是不是必须在管

   理模式下

A: 在配套《ARM 微控制器基础与实战》里的任务切换是通过 SWI 实现的.SWI 会使 CPU 进入

   管理模式.同时 CPU 自动将任务的 CPSR 保存到管理模式的 SPSR 中.  

   SWI 程序还保存了一些寄存器到管理模式的堆栈中.然后任务切换程序会在管理模式

   和系统模式间来回切换,目的是把保存在管理模式堆栈的寄存器内容拷贝到任务的堆栈

   中(注意:任务是运   行在用户模式或系统模式的,这两个模式使用同一个 SP,这时的

   系统模式的 SP 指向的就是任务的堆栈),也会将管理模式的 SPSR 拷贝到任务堆栈(注意

   管理模式的 SPSR 就是在执行 SWI 时 CPU 自动保存的任务运行时的 CPSR,它记录了任务

   运行的 CPU 模式和其他的运行状态信息).最后把任务模式 SP 保存到任务的任务控制块

   中(注意此时 CPU 已经是运行在系统模式下的了).以上大致就是 uC/OS-II 中所说的保

   存任务运行环境的工作.  

       任务的恢复运行就比较好理解了.  

  接着前面的说,CPU 还在系统模式下.程序从任务控制块中得到任务的堆栈指针.  

  (OSIntCtxSw_1 的第一句)将这个指针的值加上一定的偏移量保存到 SP 中.为什么要

   加上一定     的偏移量呢   因为这时任务的堆栈中除了保存任务运行时的数据外还保存

   了任务的上下文,即任   务切换时保存的 CPU 寄存器等内容.而我们恢复任务等一下是

   在管理模式下进行的,用的是管理模式的堆栈指针.等恢复任务后 CPU 就开始执行任务

   29

   代码了.我们已经没有机会再修改系统模式下的 SP 值了.所以在这个时候就应该对 SP

   进行调整.调整的大小就应该是所保存的上下文占用的大小.从堆栈中恢复 LR 的值.同

   样的道理,管理模式和系统模式使用不同的 LR,在切换到管理模式之前,必须先在系统

   模式下恢复任务运行时的 LR.(OSIntCtxSw_1 的第三句)接下来就切换到管理模式了.

   (OSIntCtxSw_1 的第四句)使管理模式 SP 指向任务堆栈(第五句)注意这是没调整过

   的任务 SP,也就是保存了上下文环境的 SP.  

    接下来的事情就真的很简单了.从堆栈中恢复出保存的东西.先是 OSEnterSum,然后是

    任务的 CPSR (注意任务的 CPSR 就是进入 SWI 时由 CPU 自动保存到管理模式的 SPSR

    中的,所以此时也是恢复到管理模式的 SPSR 中)最后一句就是典型的中断返回语句了.

    恢复寄存器,恢复 PC,加了一个^号意味着同时将 SPSR 拷贝到 CPSR 中.  

    现在是回答你的问题的时候了.  

    切换前任务是运行在什么环境下的(包括 CPU 模式,所有的寄存器),任务切换后任务就

      是运行在    什么环境下的.对任务来说,什么也没改变.只有 PC 值指向了下一条指令

posted @ 2009-09-30 16:47  gmh  阅读(1439)  评论(0编辑  收藏  举报