UCOS2系统内核讲述(三)_TCB任务控制块

Ⅰ、写在前面

学习本文之前可以参看我前面的文章:

UCOS2_STM32F1移植详细过程(汇总文章)

UCOS2系统内核讲述_总体描述

UCOS2系统内核讲述(二)_初始化调用函数

上一篇文章讲述了关于OSInit函数体中几个关于系统内核重要的函数,本文将针对上一篇文章中OS_InitTCBList(初始化任务控制块)函数重点讲述一下TCBTask 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基于STM32F0F1、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” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

时间: 2024-12-23 08:55:12

UCOS2系统内核讲述(三)_TCB任务控制块的相关文章

UCOS2系统内核讲述(四)_创建任务

Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 UCOS2系统内核讲述(二)_初始化调用函数 UCOS2系统内核讲述(三)_TCB任务控制块 上一篇文章讲述了关于TCB(Task Control Block)任务控制块数据结构体的内容.本文学习与应用.也与系统内核紧密相关的一个函数“OSTaskCreateExt”创建任务. OSTaskCreateExt这个函数是我们的应用程序所调用的函数,在我们所移植的

UCOS2系统内核讲述(五)_初始化TCB详情

Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2系统内核讲述(四)_创建任务 上一篇文章讲述了关于函数“OSTaskCreateExt”创建任务函数体里面重要一些的内容,本文接着上一张讲述关于“OSTaskCreateExt”函数体里面调用的一个函数“OS_TCBInit”初始化任务控制块,“OS_TCBInit”也是与系统内核紧密相关的一个函数. 关于本文的更多详情请往下看. Ⅱ.OS_TCBInit参数详情 在学习OS_TCBInit之前要明确一下,“OS_TCBInit”和“O

UCOS2系统内核讲述(二)_初始化调用函数

Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32F1移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 还是按照上一篇文章的思维(从外到内),本文(结合源代码)进一步深入UCOS系统内核,我会将讲述过的源代码注释修改为中文,提供给大家参考. 上一篇文章总体描述了一下整个工程“外围”的代码,本文将进一步“入围”,进一步讲述OSInit所调用的函数. 本文还是结合前面移植好.可以运行的源代码来进行讲述关于最新版本UCOS2系统内核部分代码(围绕源代码来讲述).

UCOS2系统内核讲述_总体描述

Ⅰ.写在前面 学习本文之前可以参考我前面基于STM32硬件平台移植UCOS2的几篇文章,我将其汇总在一起: UCOS2_STM32F1移植详细过程(汇总文章) 要想学习,或使用系统配套的资源(如:信号量.消息邮箱.消息队列等),就需要先了解一下系统内核大致的原理,也就是先了解大致,在研究细节的东西(从外到内),本文就是接着前面移植的文章来讲述关于系统内核的知识. 本文主要是结合前面移植好.可以运行的源代码来进行讲述关于最新版本UCOS2系统内部代码. 关于本文的更多详情请往下看. Ⅱ.UCOS操

[转载] 详述三种现代JVM语言--Groovy,Scala和Clojure

转载自http://www.tuicool.com/articles/jYzuAv和http://www.importnew.com/1537.html 在我与Martin Fowler曾经合作呈现的一次主题演讲中,他作出了一个有洞察性的观点: Java的遗产将是平台,而不是程序设计语言. Java技术的原始工程师们作出了一个明智的决定,就是将编程语言与运行时环境分开,最终这使得超过200种语言能够运行在Java平台上.这种架构对于该平台的长期活力是至关重要的,因为计算机程序设计语言的寿命一般都

STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)

Ⅰ.概述 上一篇文章讲述的内容是:三通道逐次转换(单次.单通道软件触发),也就是说3条通道要三次软件触发才能完成转换,而且是通过软件读取转换数值. 本文讲述三通道DMA连续转换(3通道.软件单次触发),也就是说3条通道只需要一次软件触发就能完成转换,使用DMA保存在数值. 上一篇文章实例是使用间断模式单次触发单条通道采集,本文是使用DMA模式单次触发三条通道采集.使用DMA传输的好处就是效率很高,我们直接读取转换的结果就是了,比如想做的示波器实例就是要求效率很高. 实例实验效果: 本文的实验效果

Java的三种代理模式简述

本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class Singer{ 2 public void sing(){ 3 System.out.println("唱一首歌"); 4 } 5 } 假如你希望,通过你的某种

STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)

Ⅰ.概述 本文讲述关于STM32功能比较强大的ADC模块.ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述"三条通道逐次转换(单次.单通道软件触发)". 根据笔者的经验,STM32所有系列芯片的ADC模块功能及配置都差不多.因此,本文虽是以F1为例,其实其他系列(F0.F2.F4等)都适用. 本文提供实例代码:三条通道,配置为逐次转换(间隔模式),适用软件触发转换(每触发一次转换一条通道),一个循

WIN8+VS2013编写发布WCF、一(编写)、二(部署)、三(调用)

原文://http://www.cnblogs.com/tntboom/p/4348483.html 引言:上学期因为写服务器用WCF,所以连查资料再瞎调试勉强成功了,但是这学期又到了用WCF的时候,而当时的资料零零散散,查找不易,并且此次是在WIN8与VS2013环境下编写的,所以将该入门过程记录下来,一是方便查阅,二是有助于其他新手. 一.新建工程并编写. 1.打开VS2013,新建--WCF----WCF服务应用程序,工程名称请根据爱好自行填写.如图: 2.观察解决方案框中的文件列表,其中