[uCOS/RTOS] ucos之OSCreate()函数理解求解~~~

[复制链接]
1297|5
 楼主| liuchang890811 发表于 2015-7-16 09:16 | 显示全部楼层 |阅读模式
小弟最近看的是邵贝贝的那本书~~~源码如下想请教大神:下面的划线部分该如何理解?为什么要把OSTCBPrioTbl[Prio]=(OS_TCB *)1;写在临界区里面?恳请大神指导~~~



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
zhusizhan 发表于 2015-7-16 16:45 | 显示全部楼层
很简单,降低创建任务过程(也就是设置任务块数据)对中断的影响
 楼主| liuchang890811 发表于 2015-7-17 08:34 | 显示全部楼层
大神:那能把OSTCBPrioTBl[Prio]=(OS_TCB *)1;这句话放在中断的外面吗?为什么?恳请大神指教!
john_lee 发表于 2015-7-17 12:58 | 显示全部楼层
ucos有很多代码是花在了保证系统安全方面,比如楼主提到的这个。
如果这一句 OSTCBPrioTBl[Prio]=(OS_TCB *)1; 不用临界区保护,那么如果发生了下面的极端情况,系统就可能异常甚至崩溃:
首先,你的系统中有两个任务的优先级相同了,为了后面说明方面,称为任务 C 和 任务 D,优先级同为 2,然后还有两个已经创建了的任务,称为任务 A 和 任务 B,优先级不同。
第二,在运行时,当任务 A 创建任务 C,执行到了:if (OSTCBPrioTBl[Prio] != (OS_TCB *)0) 后,还未执行 OSTCBPrioTBl[Prio] = (OS_TCB *)1; 时,发生了中断,系统切换到任务 B,任务 B 创建任务 D,创建过程会顺利完成,任务 D  占用了OSTCBPrioTBl[2],然后当系统再次切换回任务 C,任务 C 继续执行下一句 OSTCBPrioTBl[Prio] = (OS_TCB *)1; 注意前面创建的任务 D 已经占用了 OSTCBPrioTBl[2],执行将会覆盖掉任务 D 的 TCB 指针,系统肯定会在之后的某个时候发生异常或崩溃。
其实只要保证各个任务的优先级不同,即使不要该临界区保护也不会有问题。那个 OSTCBPrioTBl[Prio]=(OS_TCB *)1; 也可以不要。
 楼主| liuchang890811 发表于 2015-7-17 15:06 | 显示全部楼层
按照大神的意思: OSTCBPrioTBl[Prio]=(OS_TCB *)1;这句话的目的主要是为了先占用这个"位子",防止其它人来,以为这个"位子"没有人坐,自己坐在上面了,是这个意思吧?
 楼主| liuchang890811 发表于 2015-7-17 15:07 | 显示全部楼层
大神:小弟初学ucos,收到您很多指教,再次感谢大神细心指导~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

87

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部