ucOS学习笔记(3)——ucOS的数据结构

发布者:脑力驿站最新更新时间:2016-07-14 来源: eefocus关键字:ucOS  数据结构 手机看文章 扫描二维码
随时随地手机看文章
ucOS的数据结构中最核心的一个数据结构就是任务控制块数据结构,其他的数据类型都是围绕该数据结构展开的,任务切换,代码调度也都是以该数据结构为基础来完成的。认清了该数据结构就了解了ucOS的运行机制。任务控制块数据结构如下:

typedef struct os_tcb {
    OS_STK          *OSTCBStkPtr;           /* Pointer to current top of stack                         */

#if OS_TASK_CREATE_EXT_EN > 0
    void            *OSTCBExtPtr;           /* Pointer to user definable data for TCB extension        */
    OS_STK          *OSTCBStkBottom;        /* Pointer to bottom of stack                              */
    INT32U           OSTCBStkSize;          /* Size of task stack (in number of stack elements)        */
    INT16U           OSTCBOpt;              /* Task options as passed by OSTaskCreateExt()             */
    INT16U           OSTCBId;               /* Task ID (0..65535)                                      */
#endif

    struct os_tcb   *OSTCBNext;             /* Pointer to next     TCB in the TCB list                 */
    struct os_tcb   *OSTCBPrev;             /* Pointer to previous TCB in the TCB list                 */

#if (OS_EVENT_EN) || (OS_FLAG_EN > 0)
    OS_EVENT        *OSTCBEventPtr;         /* Pointer to          event control block                 */
#endif

#if (OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0)
    OS_EVENT       **OSTCBEventMultiPtr;    /* Pointer to multiple event control blocks                */
#endif

#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
    void            *OSTCBMsg;              /* Message received from OSMboxPost() or OSQPost()         */
#endif

#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
#if OS_TASK_DEL_EN > 0
    OS_FLAG_NODE    *OSTCBFlagNode;         /* Pointer to event flag node                              */
#endif
    OS_FLAGS         OSTCBFlagsRdy;         /* Event flags that made task ready to run                 */
#endif

    INT16U           OSTCBDly;              /* Nbr ticks to delay task or, timeout waiting for event   */
    INT8U            OSTCBStat;             /* Task      status                                        */
    INT8U            OSTCBStatPend;         /* Task PEND status                                        */
    INT8U            OSTCBPrio;             /* Task priority (0 == highest)                            */

    INT8U            OSTCBX;                /* Bit position in group  corresponding to task priority   */
    INT8U            OSTCBY;                /* Index into ready table corresponding to task priority   */
#if OS_LOWEST_PRIO <= 63
    INT8U            OSTCBBitX;             /* Bit mask to access bit position in ready table          */
    INT8U            OSTCBBitY;             /* Bit mask to access bit position in ready group          */
#else
    INT16U           OSTCBBitX;             /* Bit mask to access bit position in ready table          */
    INT16U           OSTCBBitY;             /* Bit mask to access bit position in ready group          */
#endif

#if OS_TASK_DEL_EN > 0
    INT8U            OSTCBDelReq;           /* Indicates whether a task needs to delete itself         */
#endif

#if OS_TASK_PROFILE_EN > 0
    INT32U           OSTCBCtxSwCtr;         /* Number of time the task was switched in                 */
    INT32U           OSTCBCyclesTot;        /* Total number of clock cycles the task has been running  */
    INT32U           OSTCBCyclesStart;      /* Snapshot of cycle counter at start of task resumption   */
    OS_STK          *OSTCBStkBase;          /* Pointer to the beginning of the task stack              */
    INT32U           OSTCBStkUsed;          /* Number of bytes used from the stack                     */
#endif

#if OS_TASK_NAME_SIZE > 1
    INT8U            OSTCBTaskName[OS_TASK_NAME_SIZE];
#endif
} OS_TCB;
其中
OSTCBStkPtr--任务栈的指针,在任务中使用到的所有零时变量(包括任务切换时需要保存的上下文)都保存在OSTCBStkPtr指向的存储区域
OSTCBExtPtr--任务扩展数据信息指针,目前我理解这一部分主要用于保存任务名字的ASCII码
OSTCBStkBottom--任务栈底指针
OSTCBStkSize--任务栈的大小
OSTCBNext--任务控制块链表中的下一任务指针
OSTCBPrev--任务控制块链表中的上一任务指针
OSTCBEventPtr--任务等待时间指针,该数据结构本身是属于一个事件的,任务也只是属于事件的一个候选资源
OSTCBEventMultiPtr--互斥信号量指针
OSTCBMsg--邮箱指针



任务私有栈--是任务执行过程或者任务数据切换过程用于存放零时数据的一片内存区域
任务链表--为了便于管理ucOS将多个任务用链表的方式串接起来,这个链表称为任务链表
空任务链表--也是为了便于内存分配,ucOS在编译的时候就决定了整个系统最多支持多少个任务,同时就为这些任务预留了相应的任务控制块,这部分任务控制块就被称为空任务链表。在真正需要使用任务的时候,将从空任务链表中获取任务控制块到任务控制链表中
当前运行任务指针--指向当前正在运行的任务控制块
任务链表索引--为了更快的查找任务链表,ucOS建立了一个指向所有任务控制块的数组,这个数组就是任务链表索引。该索引以优先级排序
任务就绪表--已经就绪的任务表
任务就绪表索引
任务就绪表辅助登记表--一下三张表都是ucOS为了查找任何一个任务都使用相同的查找时间使用的额外表,它们的唯一作用就是保证系统的时效性
任务就绪表辅助注销表
任务就绪表辅助查找表
 
 
全局变量不完全统计:
OSLockNesting
OSIntNesting
OSCtxSwCtr
OSPrioHighRdy
OSPrioCur
OSTCBHighRdy
OSTCBCur
OSTaskCtr
OSRunning
关键字:ucOS  数据结构 引用地址:ucOS学习笔记(3)——ucOS的数据结构

上一篇:ucOS学习笔记(4)——一步一步移植ucOS到STM32
下一篇:ucOS学习笔记(2)——多任务是如何实现的

推荐阅读最新更新时间:2024-03-16 15:00

ucos-ii示例6:消息量集测试
环境: 主机:WIN8 开发环境:MDK4.72 ucgui版本:3.90 ucos版本:ucos-ii mcu: stm32f103VE 说明: 本示例中task2设置信号量集的最后2位为1,task1读取最后2位,发现是1则显示 源码: #define TASK_STK_SIZE 512 /********************************************************************* * 静态函数 **************************************************************
[单片机]
ucOS学习笔记(2)——多任务是如何实现的
ucOS是一个抢占式多任务操作系统,其核心就是人物调度机制,该机制保证了多个任务在一个MCU上并发执行。 关于多任务实现我们就不得不谈一谈一段程序运行的上下文。所谓程序运行的上下文就是指一段代码(一般以函数为基本单位)运行过程中需要使用到的资源,这个资源被我称之为上下文。这些资源包括当前系统的基本工作寄存器,函数使用到的零时变量,全局变量等等。当这些资源被给定后我们无论在何时去执行一个给定的地址开始的代码都将得到完全相同的结果。下边以具体代码为例讲解该过程,以下代码get_val为一个计算1到10累加和的函数,C代码如下: unsigned char get_val(void) { unsigned char
[单片机]
UCOS在S3C2410上的移植
反反复复弄了一个多星期,参考了不少资料,终于让UCOS在自己的板子上跑起来了。期间遇到了不少问题,还好坚持下来,挺 了过去.....复习一下,记录下来,以当后用: 1.在ADS中建产工程,进入工程界面后,先建立两个组,一个为命名为UCOSII,另一个为S3C2410。 UCOSII,下再建两个组,一个为ARM,添加移植要修改的三个文件,另一个sourc则添加与处理器无关的 UCOS源文件。 S3C2410下主要存放一些与开发板初始化等有关的文件。 2.移植的重点主要在三个有处理器有关的文件OS_CPU.H,Os_cpu_a.s 和Os_cpu_c.c三个文件的编写。 (1)根据书上的移植说明及相关的参考文件,OS
[单片机]
<font color='red'>UCOS</font>在S3C2410上的移植
MC9S08DZ60移植ucos小记
移植之前一直看了任哲老师的那本书,学习了很多,自我感觉有点基础之后,上手移植,本篇只作为一个新手对ucos在MC9S08DZ60移植的理解。 首先,我的底层是从CSDN网站下载的,百度一下,就会和MC9S12XEP100一起出来。下载之后,由于本人对dz60的内核知识还不是很熟悉,按照自己对ucos的理解,移植之后,出现了很多问题,大致包括两种现象:1、系统在空闲任务里面打转,调度不了;2、系统执行一边我自己建立的任务之后,就无法再进行调度,一直在OSTimeTick()函数里面。 下面主要说一下,我是如何解决这种问题或者说其实是自己理解上的错误。 MC9S08DZ60调度任务,是通过,当中断产生之后,SP指针会指
[单片机]
某光电跟踪产品双DSP系统RS422通信设计
0 引言 信息社会的发展,在很大程度上取决于信息与信号处理技术的先进性。数字信号处理技术的出现改变了信息与信号处理技术的整个面貌;而数字处理器作为数字信号处理的核心技术,其应用已经涉及到设计信号处理的各个领域,成为电子系统的心脏。某光电跟踪产品设计了基于TMS320C6201B和ADSP2187L的双DSP的信息处理平台,它提高了对信息的识别处理速度,具有实时性好、控制精度高、抗干扰能力强等特点。一般情况下,可利用JTAG口对DSP进行调试,然而,在整机情况下,这种方式就不太适用了。因而,在本系统中设计了RS 422接口,大大方便了远程调试和整机调试。 1 RS 422通信设计 本系统选用Maxim公司提供的Max4
[嵌入式]
某光电跟踪产品双DSP系统RS422通信设计
ucos-ii学习笔记——信号量的原理及使用
Created on: 2012-10-7 Author: zhang bin 学习笔记 for ucos-ii PC redesigned by zhang bin 2012-10-7 versions :V-0.1 All Rights Reserved #include INCLUDES.h #define TASK_STK_SIZE 512 char *s1= MyTask ; char *s2= YouTask ; INT8U err; //定义一个错误信息 INT8U y=0; OS_EV
[单片机]
uCOS-II的嵌入式串口通信模块设计
在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。uCOS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但uCOS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式Linux)那样提供给用户一些API函数接口。在uCOS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成。串口通信是单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代表性的中断驱动外设。本文以单片机中的串口为例,介绍uCOS II下编写中断服务程序以及外设驱动程序的一般思路。 1 uCOS-II的中断处理及
[单片机]
<font color='red'>uCOS</font>-II的嵌入式串口通信模块设计
在ARM处理器上移植uCOS II的中断处理
uCOS II是一个源码公开、可移植、可固化、可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写。总量约200行的汇编语言部分被压缩到最低限度,以便于移植到任何一种其它的CPU上。 uCOS II最多可支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持Semaphore (信号量)、Mailbox (邮箱)、MessageQueue(消息队列)等多种常用的进程间通信机制。与大多商用RTOS不同的是,uCOS II公开所有的源代码.并可以免费获得,只对商业应用收取少量License费用。 uCOS II移植跟OS_CUP_C.C、OS_CPU_A.
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved