uC/OS-II学习中的常见问题
来源:互联网 发布:移动网络电视怎么样 编辑:程序博客网 时间:2024/05/18 03:38
如何切换任务
uC/OS多任务的原理是,在某个任务重新获得CPU控制权的时候,先把上一个执行的任务的所有寄存器以及它的返回地址保存起来,然后把现在要执行的任务的所有变量恢复到操作寄存器里,然后使PC指向这个任务的处理函数。而保存和恢复变量的重要媒介就是每个任务独有的堆栈空间,这点跟中断处理的过程几乎一样,重新获得CPU的任务可以看成是中断函数,原先执行的看成是被中断的函数,只不过uC/OS是模拟中断来切换任务,所有堆栈的保存和恢复要在移植不同处理器的时候根据实际情况来完成,目的只有一个,就是模拟中断的压栈和出栈操作。
uC/OS引起任务切换的功能函数主要是两个,任务级的切换是OSSched(),中断级的切换由OSIntExit()完成。而前者中真正实现切换操作的是OS_TASK_SW()宏,后者真正实现切换功能的是OSIntCtxSw(),这个宏如何实现,移植不同的处理器有不同的处理方法,目的仍然是,把现场处理的跟真正发生了中断一样,该保存的保存,该恢复的恢复。
因此可以得到,uC/OS切换任务时可以有两种方法,第一种是拥有CPU控制权的任务主动调用函数OSTimeDly()、OSTaskSuspend()等这类函数把控制权交出来,重新分配给下一个优先级高的任务,实际上是依靠OSSched()调度任务。第二种方法是CPU产生中断,把当前任务的控制权剥夺掉,令它挂起,从而使下一优先级的任务得以执行,当然,如果中断没有令当前任务挂起,中断返回后它依然是最高优先级的话,CPU将继续被它控制。
如何查找最高优先级
uC/OS把一个字节可能的256个值的所有优先级状况都做成一个表OSUnMapTbl[ ],比如,如果字节的值为7,即0000 0111,那么任务0,1,2都处于就绪态,最高优先级当然是0,那么OSUnMapTbl[7] == 0,因此,先通过y = OSUnMapTbl[OSRdyGrp]找到最高优先级的组y,然后通过x = OSUnMapTbl[OSRdyTbl[OSRdyGrp]]得到这个组里的最高优先级任务号x。因为uC/OS最大任务数不超过64,可以把优先级数看成是一个六位的二进制数,高三位表示所在组,低三位表示组内的号,因此y<<3+x就是找到的最高优先级数了,实在佩服OSUnMapTbl[ ]的设计。
(未完待续)
- uC/OS-II学习中的常见问题
- uC/OS-II 中的任务
- uc/os II 学习感受
- UC/OS-II的学习
- uC/OS-II学习总结
- UC/OS-II学习小结
- uC/OS-II学习1
- UC/OS-II学习 2
- UC/OS-II学习3
- uC/OS II 学习笔记
- uC/OS - II学习记录
- uC/OS-II中的消息邮箱
- uC/OS-II中的消息邮箱
- uC/OS-II中的全局变量声明
- 【求助】uC/OS-II中的一些疑问
- uC/OS-II中的任务管理
- uC/OS - II中的代码技巧
- uc/os-II中的任务(1)
- Perl学习之哈希hash
- javascript 客户端 生成 MD5值
- uC/OS-II常用数据量定义
- I2C与SMBUS区别,及smbus实例
- nachos资料
- uC/OS-II学习中的常见问题
- 重构(Ruby版)
- MyEclipse 快捷键全
- RS-485总线通信系统的可靠性措施
- 纪念我的失业时段
- net use与net view 简单用例
- 用C#调用Windows API和其它进程通信
- css页面布局和导航示例
- Half Life2 Displacement Terrain System