Ⅰ、写在前面
学习本文之前可以参看我前面的文章:
上一篇文章讲述了关于函数“OSTaskCreateExt”创建任务函数体里面重要一些的内容,本文接着上一张讲述关于“OSTaskCreateExt”函数体里面调用的一个函数“OS_TCBInit”初始化任务控制块,“OS_TCBInit”也是与系统内核紧密相关的一个函数。
关于本文的更多详情请往下看。
Ⅱ、OS_TCBInit参数详情
在学习OS_TCBInit之前要明确一下,“OS_TCBInit”和“OS_InitTCBList”(OSInit下面调用的函数),从命名上看上去有点相似,但仔细看一下区别还是可以看到出来的。
“OS_InitTCBList”在前面文章有讲述过(可以看我前面相关的文章),主要是初始化TCB链表。“OS_InitTCBList”函数体内容相关于将TCB链表复位。
本文将的“OS_TCBInit”是在创建任务时初始化一个任务的TCB,要将优先级、堆栈等信息初始化。“OS_TCBInit”函数体内容相当于对任务的TCB里面对应的内容落实到具体的参数上。
可以将“OS_TCBInit”和“OS_InitTCBList”区别比喻如下:
“OS_TCBInit”是将某一个整形变量初始话为0(复位值);
“OS_InitTCBList”是将某一个整形变量赋值为1(具体值);
从main函数跟踪代码可以找到“OS_TCBInit”函数,如下动画:
“OS_TCBInit”函数的每一个参数在函数体源代码上面都有注释(我也将源代码注释修改为中文了,可以下载参看)。
该函数位于“os_core.c”下面;
1.第一个参数prio
prio看过UCOS系统的朋友应该对整个参数不会陌生,它就是任务的优先级。
这个参数是从“OSTaskCreateExt”函数参数中传下来的(原封不动,一样的参数)。
注意:任务的优先级数值越小,它的优先级越高。比如:
Task1优先级是1,Task2优先级是2。则Task1优先级高于Task2的优先级。
2.第二个参数ptos
ptos这个参数和上一篇文章中OSTaskCreateExt创建任务中的ptos一样,是指向栈顶的指针。创建任务中利用“OSTaskStkInit”初始化堆栈得到栈顶的指针psp,将该指针传递给OS_TCBInit函数的参数。
同样说明一下:这个参数和“第三个参数pbos”对应,需要根据栈的增长方向“OS_STK_GROWTH”来决定。
3.第三个参数pbos
pbos这个参数和“第二个参数”一样,是从上一层的OSTaskCreateExt创建任务中的ptob参数意思一样,是指向栈底的指针。
4.第四个参数id
id这个参数不多说,和上文一样的意思。
5.第五个参数stk_size
stk_size这个参数和上一篇文章也是一样,这里再提示一下,它就是堆栈的大小,就是你分配堆栈空间(定义堆栈数组)的大小。
6.第六个参数pext
pext这个参数是指向用户提供的内存(指针)。
这个参数对初学者意义不大,可暂时不用去理解它,你把它理解为扩展使用就是了。
7.第六个参数opt
opt:用户操作选项参数。
上一篇文章已经说的很详细,具体说明见上一篇文章。
到此,细心的会发现,其实“OS_TCBInit”函数的参数基本是继承“OSTaskCreateExt”函数的参数。从这里可以看得出“OS_TCBInit”函数才是创建任务重要的函数。
Ⅲ、OS_TCBInit函数体内容描述
上一章节讲述了“OS_TCBInit”的参数,其实传递进来的参数是保存在TCB链表里面的,用于保存一个任务重要的信息,具体如何实现就要看接下来的函数体说明(建议下载源代码一起参考学习)。
1.第一部分
A.链表节点及参数:
OSTCBFreeList是当前空闲TCB链表,相当于每初始化一个任务就要将OSTCBFreeList指向下一个没有使用的FreeList,保证在每次创建任务的时候有OSTCBFreeList可用。
if (ptcb != (OS_TCB *)0)
这个条件就是上面说的,判断还有没有空闲TCB链表,如果没有空闲TCB链表就会返回“错误”。
OSTCBFreeList = ptcb->OSTCBNext;指向下一个TCB链表。
下面来的就是其它参数赋值(堆栈、优先级、任务状态就绪等)。
B.任务参数:
这里说的任务参数和上一篇文章说的不一样,主要说的是传递下来的参数信息,归位到对应的空间,也就是参数赋值。
ptcb->OSTCBDelReq = OS_ERR_NONE;
这里有一个语句,就是任务可以删除(当我们使能了删除任务功能,在创建任务之后就可以删除创建的任务)。
2.第二部分
A.优先级:
UCOS优先级实现其功能具体的这部分是比较困难的,使用了“优先级表”,而且查找优先级的算法也相对来说比较困难,初学者暂时可以不用考虑,感兴趣的朋友可以网上“UCOS优先级调度算法”。
B.事件:
这个需要结合事件(信号量、消息邮箱等)来讲述,我会在后面讲述UCOS资源的事件中提及相关的信息。
C.性能分析参数:
这个参数可以从注释的意思来理解,“性能分析”意思就是对系统运行的性能,CPU使用率等来理解。前面在讲述OS_TaskIdle空闲任务时就看到,函数体里面有这么一条语句:OSIdleCtr++; 也就是统计空闲任务的计数次数。
3.第三部分
在上面上部分的“准备”工作之后,这剩下的就是“就绪”工作了。
OSTCBInitHook(ptcb);和OSTaskCreateHook(ptcb);这两个函数一般都是成对出现,是用户自己的HOOK函数,用户自己要实现某一些功能就写在这里。
OSTCBPrioTbl[prio] = ptcb; 这条语句将该任务在TCB表中有一个对应的位置。
ptcb->OSTCBNext = OSTCBList;和上面第一部分类似,指向TCB链表。
OSTaskCtr++;任务也有一个统计计数的变量。
Ⅳ、实例工程下载
笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。
笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。
我将最新UCOS2.92操作系统移植到F0、F1、F3、F4各个硬件平台上,可以根据你芯片系列选择下载。
UCOS基于STM32F0、F1、F3、F4系列实例工程源代码(汇总):
https://yunpan.cn/cM9Fjv88cXbjI 访问密码 048d
本文讲述的部分注释修改为中文(软件工程源代码):
https://yunpan.cn/ckKeBFx25VIEB 访问密码 a9df
基于STM32平台的UCOS源代码工程(官方原始软件工程)
官网下载(需要账号):
360云盘下载:
https://yunpan.cn/cM9Gzv4drXqxv 访问密码 c82c
Ⅴ、说明
UCOS相关的文章我会第一时间在微信公众号里面和大家分享,也可以到我博客(http://blog.csdn.net/ybhuangfugui)上查看相关的文章。
当你掌握UCOS在一种平台上的移植,其他平台移植原理类似,请不要局限某一平台。
以上总结仅供参考,若有不对之处,敬请谅解。
Ⅵ、最后
更多精彩文章我将第一时间在微信公众号里面分享,如果不想错过,可以关注我的微信公众号。
本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。