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 值指向了下一条指令