任务控制块 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)的更多相关文章

  1. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  2. uC/OS - III 移植 IAR平台

    关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...

  3. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  4. uc/os任务创建

    问题描述:      uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...

  5. uC/OS 的任务调度解析 (转)

    uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...

  6. 基于μC/OS—III的CC1120驱动程序设计

    基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120   嵌入式操作系统   STM32F103ZE   ...

  7. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  8. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

  9. uc/os 任务删除

    问题描述:     uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注:     如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...

  10. 关于uC/OS的简单学习(转)

    1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...

随机推荐

  1. Nginx系列二:(Nginx Rewrite 规则、Nginx 防盗链、Nginx 动静分离、Nginx+keepalived 实现高可用)

    一.Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含义就是某个URL重写成特定的URL(类似于Redirect),从某种意义上说为了美观或者对搜索引擎友好, ...

  2. Java如何计数替换字符串中第一次出现的子字符串?

    在Java编程中,如何拆分正则表达式和字符串? 以下示例演示如何使用Matcher类的replaceFirst()方法替换字符中指定的子字符串的首次出现. package com.yiibai; im ...

  3. 在IDEA中将项目部署到Tomcat的方法及两种模式的区别

    转自:https://www.jianshu.com/p/fb0ed26c35d5 1.添加tomcat服务器 点右上角编辑配置   编辑配置 点击左上角+选择tomcat服务器   添加tomcat ...

  4. javascript实现一行文字随不同设备自适应改变字体大小至字数完全展示

    产品提了一个小需求,希望一行能展示用户输入的所有文字,因为最多限制为25字符,但是如果夹杂英文/韩文/日文等,即使字符数是一样的,但是展示的长度不一样,则有些title标题会被截断. 效果如图 前提是 ...

  5. bigtable原理

    bigtable原理 数据模型 A Bigtable is a sparse, distributed, persistent multi-dimensional sorted map. The ma ...

  6. [SLAM] ***AR Tracking based on which tools?

    SLAM虽然小复杂,但对于开发者而言,ar sdk通常会解决这个问题. 所以相对于识别,跟踪是个看上去高大上但实则不需要关注细节的部分. 识别,要技术深耕:跟踪,需行业深耕. 在此了解下常见的ar s ...

  7. SpringMVC中 -- @RequestMapping的作用及用法

    一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.x ...

  8. 5. RAMN备份与恢复

    一. rman简介 RMAN(Recovery Manager)是一种用于备份(backup).还原(restore)和恢复(recover)数据库的 Oracle 工具.RMAN只能用于ORACLE ...

  9. Mariadb 10.3.5 序列号(sequence) 尝鲜

    除了Oracle Mariadb 也有sequence了,前提是Mariadb 10.3以上版本才支持. 但目前的正式版依然是10.2 启动一个Mariadb 10.3.5 docker pull m ...

  10. Web(二)

    一.数据的传递--转发和重定向 1.创建一个login.jsp页面  <body>     <%-- action:我们需要提交的地址  method:请求的方式 --%>   ...