UCOS2系统内核讲述(三)_TCB任务控制块
Ⅰ、写在前面
学习本文之前可以参看我前面的文章:
UCOS2_STM32F1移植详细过程(汇总文章)
UCOS2系统内核讲述(一)_总体描述
UCOS2系统内核讲述(二)_初始化调用函数
上一篇文章讲述了关于OSInit函数体中几个关于系统内核重要的函数,本文将针对上一篇文章中OS_InitTCBList(初始化任务控制块)函数重点讲述一下TCB(Task Control Block)任务控制块。
TCB任务控制块是用来记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务有关属性的一个数据结构表(因此,学习本文之前需要了解数据结构)。任务控制块相当于一个任务的“身份证”,它记录着任务的重要信息。
对于系统内核而言,各个任务就是通过控制任务块将其链接成一个表。因此,任务控制块在任务中占据重要地位。
本文还是结合前面移植好、可以运行的源代码来进行讲述关于最新版本UCOS2系统内核部分代码(围绕源代码来讲述)。
对于想学习UCOS的朋友,本文讲述的内容可不用深入理解,可以先做个了解。
关于本文的更多详情请往下看。
Ⅱ、全局TCB
在上一篇文章中讲述的OS_InitTCBList是整个系统初始化重要的一个函数。
在该函数中可以看到OS_TCB这么一个数据类型,在第一条执行语句中可以看到“OSTCBTbl”这个TCB表,下面可以看到“OSTCBPrioTbl”、“OSTCBList”、“OSTCBFreeList”等一些关于TCB数据类型的变量。由此可知道,这个函数体里面的内容全是关于OS_TCB类型的。
跟踪代码可以知道“OSTCBTbl”这些变量定义在ucos_ii.h中,其实这些变量是控制整个系统任务的一些全局TCB.
从变量后面的注释可以知道关于任务的切换需要修改多少变量(指针),下一章节我们将进一步讲述关于“OS_TCB”这个数据结构体。
Ⅲ、OS_TCB数据结构体
要想理解OS_TCB结构体,需要理解数据结构(也就是C语言中结构体、指针、链表等这些知识),因为OS_TCB里面使用的就是这些知识,先看一下ucos_ii.h中定义的OS_TCB结构体,如下图:
上面的截图就是整个“OS_TCB”结构体的内容,最重要的几个参数就是我用红色框出来的那些,其他都是次要,或者不必要的参数。
下面就重点讲述一下红色标记的几个参数:
1. 三个重要的OS_TCB参数
OS_STK *OSTCBStkPtr; 指向当前栈顶的指针
struct os_tcb *OSTCBNext; 指向(TCB链表中)下一个TCB的指针
struct os_tcb *OSTCBPrev; 指向(TCB链表中)上一个TCB的指针
将这三个参数结合在一起来讲述是为了便于理解任务控制块之间的关联。学过链表的人应该知道这个写法,其实它就是将各个TCB构成一个关联的表,利用指针将一个个TCB关联起来。
指向上一个TCB的指针、指向当前TCB的指针、指向下一个TCB的指针,初学者只需要将这三个结合起来思考,理解起来就不难了。
2. 任务运行时重要的OS_TCB参数
这里说的参数见上面截图中最后红色标记部分,这些参数是任务运行是重要的参数。
A.INT32U OSTCBDly; 任务延时滴答 或 事件超时等待:
这个参数结合实例中三个任务的OSTimeDly函数一起理解就容易多了。OSTimeDly就是将该任务延时(该任务挂起)多少个滴答,其中重要的一个参数就是这里说的“OSTCBDly”,这个参数传递的信息就是延时。
B.INT8U OSTCBStat; 任务状态:
这个参数就是一个标示,标示任务处于什么状态。包括运行、挂起等,具体见ucos_ii.h第101行“TASK STATUS”的宏定义。
C.INT8U OSTCBStatPend; 任务悬挂状态:
这个参数和上面“任务状态”类似。主要包括三个状态:OS_STAT_PEND_OK、OS_STAT_PEND_TO和OS_STAT_PEND_ABORT。详情可见ucos_ii.h第117行“TASK PEND STATUS”的宏定义。
D.INT8U OSTCBPrio; 任务优先级:
任务优先级在学习UCOS之前都听说过这个词,这个参数就是标明任务优先级的参数。提示的是:任务优先级值越小,其优先级越高。所以,空闲任务优先级是设置最低。
E.优先级计算参数
INT8U OSTCBX; 优先级低3位对应的数值,即=prio&0x07
INT8U OSTCBY; 优先级高3位对应的数值,即=prio>>3
OS_PRIO OSTCBBitX; "对应"就绪表组的值 OSRdyTbl[OSTCBY] |= OSTCBBitX
OS_PRIO OSTCBBitY; 就绪表组 OSRdyGrp |= OSTCBBitY 即上面的"对应"组
这四个参数是计算任务优先级用的,至于是如何计算的,可以自己研究一下。
Ⅳ、实例工程下载
笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。
笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。
我将最新UCOS2.92操作系统移植到F0、F1、F3、F4各个硬件平台上,可以根据你芯片系列选择下载。
UCOS基于STM32F0、F1、F3、F4系列实例工程源代码(汇总):
https://yunpan.cn/cM9Fjv88cXbjI 访问密码 048d
本文所讲述部分注释修改为中文(软件工程源代码):
https://yunpan.cn/cMGZKfnVVb2Li 访问密码 49c2
基于STM32平台的UCOS源代码工程(官方原始软件工程)
官网下载(需要账号):
https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true
360云盘下载:
https://yunpan.cn/cM9Gzv4drXqxv 访问密码 c82c
Ⅴ、说明
UCOS相关的文章我会第一时间在微信公众号里面和大家分享,也可以到我博客上查看。
当你掌握UCOS在一种平台上的移植,其他平台移植原理类似,请不要局限某一平台。
以上总结仅供参考,若有不对之处,敬请谅解。
Ⅵ、最后
更多精彩文章我将第一时间在微信公众号里面分享,如果不想错过,可以关注我的微信公众号。
本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。
UCOS2系统内核讲述(三)_TCB任务控制块相关推荐
- 黑客亲身讲述三个高性商诈骗故事
[黑客联盟2017年01月09日讯]导语:当众人的目光都趋向大宗犯罪案件时,越来越多的非主流诈骗案不断出现,Only guest此次亲述了自己遭遇的三次非主流诈骗故事! 张瑞冬,FIT 2017大会上 ...
- 高性能网络编程(三)TCP消息的接收
这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动. 为了快速掌握本文所要表达的思想,我们可以带着以下问题阅读: 应用程序调用rea ...
- Java的三种代理模式简述
本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...
- 支付相关的知识点(移动支付,银行支付,第三,四方支付)
自己所在的公司,支付做的算是比较多的.仅仅两个月,已经对接了至少8种以上的支付平台,其实支付都原理大致都是一样的.携带参数到网关地址,然后回调函数(异步),完成逻辑部分.今天我就针对自己所做的支付,进 ...
- 使用Wireshark浅析Tcp三次握手
简述 我不想一开始直接搬网络描述图来讲三次握手亦或试图用大量专业词汇让你熟悉它,而是想用简单的描述,让大家对三次握手有个大概的印象.用Wireshark抓包工具分析TCP报文中大家比较关注的syn(S ...
- 图解三种备份方式(LAN,LAN free,Server free)
CU上有个板块叫"存储备份",可见存储和备份是紧紧联系的.在看备份的时候,经过能看到LAN free,server free这些术语,但是网上的解释都是你copy我的,我copy你 ...
- 二十不惑PK三十而已:北上广深年薪20、30、40万的程序员的真实生活如何?
最近<二十不惑>.<三十而已>热播刷屏,所长身边有很多朋友说,"被国产剧给圈粉了",仿佛看到自己的影子. <二十不惑>讲述四个在深圳即将毕业的女 ...
- uC-OS2 V2.93 STM32L476 移植:系统移植篇
前言 上一篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG STM32L476RG 的 裸机工程,并且下载了 uC-OS2 V2.93 的源码,接下来,开始系统移植 开发环境 ...
- 高性能网络编程总结及《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)
http://blog.csdn.net/column/details/high-perf-network.html http://blog.csdn.net/russell_tao/article/ ...
最新文章
- Objective-c——UI基础开发第十二天(相册展示)
- 在工作中有被动转主动的体会_积极主动应对眼前的一切,就是对自己最好的犒赏...
- HTML介绍及简单模式
- (转)Javascript面向对象编程(二):构造函数的继承
- java的基础语法是什么_java语法基础
- delphi中指针的用法
- 第八章xgboost/lightGBM
- opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构
- 【IKExpression】IKExpressionV2.0简易表达式解析器
- python获取绝对路径_Python 获取文件路径及文件目录
- Bailian2787 算24【DFS】(POJ NOI0205-1789)
- bzoj 4522: [Cqoi2016]密钥破解
- 区块链 以太坊 每个区块可以包含多少个交易
- C语言 · 学做菜
- 对《Java编程思想》读者的一点建议
- mysql数据库详细设计实例_MYSQL数据库设计和数据库设计实例(二)
- 怎么将苹果手机屏幕投屏到电脑上
- python使用turtle库绘制一个100长度的十字架_哪个选项能够使用turtle库绘制一个半圆形?...
- 数据结构-九宫格(回溯法)
- 表扩展字段2种实施方案研究
热门文章
- JavaEE初阶---Tomcat
- 想知道图片识别文字免费软件有哪些?告诉你文字识别软件有哪些
- Python面向对象(其一)
- 想搭建自己的网站,应该从哪处入手呢?选择什么样配置的服务器捏?通过哪些手段赚取足够的维护网
- Android打开QQ临时会话以及一键加群的两种方法
- 二十一、动网格Layering方法及实例
- 云-腾讯云-云通信:云通信(IM)
- cocos2d-x 提升篇 (17) 简单的桌上足球游戏
- 金融成AI最佳应用场景,“智能金融”时代真的来了么?
- Io流的FileInputStream和FileOutputStream的读取和写入