EDA365电子论坛网
标题:
切换后新任务的运行是不是必须在管理模式下?
[打印本页]
作者:
Maskman
时间:
2022-12-29 10:10
标题:
切换后新任务的运行是不是必须在管理模式下?
新旧任务级的切换是不是必须在管理模式下切换,切换后新任务的运行是不是必须在管理模式下
6 V3 ]' j) u$ k( z1 v! d
作者:
Ele_insect
时间:
2022-12-29 11:27
在配套《ARM 微控制器基础与实战》里的任务切换是通过 SWI 实现的.SWI 会使 CPU 进入
( u. g0 n/ \) V; J
管理模式.同时 CPU 自动将任务的 CPSR 保存到管理模式的 SPSR 中.
2 P8 d& Q1 a9 Q D8 ^
SWI 程序还保存了一些寄存器到管理模式的堆栈中.然后任务切换程序会在管理模式
, _9 a, N$ {2 D. B
和系统模式间来回切换,目的是把保存在管理模式堆栈的寄存器内容拷贝到任务的堆栈
5 X, J2 ?6 ?% u6 C
中(注意:任务是运 行在用户模式或系统模式的,这两个模式使用同一个 SP,这时的
) ~2 B( v9 n( V8 V3 ]' M' l
系统模式的 SP 指向的就是任务的堆栈),也会将管理模式的 SPSR 拷贝到任务堆栈(注意
! E2 b$ J2 G8 p
管理模式的 SPSR 就是在执行 SWI 时 CPU 自动保存的任务运行时的 CPSR,它记录了任务
* d# R9 q n1 N1 U* h7 B
运行的 CPU 模式和其他的运行状态信息).最后把任务模式 SP 保存到任务的任务控制块
7 h/ n% o; H7 @2 i9 j7 w8 \
中(注意此时 CPU 已经是运行在系统模式下的了).以上大致就是 uC/OS-II 中所说的保
: c' Y; v9 J9 l3 \ T& O7 g; A0 U
存任务运行环境的工作.
作者:
dragongfly
时间:
2022-12-29 13:35
任务的恢复运行就比较好理解了.
8 Z2 D" N' [6 L0 r4 m
CPU 还在系统模式下.程序从任务控制块中得到任务的堆栈指针.(OSIntCtxSw_1 的第一句)将这个指针的值加上一定的偏移量保存到 SP 中.为什么要加上一定 的偏移量呢 因为这时任务的堆栈中除了保存任务运行时的数据外还保存了任务的上下文,即任 务切换时保存的 CPU 寄存器等内容.而我们恢复任务等一下是在管理模式下进行的,用的是管理模式的堆栈指针.等恢复任务后 CPU 就开始执行任务
8 e4 h- N$ u5 Y G
代码了.我们已经没有机会再修改系统模式下的 SP 值了.所以在这个时候就应该对 SP进行调整.调整的大小就应该是所保存的上下文占用的大小.从堆栈中恢复 LR 的值.同样的道理,管理模式和系统模式使用不同的 LR,在切换到管理模式之前,必须先在系统模式下恢复任务运行时的 LR.(OSIntCtxSw_1 的第三句)接下来就切换到管理模式了.(OSIntCtxSw_1 的第四句)使管理模式 SP 指向任务堆栈(第五句)注意这是没调整过的任务 SP,也就是保存了上下文环境的 SP.
1 X% g' d' p- s2 ^: u
接下来的事情就真的很简单了.从堆栈中恢复出保存的东西.先是 OSEnterSum,然后是任务的 CPSR (注意任务的 CPSR 就是进入 SWI 时由 CPU 自动保存到管理模式的 SPSR中的,所以此时也是恢复到管理模式的 SPSR 中)最后一句就是典型的中断返回语句了.
) j, x. { I8 ?5 r/ Y* F5 m* ~
恢复寄存器,恢复 PC,加了一个^号意味着同时将 SPSR 拷贝到 CPSR 中.
作者:
STGing
时间:
2022-12-29 13:48
回答问题:
+ ?- ]/ k9 c! L
切换前任务是运行在什么环境下的(包括 CPU 模式,所有的寄存器),任务切换后任务就是运行在 什么环境下的.对任务来说,什么也没改变.只有 PC 值指向了下一条指令,哈哈。
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2