uCOS-II内核之任务控制块

深入理解uCOS-II内核之任务 0. 阐述对任务的理解,对比任务与C函数的异同点。 从代码上看,uCOS-II的任务就是一个函数。但是只是采用函数的形式,仅仅借用了函数的一些特性,用函数来来存储代码而已。它不是通过不同的代码来区分不同的任务,而是通过不同的任务堆栈和不同的任务优先级来进行区分。类似与C++和JAVA中的函数重载。 例如,我们可以创建10个任务的任务代码的指针都是Task,这意味着这10个任务共用一段代码,但它们有不 阅读详情
uCOS-II内核之任务控制块
前面的学习已经了解过任务控制块。知道任务在创建的时候,任务控制块会被初始化。任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,ucos II用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。OS­­_TCBs全部驻留在RAM中。
 
任务控制块的定义程序如下所示:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #if OS_TASK_CREAT_EXT_EN > 0  
  2.   typedef struct{  
  3.           INT32U  OSFree;           //Numbers of free bytes on the stack  
  4.           INT32U  OSUsed;           //Numbers of bytes used on the stack  
  5.   }OS_STK_DATA;  
  6. #endif  
  7.    
  8. typedef struct os_tcb {  
  9.     OS_STK        *OSTCBStkPtr;  
  10.    
  11. #if OS_TASK_CREATE_EXT_EN  
  12.     void          *OSTCBExtPtr;  
  13.     OS_STK        *OSTCBStkBottom;  
  14.     INT32U         OSTCBStkSize;  
  15.     INT16U         OSTCBOpt;  
  16.     INT16U         OSTCBId;  
  17. #endif  
  18.    
  19.     struct os_tcb *OSTCBNext;  
  20.     struct os_tcb *OSTCBPrev;  
  21.    
  22. #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN  
  23.     OS_EVENT      *OSTCBEventPtr;  
  24. #endif  
  25.    
  26. #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN  
  27.     void          *OSTCBMsg;  
  28. #endif  
  29.    
  30.     INT16U         OSTCBDly;  
  31.     INT8U          OSTCBStat;  
  32.     INT8U          OSTCBPrio;  
  33.    
  34.     INT8U          OSTCBX;  
  35.     INT8U          OSTCBY;  
  36.     INT8U          OSTCBBitX;  
  37.     INT8U          OSTCBBitY;  
  38.    
  39. #if OS_TASK_DEL_EN  
  40.     BOOLEAN        OSTCBDelReq;  
  41. #endif  
  42. } OS_TCB;  

大家可以看到,任务控制块是结构体数据结构。

.OSTCBStkPtr是指向当前任务栈顶的指针。uCOS-II允许每个任务有自己的栈,更重要的是,每个任务的栈的容量可以是任意的。有些商业内核要求所有任务栈的容量都一样,除非用户写一个复杂的接口函数来改变它。这种限制浪费了RAM,当各任务需要的栈空间不同时,也得按任务中预期栈容量需求最多的来分配栈空间。OSTCBStkPtr是OS_TCB数据结构中唯一的一个能用汇编语言来处置的变量(在任务切换段的代码Context-switching code之中,)把OSTCBStkPtr放在数据结构的最前面,使得从汇编语言中处理这个变量时较为容易。


.OSTCBExtPtr 指向用户定义的任务控制块扩展。用户可以扩展任务控制块而不必修改μC/OS-Ⅱ的源代码。.OSTCBExtPtr只在函数OstaskCreateExt()中使用,故使用时要将OS_TASK_CREAT_EN设为1,以允许建立任务函数的扩展。例如用户可以建立一个数据结构,这个数据结构包含每个任务的名字,或跟踪某个任务的执行时间,或者跟踪切换到某个任务的次数。注意,uCOS-II作者将这个扩展指针变量放在紧跟着堆栈指针的位置,为的是当用户需要在汇编语言中处理这个变量时,从数据结构的头上算偏移量比较方便。


.OSTCBStkBottom是指向任务栈底的指针。如果微处理器的栈指针是递减的,即栈存储器从高地址向低地址方向分配,则OSTCBStkBottom指向任务使用的栈空间的最低地址。类似地,如果微处理器的栈是从低地址向高地址递增型的,则OSTCBStkBottom指向任务可以使用的栈空间的最高地址。函数OSTaskStkChk()要用到变量OSTCBStkBottom,在运行中检验栈空间的使用情况。用户可以用它来确定任务实际需要的栈空间。这个功能只有当用户在任务建立时允许使用OSTaskCreateExt()函数时才能实现。这就要求用户将OS_TASK_CREATE_EXT_EN设为1,以便允许该功能。


.OSTCBStkSize存有栈中可容纳的指针数目而不是用字节(Byte)表示的栈容量总数。也就是说,如果栈中可以保存1,000个入口地址,每个地址宽度是32位的,则实际栈容量是4,000字节。同样是1,000个入口地址,如果每个地址宽度是16位的,则总栈容量只有2,000字节。在函数OSStakChk()中要调用OSTCBStkSize。同理,若使用该函数的话,要将OS_TASK_CREAT_EXT_EN设为1。
 
.OSTCBOpt把“选择项”传给OSTaskCreateExt(),只有在用户将OS_TASK_CREATE_EXT_EN设为1时,这个变量才有效。UcosII目前只支持3个选择项(见uCOS_II.H):OS_TASK_OTP_STK_CHK, OS_TASK_OPT_STK_CLR和OS_TASK_OPT_SAVE_FP。 OS_TASK_OTP_STK_CHK  用于告知TaskCreateExt(),在任务建立的时候任务栈检验功能得到了允许。OS_TASK_OPT_STK_CLR表示任务建立的时候任务栈要清零。只有在用户需要有栈检验功能时,才需要将栈清零。如果不定义OS_TASK_OPT_STK_CLR,而后又建立、删除了任务,栈检验功能报告的栈使用情况将是错误的。如果任务一旦建立就决不会被删除,而用户初始化时,已将RAM清过零,则OS_TASK_OPT_STK_CLR不需要再定义,这可以节约程序执行时间。传递了OS_TASK_OPT_STK_CLR将增加TaskCreateExt()函数的执行时间,因为要将栈空间清零。栈容量越大,清零花的时间越长。最后一个选择项OS_TASK_OPT_SAVE_FP通知TaskCreateExt(),任务要做浮点运算。如果微处理器有硬件的浮点协处理器,则所建立的任务在做任务调度切换时,浮点寄存器的内容要保存。
 
.OSTCBId用于存储任务的识别码。这个变量现在没有使用,留给将来扩展用。
 
.OSTCBNext和.OSTCBPrev用于任务控制块OS_TCBs的双重链接,该链表在时钟节拍函数OSTimeTick()中使用,用于刷新各个任务的任务延迟变量.OSTCBDly,每个任务的任务控制块OS_TCB在任务建立的时候被链接到链表中,在任务删除的时候从链表中被删除。双重连接的链表使得任一成员都能被快速插入或删除。
 
.OSTCBEventPtr是指向事件控制块的指针。
 
.OSTCBMsg是指向传给任务的消息的指针。
 
.OSTCBDly当需要把任务延时若干时钟节拍时要用到这个变量,或者需要把任务挂起一段时间以等待某事件的发生,这种等待是有超时限制的。在这种情况下,这个变量保存的是任务允许等待事件发生的最多时钟节拍数。如果这个变量为0,表示任务不延时,或者表示等待事件发生的时间没有限制。
 
.OSTCBStat是任务的状态字。当.OSTCBStat为0,任务进入就绪态。可以给.OSTCBStat赋其它的值,在文件uCOS_II.H中有关于这个值的描述。
 
.OSTCBPrio是任务优先级。高优先级任务的.OSTCBPrio值小。也就是说,这个值越小,任务的优先级越高。
 
.OSTCBX, .OSTCBY, .OSTCBBitX和 .OSTCBBitY用于加速任务进入就绪态的过程或进入等待事件发生状态的过程(避免在运行中去计算这些值)。这些值是在任务建立时算好的,或者是在改变任务优先级时算出的。
 
这些参数值在ucos II其它的API函数经常被用到。很多API函数本质上来说就是改变这个结构体里面的参数的值而已。

为什么AI时代的优秀组织,都在学习Meta的Pod结构?看完秒懂 当AI技术重塑产业格局,企业协作正面临前所未有的挑战——层级繁琐、跨部门内耗、迭代滞后,传统组织模式早已难以跟上技术革新的步伐。作为全球AI原生企业的标杆,Meta独创的Pod组织模式,用“小而美”的自治单元打破困局,成为AI时代高效协作的典范。本文将从定义、运作、价值到未来演进,全面拆解Pod模式,为企业组织变革提供可参考的思路与路径。德鲁克曾说:“组织的功能就是让平凡的人做平凡的事。”而Meta Pod打破这一局限,通过去中心化、指标导向、跨界融合,让优秀人才产生“化学反应”。 阅读详情

相关推荐

国产麒麟系统下用Rider开发C#桌面应用:从环境配置到Avalonia UI实战

本文详细介绍了在国产麒麟系统上使用JetBrains Rider开发C#桌面应用的完整流程,重点讲解了Avalonia UI框架的实战应用。从环境配置、Rider安装到Avalonia项目创建和UI开发技巧,全面覆盖了在非Windows环境下进行C#开发的关键步骤和优化建议,助力开发者高效构建跨平台桌面应用。

weixin_27791839的博客 387

uCOS-II的任务控制块

uCOS-II的任务控制块标签:  uCOS-II  2009-12-01 14:45 任务控制块:任务控制块是一个结构体数据结构,用于记录各个任务的信息。当任务的CPU的使用权被剥夺时,uCOS-II用它来保存任务的当前状态。当任务重新获得CPU的使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差的继续执行。任务控制块全部存放在RAM中。typedef s

wchp314的专栏 3573

5分钟搞定!用MCU GPIO实现零功耗一键开关机电路(附完整原理图)

本文详细介绍了如何利用MCU GPIO设计零功耗一键开关机电路,适用于便携式设备和电池供电项目。通过软硬件结合的方式,实现关机状态下的真正零功耗,同时提供智能开关机控制。文章包含完整原理图、元件选型指南和实际搭建技巧,帮助开发者在5分钟内完成高效电源管理方案。

weixin_28339967的博客 342

UC/OS II任务管理(1)之任务控制块

任务状态 UCOSII任务状态一共有睡眠、就绪、阻塞、运行、以及中断挂起五种状态。 睡眠态(Dormant):任务已经在内存中装入,但是还没有进行任务运行的所需要的条件。 就绪态(Ready):是任务已经做好运行的一切准备了,就只差调度程序调度,将CPU让给运行。 阻塞态(Waiting):当任务因为需要某些资源或条件,得不到满足的时候,或者是任务需要等待一定的时间的时候,任务设置为阻塞态

大树的专栏 2785

【小程序】支付宝直付通解决方案

支付宝直付通是支付宝为小程序提供的一种支付解决方案,可以实现小程序中直接使用支付宝进行支付。以上是一个简单的支付宝直付通解决方案及相关代码示例。具体的使用还需要根据自己的业务需求进行定制化开发和调整。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1281

深信服 SANGFOR 设备密码恢复和配置备份恢复

、恢复密码 当我们拿到一台设备要去配置管理的时候,首先是要确认设备的登录IP,其次就是确认设备控制台登录密码。不知情的情况下如何找到设备的登录IP,请参考文档: http://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=9484 下文中提到的关于“网关升级客户端”的一些功能,也请参考此文档。 那么恢复密码,大家都知道有2种方法:U盘恢复密码、交叉线恢复密码。 1、U盘恢复密码 注意:仅恢复admin密码,不影响配置。 U盘恢复密码的前

李先生在闯荡江湖 1万+

UCOSII操作系统之任务控制块(OS_TCB)

UCOSII操作系统之任务控制块

qq_35225556的博客 1281

QT应用编程: 基于UDP协议设计的大文件传输软件

一、环境介绍 QT版本: 5.12.6 编译器: MinGW 32 传输协议: UDP 功能介绍:软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件;服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。...

2803

ucosii任务三要素---执行代码 堆栈 任务控制块

使用ucosii也有一段时间了,把学习到的总结一下。这篇文章不是对ucosii如何使用的讲解,而是主要看看ucosii内核实现的原理,或者说讲一些RTOS种通用的知识。对于RTOS基础知识的讲解,暂时就不表述了。RTOS中一个任务的三要素:程序代码、堆栈、任务控制块。程序代码就是任务的执行函数。这没啥好说的每个任务都有自己的堆栈,来保存自身的信息。这是每个任务自己的资源。是每个人自己的一亩三分地。...

进步源于记录,优秀来自分享 5915

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 385

地平线旭日X3 安装xfce桌面+VNC查看USB摄像头

VNC是Virtual Network Computing的缩写,它是一种使用RFB(Remote Frame Buffer)协议的用于控制远程电脑的图形桌面分享系统。xfce桌面相比于GNOME桌面更加轻量,占用的资源更少,在没有GPU的设备上也可以运行(旭日的Desktop版本从外观上好像就是xfce桌面,具体没有尝试)。可以使用专用的VNC客户端连接到开发板,例如vnc viewer。板子默认带有openssh-server,因此,WiFi热点连接成功后,就可以使用ssh登录开发板了。

bingdund的博客 509

Ucos源码分析------任务控制块与任务调度

Ucos源码分析------任务控制块与任务调度

qq_43306777的博客 915

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

uCOS-II内核之任务控制块 [转载]

uCOS-II内核之任务控制块 前面的学习已经了解过任务控制块。知道任务在创建的时候,任务控制块会被初始化。任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,ucos II用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。OS­­_TCBs全部驻留在RAM中。   任务控制块的定义程序如下所示: #if OS_TASK_

我的博客 849

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ucos II 内核学习之二:任务控制块

ucos II 内核学习之二:任务控制块 前面的学习已经了解过任务控制块。知道任务在创建的时候,任务控制块会被初始化。任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,ucos II用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。OS­­_TCBs全部驻留在RAM中。   任务控制块的定义程序如下所示:

专注于嵌入式开发 7921

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ucos II 内核学习之一:任务状态及任务控制块

ucos II 内核学习之一:任务状态及任务控制块 一个任务被创建之后,可以处于以下五种状态之一。 这五种状态分别是: 1.       睡眠状态 2.       就绪状态 3.       等待状态 4.       中断服务状态 5.       执行状态 下面简单介绍下各状态的含义及各状态切换的方法。     睡眠状态:睡眠态(DORMANT)指任务驻留在程序空间之中,还

专注于嵌入式开发 9036

UCOS-II内核结构(1)------任务控制模块OSTCB

任务控制块的数据结构如下:typedef struct os_tcb { OS_STK *OSTCBStkPtr; /* Pointer to current top of stack */ #if OS_TASK_CREATE_EXT_EN > 0 void *OSTCBEx

qingbin_bai的专栏 2476

UCOS/UCOSII基础知识

 ◆ 任务,在UCOS-ii实时系统中,一个任务其实就是一个线程,该任务可以认为CPU完全属于它自己。UCOS-ii中的任务拥有自己的堆栈和CPU寄存器,并且赋予一定的优先级,在UCOS-ii中,它可能处于睡眠、就绪、运行、等待、中断服务状态之一。具体这5种状态的定义请看《UCOS Learning Notes N.O. 01》。◆ 基于优先级的内核有两种:不可剥夺型和可剥夺型。不可剥夺型

ly56086566的专栏 2851

uCOS-ii笔记

ucos ii system 文件结构 上层: 应用软件,用户代码 中层: 与处理器无关代码 与应用程序相关配置文件 与处理器有关代码 下层: 硬件(cpu,interupt,timer,gpio,iis…) 内核结构 ucos的内核机构可以从以下的代码可以看出,应用支持10个事件控制块,5个事件标志...

aihuanyou6758的博客 313

UCOS内核结构学习笔记

呵呵,大家好,暑假一直在实验室,校园网一直打不开我的BLOG,全国大赛结束后,我虽然没有参加,但是我也是经历了的,只是没有参赛而已。呵呵,感觉全国大赛不是比各高校学生的能力,而是各高校老师的能力。相信经历过的人应该清楚。 这是暑假写的笔记,刚才初步整理了一下,希望对大家用。 ◆ 任务,在UCOS-ii实时系统中,一个任务其实就是一个线程,该任务可以认为CPU完全属于它自己。UCOS-ii中的任

风来风云 801

ucos-5-内核结构

转自:http://blog.chinaunix.net/uid-26729065-id-3082021.html内核中主要包含以下的文件:1.uCOS-II Source->source:(与处理器类型无关的代码)OS_CORE.C系统初始化,开启多任务环境等的代码OS_CPU_C.C多任务栈初始化等与处理器有关的代码OS_FLAG .C事件标志组管理代码OS_M...

weixin_34128501的博客 192

ucos-ii复习

uCOS-II基础知识点归纳 TCB内容 ucosii.h中,对TCB定义如下 (截取重要的): typedef struct os_tcb { OS_STK *OSTCBStkPtr; // 堆栈栈顶指针 ... struct os_tcb *OSTCBNext; // 指向下一个TCB的指针 struct os_tcb *OSTCBPrev; // 指向上一个TCB的指针 ... INT16U OSTCBDl

m0_49267873的博客 406

uCos-II原理与ARM应用程序设计(一)

1、将uCos-II移植到ARM9开发板上    1)搞清应用程序(user子目录)、uCos-II内核文件(ucosii目录)、移植文件(ports子目录)和BSP(ports子目录)之间的关系。    2)移植文件(ports子目录文件)介绍    bsp.h:宏定义一些芯片外设寄存器地址和自定义函数声明;    bsp.c:OS_CPU_ExceptHndlr()用户编写的中断处理函

Roson 766

uCOS-II内核之时钟节拍 [转载]

uCOS-II内核之时钟节拍 在uCOS-II里,时钟节拍就好比是人的心脏一样重要。它对于CPU能顺利在各任务间切换有着至关重要的作用。 uCOS-II需要用户提供时钟源。使用时钟源有一个特别需要注意的地方:用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。 Ucos II中的时钟节拍服务是通过在定时器中断服务子程序中调用OSTimeTick()实现的。 O

我的博客 4139

UCOSII学习---一、OSInit()

第一步: OSInit();//初始化uCOS_II.该函数位于OS_CORE.C,主要工作如下: 函数原型位于OS_CORE.C OS_InitMisc(); /* 基础参数初始化 Initialize miscellaneous(混杂的,各种各样的) variables */ OS_InitRdyList(); /* 初始化任务就绪表 Initialize the Read...

ROM7RAM的博客 739
上一篇: uCOS-II任务间通信之邮箱
下一篇: uCOS-II内核学习之任务调度
root_robot
博客等级 码龄10年 97粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值