UCOS III任务切换
来源:互联网 发布:apache ant.jar maven 编辑:程序博客网 时间:2024/04/30 04:55
了解下关于其核心的“任务切换”相关内容,网上搜录如下文章,以便理解。
-----------------------------------------------------------------------------------///
(1)任务级的任务切换原理
μC/OS-II是一个多任务的操作系统,在没有用户自己定义的中断情况下,任务间的切换步骤是这样的:任务间的切换一般会调用OSSched()函数。函数的结构如下:
void OSSched(void){
关中断
如果(不是中断嵌套并且系统可以被调度){
确定优先级最高的任务
如果(最高级的任务不是当前的任务){
调用OSCtxSw();
}
}
开中断
}
我们把这个函数称作任务调度的前导函数。它先判断要进行任务切换的条件,如果条件允许进行任务调度,则调用OSCtxSw()。这个函数是真正实现任务调度的函数。由于期间要对堆栈进行操作,所以OSCtxSw()一般用汇编语言写成。它将正在运行的任务的CPU的SR寄存器推入堆栈,然后把R4~R15压栈。接着把当前的SP保存在TCB->OSTCBStkPtr中,然后把最高优先级的TCB->OSTCBStkPtr的值赋值给SP。这时候,SP就已经指到最高优先级任务的任务堆栈了。然后进行出栈工作,把R15~R4出栈。接着使用RETI返回,这样就把SR和PC出栈了。简单地说,μC/OS-II切换到最高优先级的任务,只是恢复最高优先级任务所有的寄存器并运行中断返回指令(RETI),实际上,所作的只是人为地模仿了一次中断。
μC/OS-II的中断服务子程序和一般前后台的操作有少许不同,往往需要这样操作:
保存全部CPU寄存器
调用OSIntEnter()或OSIntNesting++
开放中断
执行用户代码
关闭中断
调用OSIntExit();
恢复所有CPU寄存器
RETI
OSIntEnter()就是将全局变量OSIntNesting加1。OSIntNesting是中断嵌套层数的变量。μC/OS-II通过它确保在中断嵌套的时候,不进行任务调度。执行完用户的代码后,μC/OS-II调用OSIntExit(),一个与OSSched()很像的函数。在这个函数中,系统首先把OSIntNesting减1,然后判断是否中断嵌套。如果不是的话,并且当前任务不是最高优先级的任务,那么找到优先级最高的任务,执行OSIntCtxSw()这一出中断任务切换函数。因为,在这之前已经做好了压栈工作;在这个函数中,要进行R15~R4的出栈工作。而且,由于在之前调用函数的时候,可能已经有一些寄存器被压入了堆栈。所以要进行堆栈指针的调整,使得能够从正确的位置出栈。
0 0
- UCOS III任务切换
- uCOS-III任务延时全过程
- ucos(一) 任务切换
- ucos的任务切换
- ucos系统任务切换过程
- ucos-iii学习之上下文切换
- uCOS-III的任务状态详解
- uCOS-III笔记之任务创建
- ucos-iii学习之单任务应用程序
- ucos-iii学习之任务管理
- ucos-iii学习之任务优先级
- ucos-iii学习之内部任务管理
- ucos-iii学习之系统内部任务
- 浅谈uCOS任务栈及任务切换
- STM32中uCOS的任务切换讨论
- uCOS-II中的任务切换机制(转)
- uCOS-II中的任务切换机制
- uCOS-II中的任务切换机制(转)
- c++实验4-分数的累加
- 关于页面显示乱码问题
- 公倍数
- StuQ 技能图谱(全套13张)
- 多线程 - dispatch_barrier_async 使用及解析
- UCOS III任务切换
- Spark的RDD检查点实现分析
- 70. Climbing Stairs
- Selenium2 Python 自动化测试实战学习笔记(八)
- 关于AES的使用
- c++实验4—分数的累加
- void与void*详解
- Linux---git的常用命令以及在github上获取,上传代码
- PHP 高并发、抢票、秒杀 解决方案