|
发现源码里有这么一句,十分费解,求教诸位高人。 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是为零的,这个实在是搞不懂,请教诸位高人。
|
|