13.0-uC/OS-III上下文切换

1.当uC/OS-III转向执行另一个任务的时候,它保存了当前任务的
CPU寄存器到堆栈。并从新任务的的堆栈中CPU寄存器载入CPU
这个过程叫做上下文切换。

上下文切换需要一些开支。 CPU的寄存器越多, 开支越大。

上下文切换部分的代码是移植uC/OS-III时需编写的。该部分代码
要适用于处理器。这些代码被放在
C和汇编语言文件中: OS_CPU.H
OS_CPU_C.COS_CPU_A.ASM

2.uC/OS-III中,任务切换时的堆栈设置类似于中断发生时的那
样,所有的
CPU寄存器都被保存。我们假定任务堆栈中的信息将要
被载入到
CPU中,
 

TSP指向任务堆栈中最后一个被保存的寄存器。程序指针寄存器
和状态寄存器是最先被保存在任务堆栈中。事实上,当中断发生时这
些是被
CPU自动执行的。其它的寄存器通过软件被压入任务堆栈,
TSP不会被保存到堆栈,但会被保存到任务的TCB

ISP指向当前中断堆栈的顶部。当中断服务程序被执行时,处理
器把
R14"作为堆栈指针用于指向函数和局部参数。

3.有两种上下文切换方式:一个是任务级,一个是中断级。任务级
切换通过调用
OSCtxSw()实现,实际上它是被宏OS_TASK_SW()调用
的。
中断级切换通过调用OSIntCtxSw()实现。它是用汇编语言写的,

保存于OS_CPU_A.ASM

4.OSCtxSw()

当有一个高优先级就绪任务需要被执行,任务级调度器会调用
OSCtxSw()

5.OSIntCtxSw()

ISR中就绪了高优先级任务BISR返回时将不会回到中断前的任
A, 而是直接转向到执行高优先级任务B。 此时, 由于中断产生时
已经将任务
A的状态保存在任务A的堆栈中,所以ISR返回时无需
再保存任务
A的状态,而是直接载入任务BCPU寄存器到硬件
CPU寄存器中即可。

上下文切换包括两部分内容,保存旧任务的内容,载入新任务的
内容。
任务级切换时, 通过调用
OSSched()实现。 中断级切换时, 通过调
OSIntExit()实现。

OSSched()中调用OSCtxSw()实现上下文切换。 OSIntExit()中调用
OSIntCtxSw()实现上下文切换。然而, OSIntCtxSw()只需用做上下文
切换的第二部分,因为中断时被中断任务的
CPU寄存器已经被保存
到被中断任务的堆栈中了。

 

posted @ 2018-07-31 17:03  西贡小傻  Views(325)  Comments(0)    收藏  举报