|
任务的恢复运行就比较好理解了.$ `$ p7 s! o0 ]+ ^4 n
CPU 还在系统模式下.程序从任务控制块中得到任务的堆栈指针.(OSIntCtxSw_1 的第一句)将这个指针的值加上一定的偏移量保存到 SP 中.为什么要加上一定 的偏移量呢 因为这时任务的堆栈中除了保存任务运行时的数据外还保存了任务的上下文,即任 务切换时保存的 CPU 寄存器等内容.而我们恢复任务等一下是在管理模式下进行的,用的是管理模式的堆栈指针.等恢复任务后 CPU 就开始执行任务
' J! G0 y) z& }; F! c代码了.我们已经没有机会再修改系统模式下的 SP 值了.所以在这个时候就应该对 SP进行调整.调整的大小就应该是所保存的上下文占用的大小.从堆栈中恢复 LR 的值.同样的道理,管理模式和系统模式使用不同的 LR,在切换到管理模式之前,必须先在系统模式下恢复任务运行时的 LR.(OSIntCtxSw_1 的第三句)接下来就切换到管理模式了.(OSIntCtxSw_1 的第四句)使管理模式 SP 指向任务堆栈(第五句)注意这是没调整过的任务 SP,也就是保存了上下文环境的 SP.
" k4 b* p. E+ p接下来的事情就真的很简单了.从堆栈中恢复出保存的东西.先是 OSEnterSum,然后是任务的 CPSR (注意任务的 CPSR 就是进入 SWI 时由 CPU 自动保存到管理模式的 SPSR中的,所以此时也是恢复到管理模式的 SPSR 中)最后一句就是典型的中断返回语句了.
0 ^+ h3 Q+ p( m$ t- l# U6 ?5 T恢复寄存器,恢复 PC,加了一个^号意味着同时将 SPSR 拷贝到 CPSR 中. |
|