UCOS2系统内核讲述(五)_初始化TCB详情
Ⅰ、写在前面
学习本文之前可以参看我前面的文章:
上一篇文章讲述了关于函数“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” 或者扫描下面二维码、关注,将有更多精彩内容等着你。
UCOS2系统内核讲述(五)_初始化TCB详情的更多相关文章
- UCOS2系统内核讲述(二)_初始化调用函数
Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32F1移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 还是按照上一篇文章的思维(从外到内),本文(结合源代码)进 ...
- UCOS2系统内核讲述(四)_创建任务
Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 UCOS2系统内核讲述(二)_初始化调用函数 UCOS2系统内 ...
- UCOS2系统内核讲述(三)_TCB任务控制块
Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32F1移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 UCOS2系统内核讲述(二)_初始化调用函数 上一篇文章讲 ...
- UCOS2系统内核讲述_总体描述
Ⅰ.写在前面 学习本文之前可以参考我前面基于STM32硬件平台移植UCOS2的几篇文章,我将其汇总在一起: UCOS2_STM32F1移植详细过程(汇总文章) 要想学习,或使用系统配套的资源(如:信号 ...
- C#_02.14_基础五_.NET类
C#_02.14_基础五_.NET类 一.类实例: 我们前面说过类是一个模板,我们通过类创建一个又一个的实例,通常情况下类当中的变量是每一个实例都各有一份的,互相不影响,而静态字段是除外的,静态字段是 ...
- SpringBoot(五)_表单验证
SpringBoot(五)_表单验证 参数校验在我们日常开发中非常常见,最基本的校验有判断属性是否为空.长度是否符合要求等,在传统的开发模式中需要写一堆的 if else 来处理这些逻辑,很繁琐,效率 ...
- 以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取【原创】
以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号 ...
- Spark源码剖析 - SparkContext的初始化(五)_创建任务调度器TaskScheduler
5. 创建任务调度器TaskScheduler TaskScheduler也是SparkContext的重要组成部分,负责任务的提交,并且请求集群管理器对任务调度.TaskScheduler也可以看作 ...
- Linux设备管理(五)_写自己的sysfs接口
我们在Linux设备管理(一)_kobject, kset,ktype分析一文中介绍了kobject的相关知识,在Linux设备管理(二)_从cdev_add说起和Linux设备管理(三)_总线设备的 ...
随机推荐
- HTML中的attribute和property
一.概述 attribute和property是常常被弄混的两个概念. 简单来说,property则是JS代码里访问的: document.getElementByTagName('my-elemen ...
- STL - 算法 - 普通拷贝
list<, , , , , , , , }; vector<int> coll2; cout << "** collection 1: **" &l ...
- 安装TeX及中文支持
2014.7.19更新: 以下的笔记适用于在基于Ubuntu的发行版(比方LinuxMint)安装Texlive2013.2014: 第一步依据本机状况.可能不须要. Texlive2014已经能够下 ...
- Unity Editor类常用方法
http://www.cnblogs.com/zhaoqingqing/p/3944718.html 一些比较常用的Editor功能我在之前的博客中也有提到过所以就不详细写啦,今天参考了一下 麒麟子( ...
- QtGui.QGridLayout
The most universal layout class is the grid layout. This layout divides the space into rows and colu ...
- 从chrome商店直接下载crx文件
从chrome商店直接下载crx文件 CreateTime--2018年5月21日17点18分 Author:Marydon 1.前提 需要知道你所下载的插件的id 查看方法: 第一步:打开扩展程 ...
- 优化技术之Android UI优化
2013-06-30 UI 优化 在Android中,最常用LinearLayout表示UI的布局.比起LinearLayout,在资源利用上,RelativeLayout会占用更少的资源而达到相同的 ...
- C/S和B/S 赞美创新,好酸啊。
似乎是一个很古老的话题啊...翻出来炒冷饭也是很有趣的. 昨天聊iDempiere时说到了Client这个词,我和人家说我依然会条件反射般想到了C/S,从而又SB般感慨了一番世风日下,人心不古.... ...
- python --批量重命名文件名
# -*- coding: utf-8 -*- import os path = "d:\\curl\data\\" for file in os.listdir(path): p ...
- python pandas groupby
转自 : https://blog.csdn.net/Leonis_v/article/details/51832916 pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对 ...