uCOS 就续表详解
来源:互联网 发布:淘宝子账号哪里登陆 编辑:程序博客网 时间:2024/05/01 14:51
//发的博客,主要是自己的一些初短简介,如果有错误,希望能提高大侠的指点。 同时也是为了给正在学习者一点参考
1.预备知识
要想对 任务就绪表有详解,就要先知道这几个表:OSRdyGrp,OSRdyTbl,OSMapTbl,OSUnMapTbl(网上有多介绍这几张表,自己查)
2.任务进入就绪态
每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。//OSRdyGrp和OSRdyTbl 都是bit来标志,例如当新增任务时,任务级别:23.则OSRdyTbl表中,这一位为1.(其他任务未就绪)OSRdyGrp值:00000100;OSRdyTbl[2] = 1000000(bit)
OSRdyGrp和OSRdyTbl[]的关系见图3.3,是按以下规则给出的:
任务进入就绪态:
OSRdyGrp |= OSMapTbl[prio >> 3];
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
//由上面的说明,就可以明白 一个任务的优先级在怎么放在 就续表中的。
3.查找最高优先级任务
算法:
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
prio = (y << 3) + x;
举例:若OSRdyGrp的值为01101000(bit),OSRdyTbl[3]=11100100(bit),查表 3=OSUnMapTbl[0x68],
2=OSUnMapTbl[0xE4],
26 = (3 << 3 ) + 2
4.任务脱离就绪态:(其实就是 求反的处理 针对 任务就绪态而言)
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)
OSRdyGrp &= ~OSMapTbl[prio >> 3];
//为什么不用 任务进入就绪态的算法呢? 因为这里只是让一个 任务脱离就绪态,若同一组中任 仍有任务,OSRdyGrp 对应位仍然为1。 即如果对进入就绪态的算法求反,OSRdyGrp对应为就会为消失1,不管这一组其他任务。
如果第0组任何一个任务进入就绪态 -------->OSRdyGrp |= 00000001;
如果第1组任何一个任务进入就绪态 -------->OSRdyGrp |= 00000010;
如果第2组任何一个任务进入就绪态 -------->OSRdyGrp |= 00000100;
如果第3组任何一个任务进入就绪态 -------->OSRdyGrp |= 00001000;
如果第4组任何一个任务进入就绪态 -------->OSRdyGrp |= 00010000;
如果第5组任何一个任务进入就绪态 -------->OSRdyGrp |= 00100000;
如果第6组任何一个任务进入就绪态 -------->OSRdyGrp |= 01000000;
如果第7组任何一个任务进入就绪态 -------->OSRdyGrp |= 10000000;
- uCOS 就续表详解
- ucos,综合范例,详解
- Ucos优先级位图算法详解
- 详解UCOS中的内存管理
- ucos 任务优先级计算详解
- Ucos系统的中断详解
- 详解UCOS中的内存管理
- 详解UCOS中的内存管理
- 详解UCOS中的内存管理
- ucos
- ucos
- ucos
- UCOS
- ucos
- uCOS-II移植到ARM7TDMI详解
- UCOS源码详解(转自 不知道)
- 详解UCOS中的任务调度机制
- 详解UCOS中的互斥信号量
- 最小配对(tyvj 1196)
- 常见视频文件格式
- SSDT HIDE Process
- 口腔、牙医、牙科
- JdbcTemplate.queryForObject 返回值怎么判断
- uCOS 就续表详解
- 面对挑战 中国医疗电子业需整体出击
- 启动虚拟系统
- Oracle substr()函数详解
- textarea标签的转义
- 找素材图,多用谷歌吧
- JQ查找节点范例说明
- F12开发者工具新功能-内存分析的作用
- [Python]lxml在centos上安装失败