ⅰ、写在前面
学习本文之前可以参看我前面的文章:
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
工业物联网解决方案:风沙气象数据实时上云监控
详谈AR/VR/MR数字光学元件和技术
最新!两部门发文开展中小企业数字化转型城市试点 百望云赋能企业“加速跑”
飞思卡尔推出面向小型引擎电子控制单元的模拟IC
Linux 内核才是真正的规则改变者
UCOS2系统内核讲述(三)_ TCB任务控制块
医疗废物在线监管系统打造医废信息化管理平台
决战FinFET芯片 三星台积电谁将突围
隆基为三峡能源转型升级发展提供优质服务与保障
长安铃木小型SUV—骁途将成为铃木在国内的救世主,预售价为10-16.5万元
又一个爆款诞生? 新机realme 3 Pro印度市场热销
华为mate10和mate10pro在硬件上有什么区别
输出4A开关频率550KHz的变换器电路
bga芯片加固胶-保护用什么胶水好?-汉思化学
梁华:5G相对于4G的能效提高了10-20倍
北汽昌河研发的自动驾驶技术目前已经达到L3级别?
直流放大器
智慧城市建设的好坏标尺在哪
cisco路由器设置步骤图解
如何去区分while与do while 的用法