一 定义
当UCOS-III转向执行另一项新任务的时候,他保存了当前任务的CPU寄存器到堆栈,并从新任务的堆栈CPU寄存器载入CPU,这个过程叫做上下文切换
上下文切换需要一些开支,CPU的寄存器越多,开支越大。上下文切换的时间基本取决于有多少个CPU寄存器需要被存储和载入。上下文切换的代码是移植UCOS -II 时编写的,该部分代码要适用于处理器,这些代码被放在C和汇编文件中: OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM。移植部分在下面会详细介绍,根据不同的CPU架构,移植的时候需要注意很多不部分细节。我们先来看一下常见CPU的结构:包含16个整数寄存器(R0~R15)和一个中断堆栈寄存器和状态寄存器。每个寄存器都是32位的,16个整数寄存器都是可以存储数据或者地址,指令指针寄存器是R15,两个堆栈指针是R14和R14‘,其实R14是指向任务的堆栈的指针TSP,R14’是指向ISR的堆栈的指针ISP。当CPU接收到一个中断的时候自动切换到ISR堆栈(也就是说CPU有独立用于处理中断的堆栈)在uC/OS-III 中,任务切换时的堆栈设置类似于中断发生时的那样,所有的CPU 寄存器都被保存。我们假定任务堆栈中的信息将要被载入到CPU 中,TSP 指向任务堆栈中最后一个被保存的寄存器。程序指针寄存器和状态寄存器是最先被保存在任务堆栈中。事实上,当中断发生时这些是被CPU 自动执行的。其它的寄存器通过软件被压入任务堆栈, TSP 不会被保存到堆栈,但会被保存到任务的TCB。ISP 指向当前中断堆栈的顶部。当中断服务程序被执行时,处理器把 R14“作为堆栈指针用于指向函数和局部参数。有两种上下文切换的方式:一个是任务级的,一个是中断级的,任务级切换时通过OSCtxSW()实现的,实际上它是被 OS_TASK_SW宏调用的中断级切换是通过调用OSIntCtxSw()实现。它是用汇编语言写的,保存于OS_CPU_A.ASM。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !