野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5824|回复: 3

μC/OSⅡ任务控制块链表初始化问题

[复制链接]
发表于 2014-7-17 21:29:57 | 显示全部楼层 |阅读模式
本帖最后由 JudeScorpio 于 2014-7-17 21:42 编辑

初学μC/OS Ⅱ,大神们多多关照
两个问题,位于OS_CORE.c文件中的OS_InitTCBList()函数
static  void  OS_InitTCBList (void)
{
    INT8U    i;
    OS_TCB  *ptcb1;
    OS_TCB  *ptcb2;
    OSTCBList  = (OS_TCB *)0;                /* TCB Initialization*/
    for (i = 0; i < (OS_LOWEST_PRIO + 1); i++)
    {                 
        OSTCBPrioTbl [ i ] =( OS_TCB * ) 0 ;/* Clear the priority table*/
    }
    ptcb1 = &OSTCBTbl[0];
    ptcb2 = &OSTCBTbl[1];
    for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++)
    {  
        ptcb1->OSTCBNext = ptcb2;/* Init. list of free TCBs*/
        ptcb1++;
        ptcb2++;
    }
    ptcb1->OSTCBNext = (OS_TCB *)0;         /* Last OS_TCB*/
    OSTCBFreeList    = &OSTCBTbl[0];
}
两个问题
1.函数第一个for循环内(第一个已经解决,但是望大侠看看对不对指点一下)
其中:
OS_EXT  OS_TCB    *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];
OSTCBPrioTbl就是一个数组,数组的元素都是指向OS_TCB的指针
对于这代码:OSTCBPrioTbl[ i ] = (OS_TCB *)0;
注释表示这句话的作用为清空优先级列表
但是我的理解,就是把0强制转化为一个指向OS_TCB指针,然后把OSTCBPrioTbl数组的元素一一的赋值。
不能理解的是谁告诉0地址就是0,就可以这样子起到清空作用了?
在一个网站找到的解释
(OS_TCB *)0实际上是通知编译器,这个0是OS_TCB数据类型的NULL。
(OS_TCB *)1那就是说有一个任务存在了,不再是Nul
然后看了一下C和指针
“为了测试一个指针变量是否为NULL,你可以将他与零值进行比较,之所以选择零这个之是因为一种源代码的约定。就机器内部而言,NULL指针的实际值可能与此不同。在这种情况下,编译器负责将零值和内部值之间的翻译转换”
貌似应该是这样是,(OS_TCB *)0,以因为编译器起了作用,等效于NULL

2.OS_LOWEST_PRIO+1 还是 OS_LOWEST_PRIO
对于:OS_LOWEST_PRIO + 1
任哲老师的书中描写OS_LOWEST_PRIO 作用为最低优先级常数,就是一共可以由OS_LOWEST_PRIO + 1个优先级,那么
无论从数组的定义:
OS_EXT  OS_TCB    *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];
还是第一个FOR循环:
for (i = 0; i < (OS_LOWEST_PRIO + 1); i++)

都是从零开始的,怎么能使用OS_LOWEST_PRIO + 1呢?用OS_LOWEST_PRIO 不久可以了吗?
回复

使用道具 举报

发表于 2014-7-18 15:10:10 | 显示全部楼层
楼主厉害,研究ucos源码,建议看看邵贝贝的书,写的挺好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-20 17:53:56 | 显示全部楼层
汪曼丽 发表于 2014-7-18 15:10
楼主厉害,研究ucos源码,建议看看邵贝贝的书,写的挺好

嗯,谢了,这两天看了一下邵贝贝的,写的要比任哲的详细。
回复 支持 反对

使用道具 举报

发表于 2014-8-16 09:59:25 | 显示全部楼层
楼主水平和起点比我高多了。我刚开始看uc/os,我说一下对第二个问题的看法吧。假如有30个优先级,OS_LOWEST_PRIO的值为29(因为从0开始排),最后两个优先级分别给了,统计任务和空闲任务。for循环开始扫描,要把30个扫一遍,因为用<,没有用<=,所以用OS_LOWEST_PRIO + 1吧,我是这么理解的。
第一个问题太高大上了,基础不行,我理解不了。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-12-5 02:48 , Processed in 0.055806 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表