打印
[uCOS/RTOS]

ucos之OSCreate()函数理解求解~~~

[复制链接]
1075|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
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; 也可以不要。

使用特权

评论回复
5
liuchang890811|  楼主 | 2015-7-17 15:06 | 只看该作者
按照大神的意思: OSTCBPrioTBl[Prio]=(OS_TCB *)1;这句话的目的主要是为了先占用这个"位子",防止其它人来,以为这个"位子"没有人坐,自己坐在上面了,是这个意思吧?

使用特权

评论回复
6
liuchang890811|  楼主 | 2015-7-17 15:07 | 只看该作者
大神:小弟初学ucos,收到您很多指教,再次感谢大神细心指导~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

87

帖子

0

粉丝