3798|6

7

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

uCOS源码求教 [复制链接]

 发现源码里有这么一句,十分费解,求教诸位高人。
OS_TCBInit()中有这么几句
ptcb = OSTCBFreeList; //分配一个空任务控制块给ptcb
if (ptcb != (OS_TCB *)0)  //如果缓冲池有空余TCB,则这个TCB被初始化
{
********
return (OS_NO_ERR); //调用成功
}
return (OS_NO_MORE_TCB); //没有更多的任务控制块被分配,将无法创建新的任务
如果按注释上所说,那么未使用的(也就是可用的)OS_TCBTbl块应该是非零的,但是查了查源码,
发现OSInit()中倒是有这些控制块的初始化,可是初始化的值却是(OS_TCB*)0
ptcb1 = &OSTCBTbl[0]; //查找任务控制块列表(0)的对应地址
ptcb2 = &OSTCBTbl[1]; //查找任务控制块列表(1)的对应地址
//释放所有的任务控制块列表
for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {
ptcb1->OSTCBNext = ptcb2;
ptcb1++;
ptcb2++;
}
ptcb1->OSTCBNext = (OS_TCB *)0; //将最后的任务块双向链接表的后链接为0
OSTCBFreeList = &OSTCBTbl[0]; //空任务控制块地址为当前任务控制块列表的首地址
这是我的一点小疑惑。后来又发现一个问题,同样是初始化清零的OSTCBPrioTbl,
if (OSTCBPrioTbl[prio] != (OS_TCB *)0)  //确认优先级别未占用,即就绪状态不为0
{
*err = OS_PRIO_EXIST;
return ((OS_EVENT *)0);//优先级为Prio的任务已经存在
}
这时候就变成了未使用的OS_TCBPrioTbl是为零的,这个实在是搞不懂,请教诸位高人。

最新回复

谁有官方原版的uCOS2.0源码,想拿来学习一下  详情 回复 发表于 2012-6-6 17:27
点赞 关注
 

回复
举报

60

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
第一点,你的理解出错了。代码中查找的是空余的TCB,注意是“空余”。ptcb = OSTCBFreeList;这句话是获取空余TCB链表中OSTCBFreeList所指向的那个TCB,如果链表中已经没有空余TCB了,那么OSTCBFreeList=0,也就是ptcb 所赋的值其实是0。
第二点,OS_TCBPrioTbl和OSTCB事两回事,你搞混了。
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
很感谢你能够耐心给我指点,抱歉还是不太明白,请允许我再多问几句。如果说“空余”的TCB应该非零,那么为什么初始化时要清零呢?假如我初始化后直接建立一个任务,岂不是就立即失败。初始化函数OSInit()之中将所有的TCB控制块清零,同时OSTCBFreeList指向第一个控制块,此时应该是零吧?然后我建立一个任务OSTaskCreate()之中会调用OS_TCBInit(),这个函数中会检验是否存在剩余的控制块,如果发现ptcb == (OS_TCB *)0,应该会报错吧?
这是我的理解,不知道哪里出问题了,请指教。
还有我知道OSTCBTbl和OSTCBPrioTbl是两个不同的控制块,前者是按照创建任务的顺序排布的,大小根据最大任务数,后者则是按照优先级排布的,大小根据最大任务优先级数,但是初始化函数中这两个均置零了,为什么判断是否仍有空余时不同呢?
恳请指教,谢谢!
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 black0936 的帖子

先说第一个问题吧,if (ptcb != (OS_TCB *)0) 这句话在你的理解中是判断TCB是否为0,也就是TCB是否为未使用的。
但是,实际上,uc/os在这里判断的是在空余TCB池中还有没有TCB,而非是针对TCB本身进行判断。OSTCBFreeList是什么?它是空余TCB链表的表头,当它的值为0时,就意味着已经没有空余TCB了。这就是为什么这段代码最后返回的是
return (OS_NO_MORE_TCB); //没有更多的任务控制块被分配,将无法创建新的任务
而不是TCB已使用的信息了。至于这个TCB是不是为空?抱歉,这里不关心这个问题。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

5
 
第二个问题。判断是否仍有空余使用的不是OSTCBTbl,而是OSFreeList。OSTCBPrioTbl在你贴出的那一部分代码中是用于判断你想要建立的任务的优先级是不是已经被其它已建立的任务占用了,而不是判断空余的。
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

6
 
也许是我太愚钝了,还是不太明白。为什么OSTCBFreeList的值为0时就意味着已经没有空余TCB了呢?初始化时不也是为0吗?
好的,谢谢你的指点。我还是回去再琢磨琢磨代码吧。
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

7
 
谁有官方原版的uCOS2.0源码,想拿来学习一下
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表