STM32---ucosii和ucosiii

news/2024/12/5 7:00:40/

一、关于ucos

几个 UCOSII 相关的概念需要大家了解一下。任务优先级,任务堆栈,任务控制块,任务就绪表和任务调度器。
任务优先级,这个概念比较好理解, ucos 中,每个任务都有唯一的一个优先级。优先级是任务的唯一标识。在 UCOSII 中,使用 CPU 的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得 CPU 使用权,只有高优先级的任务让出 CPU 使用权(比如延时)时,低优先级的任务才能获得 CPU 使用权。 UCOSII 不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。

任务堆栈,就是存储器中的连续存储空间。为了满足任务切换和响应中断时保存 CPU 寄存器中的内容以及任务调用其他函数时的需要,每个任务都有自己的堆栈。在创建任务的时候,任务堆栈是任务创建的一个重要入口参数。

任务控制块 OS_TCB,用来记录任务堆栈指针,任务当前状态以及任务优先级等任务属性。
UCOSII 的任何任务都是通过任务控制块(TCB)的东西来控制的,一旦任务创建了,任务控制块 OS_TCB 就会被赋值。每个任务管理块有 3 个最重要的参数:1,任务函数指针; 2,任务堆栈指针; 3,任务优先级;任务控制块就是任务在系统里面的身份证(UCOSII 通过优先级识别任务),任务控制块我们就不再详细介绍了,详细介绍请参考任哲老师的《嵌入式实时操作系统 UCOSII 原理及应用》一书第二章。

任务就绪表, 简而言之就是用来记录系统中所有处于就绪状态的任务。它是一个位图,系统中每个任务都在这个位图中占据一个进制位,该位置的状态(1 或者 0)就表示任务是否处于就绪状态。

任务调度 的作用一是在任务就绪表中查找优先级最高的就绪任务,二是实现任务的切换。比如说,当一个任务释放 cpu 控制权后,进行一次任务调度,这个时候任务调度器首先要去任务就绪表查询优先级最高的就绪任务,查到之后,进行一次任务切换,转而去执行下一个任务。关于任务调度的详细介绍,请参考《嵌入式实时操作系统 UCOSII 原理及应用》一书第三章相关内容。UCOSII 的每个任务都是一个死循环。
每个任务都处在以下 5 种状态之一的状态下,这 5种状态是:睡眠状态、 就绪状态、 运行状态、 等待状态(等待某一事件发生)和中断服务状态。
睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。
就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低, 还暂时不能运行,这时任务的状态叫做就绪状态。
运行状态,该任务获得 CPU 使用权,并正在运行中,此时的任务状态叫做运行状态。
等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把 CPU 的使用权让给别的任务而使任务进入等待状态。
中断服务状态,一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。
UCOSII 任务的 5 个状态转换关系如图 56.1.2 所示:
在这里插入图片描述在这里插入图片描述

二、关于ucosii和ucosiii

1、 可剥夺多任务管理:
都是属于可剥夺的多任务内核,总是执行当前就绪的最高优先级任务;

2、同优先级任务的时间片轮转调度:
UCOSII任务优先级必须不一致,高优先级的任务就是先被执行,UCOSSII允许一个任务优先级被多个任务使用,当这个优先级处于最高就绪态的时候,UCOSIII就会轮流调度处于这个优先级的所有任务,让每个任务运行一段由用户指定的时间长度,叫做时间片;

3、极短的关中断时间:
UCOSIII可以采用锁定内核调度的方式而不是关中断的方式来保护临界代码,这样就可以将关中断的时间降到最低,似的UCOSIII能够非常迅速的响应中断请求

4、任务数据不受限制:
UCOSII 早期版本只支持 64 个任务,但是从 2.80 版本开始,支持任务数提高到 255 个。 UCOSII 保留了最高4 个优先级和最低 4 个优先级的总共 8 个任务,用于拓展使用,实际上, UCOSII 一般只占用了最低 2 个优先级,分别用于空闲任务(倒数第一)和统计任务(倒数第二),所以剩下给我们使用的任务最多可达 255-2=253 个(V2.91)。

UCOSIII本身是没有任务数据限制的,但是从实际的应用者角度考虑,任务数据会受到CPU所使用的存贮空间的限制,包含代码空间和数据空间

5、优先级数量不受限制,UCOSIII支持无限多的任务优先级
在这里插入图片描述
在这里插入图片描述
三、


http://www.ppmy.cn/news/213956.html

相关文章

C++中sizeof,strlen(),size(),length()的区别

strlen(),size(),length()用于求字符串的长度,sizeof用于求对象的字节大小 sizeof本质上是一个运算符,它会返回保证能容纳所建立的最大对象的空间大小,其值在编译时便计算好了,所以不能用于计算动态分配的…

ZigBee 3.0(ZCL,ZHA)

文章目录 1、ZigBee 3.0 ZCL 基础概念1.1 Profile1.2 Device ID1.3 Cluster ID1.4 Attribute(属性)1.5 Command(命令) 2、ZigBee 3.0 ZHA 1、ZigBee 3.0 ZCL 基础概念 ZCL(ZigBee 集群库)包含各种应用的 P…

MiniUI属性

<div id"yjsYhzGrid" ----设置ID class"mini-datagrid" multiSelect"false" ----若属性值为false&#xff0c;则只能选中一行&#xff1b;反之可以选择多行。&#xff08;默认属性值为false&#xff09; showSummaryRow"true" -…

miniui 属性

miniui 值的变化&#xff1a; 主要监听下拉框 单选框值的变化。 onvaluechanged“函数” 隐藏代码块 标签 document.getElementById(“id绑定内容”).style.display“none”; 显示代码块 标签 document.getElementById(“id”).style.display“block”; 禁用标签 mini.get(“id…

microblaze c语言,MicroBlaze

转自http://blog.163.com/gcs_gcs/blog/static/17448606620121193113914/ 在最近的工程中,需要用到PS/2键盘和鼠标作为控制输入,所以在网上找了一些相关的资料,内容很丰富,看来已经有很多人做过了这方面的编程。本篇Blog算是实践总结,为以后的开发积累一些基础知识。 Micr…

Yolo-Z

yolo太卷了...这里是改进的YOLOv5用于小目标检测 论文地址&#xff1a;https://arxiv.org/pdf/2112.11798.pdf 随着自动驾驶汽车和自动驾驶赛车越来越受欢迎&#xff0c;对更快、更准确的检测器的需求也在增加。 虽然我们的肉眼几乎可以立即提取上下文信息&#xff0c;即使是…

Z变换(Z-transform)

Z变换(Z-transform) 定义 X ( z ) ∑ n − ∞ ∞ x ( n ) z − n x ( n ) 1 2 π j ∮ c X ( z ) z z − 1 d z X(z)\sum_{n-\infty}^{\infty}x(n)z^{-n}\\ x(n)\frac{1}{2\pi j}\oint_c X(z)z^{z-1}dz X(z)n−∞∑∞​x(n)z−nx(n)2πj1​∮c​X(z)zz−1dz 收敛域&#…

linux黑域补丁,努比亚Z17mini+Z17+Z17S Nubia6.0典藏版 独家黑域 ROOT XP 特别推荐

>>> 刷 机 须 知 <<< 【本ROM源于努比亚UI6.0制作,转载请注明出处】 如果你喜欢丰富的高级设置,那就不要继续往下看了,本ROM以简洁为主,纯净为本,追求最本真的一加 这也许是最简洁的ROM,因为仅仅针对用户喜欢的,来做了添加,删繁就简,快如闪电 如果你…