10.3-uC/OS-III内部任务管理(TCB)
任务控制块 TCB
1.任务控制块是被uC/OS-III用于维护任务的一个结构体。每个任务都必须有自己的 TCB。 uC/OS-III 在 RAM 中分配 TCB。当调用uC/OS-III提供的与任务相关的函数(以OSTask???()形式命名)时,任务的TCB地址需会被提供给该函数。 TCB的结构定义于OS.H中,如列表 5-3所示(在 OS.H中代码是有注释的)。 TCB中的一些变量可以根据具体应用进行裁剪。
2.用户程序不应该访问这些变量(尤其不能更改它们)。换句话说,TCB中的变量只能被uC/OS-III访问。
.StrPtr:这个变量中包含了指向当前任务堆栈的指针。
.ExtPtr:这个变量中定义了指向用户用于扩展TCB(如果需要)
的指针。
.StkLimitPtr:这个变量中保存了堆栈增长时的限制地址,它是在调用OSTaskCreate()时传递的参数”stk_limit”。 有些处理器有硬件寄存器可以自动地检测并确保堆栈不发生溢出,如果处理器没有这些硬件设施, 堆栈检测可以用软件模拟。 然而, 软件模拟不如硬件可靠。 如果这个功能没有被用到,那么在调用 OSTaskCreate()时可以设置”stk_limit”为0。详见5-3。
.NextPtr和.PrevPtr:这些指针用于就绪队列中双向链表。双向链表可以让TCB在列表中能更快地被插入或者删除。
.TickNextPtr和.TickPrevPtr:这些指针用于挂起队列中双向链表。双向链表可以让TCB在列表中能更快地被插入或者删除。
.TickSpokePtr:这个指针用于表示时基轮转的轮辐。
.NamePtr:这个指针存放了任务的名字。有名字的任务非常有助于调试,因为这样能友好地显示每个任务对应的 TCB地址。该名字的字符串存于ROM(如果以常量命名)或者RAM。
.StkBasePtr:{任务堆栈是由高地址向低地址生长}这个指针指向了任务堆栈的基地址。
.TaskEntryAddr:这个变量中包含了任务代码的入口地址,正如前面提到的,任务
用如下方式申明,voidMyTask(void*p_arg);
.TaskEntryAtg:这个变量是当任务第一次运行时传递给任务的参数。正如上面提
到的,这个变量值会传给p_arg。
.PendDataTblPtr:uC/OS-III允许任务同时挂起多个信号量和消息队列。 这个指针指
向了包含这些被挂起对象的表。
.PendDataEntries:这个变量与.PendDataTblPtr一起工作,表示在同一时刻某任务等待的事件数。
.TS:这个变量存储了任务所等待事件出现的时间戳,当任务恢复执行时,时间戳会被返回给任务。
.MsgPtr:当有消息发送给任务时,这个变量保存了该消息的地址。
.MsgSize:当有消息发送给任务时,这个变量保存了消息的大小(以字节为单位)。这个变量仅出现在TCB中,如果消息队列服务(在OS_CFG.H中设置OS_CFG_Q_EN为1)或者任务队列服务(在OS_CFG.H中设置OS_CFG_TASK_Q_EN为1)编译时被使能的话。
.MsgQ:uC/OS-III允许任务或ISR直接发送消息给任务。
.MsgQPendTime:保存了消息从创建到被接收所需的时间。
.MsgQPendTimeMax:这个变量中保存了消息到达所用时间的最大值,它是.MsgQPendTime 的峰值。这个值可以被OSStatReset()复位。
.FlagsPend:当任务等待事件标志组,这个变量保存了任务所等待的标志位。
.FlagsOpt:当任务等待事件标志组,这个变量保存了任务所等待事件标志组
的类型。
.FlagsRdy:这个变量保存了已经被提交的事件标志组 ( 任务所等待的), 换句
话说, 它让任务知道是哪个事件标志组让任务就绪的。
.RegTbl[]:这个数组中包含了任务的”寄存器”, 不同于CPU寄存器。 任务寄
存器用于存储任务ID、软件错误等。
.SemCtr:这个变量保存了信号量的计数值。每个任务都有其的内建信号量。
ISR或其它任务可以通过信号量标记这个任务。
.SemPendTime:中保存着信号量从产生到被接收所用的时间。
.SemPendTimeMax:保存了信号量从产生到被接收所用时间的最大值。
.SuspendCtr:这个变量被OSTaskSuspend()和OSTaskResume()使用,用于记录任务被停止的次数。
.StkSize:这个变量中保存了堆栈的大小( 以CPU_STK为数据类型)。
.StkUsed和.StkFree:在运行时, uC/OS-III可以计算出堆栈的实际使用量和空余量, 这是通过调用OSTaskStkChk()实现的。堆栈使用量计算是假定堆栈在创建时被初始化的情况下的。
.Opt:当任务创建时传递给OSTaskCreate()的参数。它定义任务的附加功能。
.TickCtrPrev:当OSTimeDly()选择OS_OPT_TIME_PERIODIC形式时,该变量
为OSTickCtr的初值。
.TickCtrMatch:当任务被延时一段时间,或者因等待事件而设置时限。任务就会
被放到挂起队列中。
.TickRemain:这个变量中保存了任务到时的剩余时间值,它在OS_TickTask()
中被计算。调试时这个变量是很有用的。
.TimeQuanta和.TimeQuantaCtr:这两个变量用于时间切片,当多个就绪任务有相同的优先级时, .TimeQuanta决定了时间片长度(多少个时基)。 .TimeQuantaCtr中保存了当前时间片的剩余长度。在任务切换开始时将.TimeQuanta的值载入.TimeQuantaCtr。
.CPUUsage:保存了CPU的使用率( 0到100%), 它是被OS_StatTask()计算出
来的。
.CtxSwCtr:保存了该任务被执行的次数。
.CyclesDelta:这上下文切换时被计算,它保存了当前时间戳与CyclesStart的差
值。调试时可以通过它知道该任务的执行时间。
.CyclesStart:这个变量用于测量任务的执行时间, .CyclesStart在上下文切换时
被更新。它保存了任务切换时的时间戳(通过调用OS_TS_GET()获得)。
.CyclesTotal:这个变量是CyclesDelta的累加, 所以它包含了该任务被执行的总
时间。 这个变量被定义为64位防止溢出。
.IntDisTimeMax:这个变量中保存了该任务关中断的最大时间。
.SchedLockTimeMax:保存了该任务锁调度器的最大时间。
.PendOn:该变量的值取决于任务因何被挂起。
.PendStatus:这个变量保存了任务被挂起后的状态,包括4种状态。
.TaskState:这个变量保存了任务当前的状态,包括8种状态。
.Prio:它保存了任务的优先级, 该值介于0到OS_CFG_PRIO_MAX-1
之间。事实上,空闲任务需独占优先级OS_CFG_PRIO_MAX-1。
.DbgNextPtr:该变量是一个指针,在双向TCB列表中,它指向下一个TCB。通
过OSTaskCreate()函数uC/OS-III将TCB放入该列表中。
.DbgPrevPtr:该变量是一个指针,在双向TCB列表中,它指向上一个TCB。
.DbgNamePtr:该变量是一个指针,当任务在等待信号量、事件标志组、 mutex、
消息队列时,它指向目标对象的名字。
10.3-uC/OS-III内部任务管理(TCB)的更多相关文章
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- uC/OS - III 移植 IAR平台
关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- uc/os任务创建
问题描述: uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...
- uC/OS 的任务调度解析 (转)
uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...
- 基于μC/OS—III的CC1120驱动程序设计
基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120 嵌入式操作系统 STM32F103ZE ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- 在STM32F401上移植uC/OS的一个小问题 [原创]
STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...
- uc/os 任务删除
问题描述: uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注: 如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...
- 关于uC/OS的简单学习(转)
1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...
随机推荐
- CFA一级知识点总结
更多来自: www.vipcoursea.com Ethics 部分 Objective of codes and standard:永远是为了maintain public trust in ...
- highCharts图表入门简介
一.Highcharts简介 Highcharts:功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯js图表库 Highcharts是一款纯javascript编写的图表库,能够很简单便捷的在W ...
- 使用 GCD 实现倒计时效果
效果如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @p ...
- docker_File 执行报错总结
编写dockerfile [root@linux-node1 ~/dk]# cat Dockerfile # this is a docker File FROM centos MAINTAINER ...
- Centos7 安装PHP7版本及php-fpm,redis ,php-redis,hiredis,swoole 扩展安装
============================PHP7.1 ========================================= 1. 更换rpm 源,执行下面两个 rpm - ...
- 为C函数自动添加跟踪语句
目录 为C函数自动添加跟踪语句 声明 一. 问题提出 二. 代码实现 2.1 函数匹配测试 2.2 插入跟踪语句 三. 效果验证 为C函数自动添加跟踪语句 标签: Python 正则表达式 声明 本文 ...
- vba 如何去掉返回结果两端的双引号?
If Left(s, 1) = Chr(34) And Right(s, 1) = Chr(34) Then s = Mid(s, 2, Len(s) - 2) End If
- ES6 的模块系统
原文地址:https://hacks.mozilla.org/2015/08/es6-in-depth-modules/ ES6 是 ECMAScript 第 6 版本的简称,这是新一代的 JavaS ...
- Python 读、写、追加csv文件详细以及注意事项
一.利用csv库创建文件 首先导入csv文件 import csv 根据指定的path创建文件: def create_csv(path): with open(path, "w+" ...
- I - 取石子游戏
有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者. ...