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[ ]的设计。

 

(未完待续)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 智慧树选修挂科怎么办 军人被纠察抓了怎么办 我家的小孩很凶怎么办 10岁儿童老挤眼怎么办? 脚趾长鸡眼好痛怎么办 月加班超过36小时怎么办 月经老提前怎么办才好 20岁例假不规律怎么办 农村的医保门诊封顶了怎么办 保研夏令营被拒怎么办 小学生去英国游学怎么办签证 医生说我湿气重怎么办 喉咙痛有来医生感冒喉咙痛怎么办 暴马丁香叶子卷怎么办 房产权40年以后怎么办 面试回答不了考官的问题怎么办 轻伤事故对方要钱太多我怎么办 退休后有房子住公积金怎么办 江苏副高评过不聘怎么办 抗环瓜氨酸肽抗体高怎么办 脚被磨破了好痛怎么办 脚磨破皮肿了怎么办 脚磨破皮发炎了怎么办 3个月婴儿流口水怎么办 beats耳机被偷了怎么办 beats X耳机丢了怎么办 头戴耳机戴着热怎么办 长时间戴耳机耳朵疼怎么办 手表秒针走得声音很大怎么办 顾客总找老板剪头发怎么办 马来西亚国籍想去中国怎么办 有限元学位课挂了怎么办 五百丁简历导出后不一样怎么办 面试早到了1小时怎么办 头顶头发会越来越少怎么办 vr游戏过后想吐怎么办 win10电脑不能打汉字怎么办 手机看vr特别烫怎么办 苹果手机浏览器横屏怎么办 苹果笔记本浏览器没有了怎么办 剑与家园魔镜带错兵怎么办