找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14028|回复: 3
打印 上一主题 下一主题
收起左侧

说说任务控制块优先级表OSTCBPrioTbl[]的作用

[复制链接]
跳转到指定楼层
楼主
ID:72008 发表于 2015-1-12 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       开言之前,先说说什么是空指针?1> 没有存储任何内存地址的指针就称为空指针(NULL指针),换句话说就是内存中的一块处女地,没有任何地址编号被存储;2> 空指针就是被赋值为0的指针,在没有被具体初概念始化之前,其值为0。如果不能真正理解c语言中的概念,学习操作系统会很吃亏。

如下的语句好多人没有搞懂,我也是花了很长时间才搞懂的。
if (OSTCBPrioTbl[prio] == (OS_TCB *)0)
{
  OSTCBPrioTbl[prio] = (OS_TCB *)1;
)
如果把我上述的空指针的概念搞懂,再结合下面创建任务函数OSTaskCreate()在uc/os-ii操作系统中的作用,不由得发出感慨:我操,创作uc/os-ii操作系统的那个美国老头太他妈牛逼了!


    从下面的例子来讲:

OSTaskCreate()
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
{
void *psp;
INT8U err;
if (prio > OS_LOWEST_PRIO)
{ (1)
return (OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { (2)
OSTCBPrioTbl[prio] = (OS_TCB *)1; (3)
OS_EXIT_CRITICAL(); (4)
psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); (5)
err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0); (6)
if (err == OS_NO_ERR) { (7)
OS_ENTER_CRITICAL();
OSTaskCtr++; (8)
OSTaskCreateHook(OSTCBPrioTbl[prio]); (9)
OS_EXIT_CRITICAL();
if (OSRunning) { (10)
OSSched(); (11)
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0; (12)
OS_EXIT_CRITICAL();
}
return (err);
} else {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
}
OSTaskCreate()一开始先检测分配给任务的优先级是否有效。任务的优先级必须在0到OS_LOWEST_PRIO之间。接着,OSTaskCreate()要确保在规定的优先级上还没有建立任务。在使用μC/OS-Ⅱ时,每个任务都有特定的优先级。如果某个优先级是空闲的,μC/OS-Ⅱ通过放置一个非空指针在OSTCBPrioTbl[]中来保留该优先级。这就使得OSTaskCreate()在设置任务数据结构的其他部分时能重新允许中断。
然后,OSTaskCreate()调用OSTaskStkInit(),它负责建立任务的堆栈。该函数是与处理器的硬件体系相关的函数,可以在OS_CPU_C.C文件中找到。OSTaskStkInit()函数返回新的堆栈栈顶(psp),并被保存在任务的0S_TCB中。一旦OSTaskStkInit()函数完成了建立堆栈的任务,OSTaskCreate()就调用OSTCBInit(),从空闲的OS_TCB池中获得并初始化一个OS_TCB。它存在于0S_CORE.C文件中而不是OS_TASK.C文件中。OSTCBInit()函数首先从OS_TCB缓冲池中获得一个OS_TCB,如果OS_TCB池中有空闲的OS_TCB,它就被初始化。注意一旦OS_TCB被分配,该任务的创建者就已经完全拥有它了,即使这时内核又创建了其它的任务,这些新任务也不可能对已分配的OS_TCB作任何操作,所以OSTCBInit()在这时就可以允许中断,并继续初始化OS_TCB的数据单元。
初始化完,除了吧任务计数器加1外,还要进一步判断UC/OS-II的核是否在 状态(即OSRunning是否为1)。如果OSRunning为1,则调用OSSched()进行任务调度。

1, 所有的任务控制块TCB都是存放在 任务控制块列表数组OSTCBTbl[] 中,系统通过任务控制块优先级表OSTCBPrioTbl[] ,查询到任务控制块的地址,任务控制块的相关数据定义。
2,任务控制块优先级表OSTCBPrioTbl[]   是以任务为索引,里面保存的是任务0到最大任务的任务控制块的首地址,据此可以通过任务优先级号快速找到当前任务在任务控制块中的首地址,而不必到任务控制块链表中去一步一步查找,
加快了任务的切换时间,提高了操作系统的效率。

  这就是今天的收获!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96534 发表于 2016-3-19 16:03 | 只看该作者
有帮助
回复

使用道具 举报

板凳
ID:96534 发表于 2016-3-19 16:04 | 只看该作者
仔细研究研究
回复

使用道具 举报

地板
ID:122054 发表于 2016-5-19 22:46 | 只看该作者
学习了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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