嵌入式操作系统_第4章 ucOS-II - 任务任务控制块及链表

合集下载

嵌入式实时操作系统uCOS-II_吴永忠

嵌入式实时操作系统uCOS-II_吴永忠

1.1.1.1嵌入式应用的起源
1946.2.15 ENIAC (Electronic Numerical Integrator And Computer)
长30.48米,宽1米,30个操作台重达30吨 耗电量150千瓦 造价48万美元。 它包含了17,468 真空管,7,200水晶 二极管, 1,500 中转, 70,000 电阻器, 10,000 电容器, 1500继电器,6000多个开关 每秒执行5000次加法或400次乘法,是继电器计 算机的1000倍、手工计算的20万倍。
BC NG
1.1嵌入式系统的基本概念
1.1.1 嵌入式系统的发展概况
1.1.1.1 嵌入式应用的起源 1.1.1.2 计算机技术的分化 1.1.1.3 两大分支的发展方向
1.1.2 嵌入式系统的定义 1.1.3 嵌入式系统的特点
BC NG
1.1嵌入式系统的基本概念
1.1.1 嵌入式系统的发展概况
计算机技术的分化----后PC时代
在早期,由于嵌入式应用范围比较狭窄,大多用于工业控 制领域,人们还可以勉强将通用计算机通过改装、加固、 定制专业软件等方法,嵌入到大型系统中去实现嵌入式应 用,但随着经济、技术的高速发展,嵌入式应用越来越广 泛,已经深入到我们生活中的方方面面,比如:小到彩电、 空调、洗衣机、手机,大到飞机、导弹、汽车等等,嵌入 式应用对计算机的功能、体积、功耗、价格、重量、可靠 性等方面的要求越来越苛刻,通过改造通用计算机的传统 方法远远不能胜任。 因此,嵌入式计算机不得不脱离通用计算机系统走上了独 立发展的道路。这就形成了现代计算机两大分支并行发展 的时期,也称为后PC时代。
在单片机的发展道路上,曾出现过两种探索模式,即“Σ模式”和 “创新模式”。

嵌入式实时操作系统ucosII

嵌入式实时操作系统ucosII
Ⅱ是稳定可靠的,可用在与人性命攸关的安全紧要的系统上。本课程讲授的就 是μC/OS-Ⅱ。它是一个十分小的内核。
10
学习嵌入式操作系统
学习一种实时操作系统RTOS,如uc/OS,掌握实时系统的 概念和设计方法;
嵌入式系统以应用为中心,应用时选择“适用”的操作系 统;
知道如何剪裁操行系统; 嵌入式Linux、eCos; 自己“写”RTOS——一种学习态度; 由于嵌入式系统自身的特点,采用的程序设计语言是汇编
许多早期的嵌入式系统开发者认为嵌入式系统不需要操作系统,但现在除了 最简单的系统外,越来越多的嵌入式系统都引入了操作系统,比如中断驱动系统 在引入嵌入式操作系统之后,系统的可靠性、安全性、可扩展性、功能性、灵活 性、可管理性都大大提高。当然,我们这里所讲的嵌入式操作系统不一定是UcOS、 VxWorks、WinCE、Linux等通用产品,也包括开发者自己编写的专用嵌入式操作 系统。
语言、C/C++语言、JAVA语言。所用的编译器应与处理 器相适应。
11
RTOS在嵌入式系统中的位置
应用
FS C/C++ 设备驱动
RTOS
KERNEL 调试工具
其它组件 TCP/IP 设备I/O
BSP(板级支持包) 嵌入式硬件平台
12
第二讲 C/OS –II及任务
µC/OS-II的特点 µC/OS-II文件结构与内核 µC/OS-II任务及其存储结构 µC/OS-II任务控制块与任务堆栈 µC/OS-II系统的任务、空闲任务与统计任务
实时嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。 商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往
价格昂贵,如Vxworks、QNX、WinCE、Palm OS等。 免费型的实时操作系统在价格方面具有优势,目前主要有Linux、eCos和

嵌入式实时操作系统uCOS-II(就绪算法)

嵌入式实时操作系统uCOS-II(就绪算法)

OSTCBTbl[1]
OSTCBStkPtr
OSTCBTbl[0]
OSTCBStkPtr
OSTCBNext
OSTCBTbl[2]
OSTCBStkPtr OSTCBNext
OSTCBTbl[n]
OSTCBStkPtr OSTCBNext NULL
OSTCBNext
NULL
20
任务控制块数组与指针
OSTCBFreeList
OSTCBPrioTbl[ ]
[0] [4] [5]
NULL
… &OSTCBTBL[1] &OSTCBTBL[2]

[OS_LOEEST_PRIO] &OSTCBTBL[0]
OS_TaskIdle
15
任务控制块数组与指针
OSTCBPrioTbl[
]
任务的优先级资源由操作系统提供,uc/OS-II 有64各优先级,优先级的高低按照编号从0(最高) 到63(最低)排序。由于用户实际使用的优先级的 个数通常少于64个,所以为节约系统资源,可以通 过定义系统常量OS_LOWEST_PRIO的值来限制优 先级编号的范围。
OSTCBTbl[2]
OSTCBStkPtr OSTCBNext
OSTCBTbl[n]
OSTCBStkPtr OSTCBNext NULL
NULL
13
任务控制块数组与指针
OSTCBPrioTbl[
]
任务控制块优先级表,专门用来存放指向各任 务控制块的指针,并按任务的优先级别将这些指针存 放在数组的各个元素里,这样系统在访问一个任务的 任务控制块时,就不必遍历任务控制块链表了。只要 知道任务的优先级,就可以迅速地从该数组中找到它 的任务控制块。

嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第四部分D

嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第四部分D

.OSTCBOpt 存放有关任务的附加信息。

当用户将OS_TASK_CREATE_EXT_EN设为1 时,这个变量才有效。

通过设置该选项,可起用任务栈检查功能。

例如:作为参数传给OSTaskCreateExt()。

μC/OS-Ⅱ目前只支持 3 个选择项:OS_TASK_OTP_STK_CHK, OS_TASK_OPT_STK_CLR 和OS_TASK_OPT_SAVE_FP 。

OS_TASK_OTP_STK_CHK 用于告知TaskCreateExt(),在任务建立的时候任务栈检验功能得到了允许。

S_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。

OSTCBNext、OSTCBPrev:用于将任务控制块OS_TCB插入到空闲链表;或在任务建立的时候链接到双向使用链表中;或在任务删除的时候从链表中被删除。

嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第四部分E

嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第四部分E

根据给定的优先级通过设定就续表,使任务进入就绪态(参见程序清单L3.1.7)的例子:●假设要使优先级为12的任务进入就绪状态,12(1100b)即任务的标识号,就是要将OSRdyTbl[1]的第4位置1,且将OSRdyGrp的第1位置1。

依照算法,将该任务放入就绪表的相应数学表达式为:OSRdyGrp |=0x02 ;OSMapTbl[12>>3]OSRdyTbl[1] |=0x10 ;OSMapTbl[4]●而要让优先级为21的任务进入就绪态,21(10101b)即任务的标识号,就是要将OSRdyTbl[2]的第5位置1,且将OSRdyGrp的第2位置1。

依照算法,将该任务放入就绪表的相应数学表达式为:OSRdyGrp |=0x04 ;OSMapTbl[21>>3]OSRdyTbl[2] |=0x20 ;OSMapTbl[5]从上面的计算可知:若要将OSRdyGrp及OSRdyTbl[]的第n位置1,可通过分别把OSRdyGrp及OSRdyTbl[]的值与2n 相或来实现。

在μC/OS-Ⅱ中,已经把2n的n=0-7的8个值先计算好作为常数存在数组OSMapTbl[7]中了,这正是前面的表3.1 OSMapTbl[]: OSMapTbl[0] = 20 = 0x01(0000 0001)OSMapTbl[1] = 21 = 0x02(0000 0010)……OSMapTbl[4] = 24 = 0x10(0001 0000)……OSMapTbl[7] = 27 = 0x80(1000 0000)(4)任务调度器调度是内核的主要职责之一,就是要决定该轮到哪个任务运行了。

在时间片轮转调度法中,当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间片,然后切换给另一个任务。

所以,也叫做时间片调度。

内核在满足以下条件时,把CPU控制权交给下一个处于就绪态的任务:●当前任务已无事可做●当前任务在时间片还没结束时已经完成了。

嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第一部分

嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第一部分

目录学习情境一、嵌入式系统概述及集成环境的搭建与使用 (1)一、知识要点:嵌入式系统概述 (1)1.嵌入式系统基本概念 (1)2.嵌入式系统的特点 (2)3.嵌入式系统的应用领域 (3)(1)工业控制领域 (3)(2)信息家电 (4)(3)交通管理、环境监测、医疗仪器 (4)(4)嵌入式Internet应用 (4)(5)军事国防领域 (5)4.嵌入式系统的发展 (6)5.嵌入式系统的开发流程 (7)6.嵌入式系统的调试 (10)(1)在线仿真器(ICE)方式 (10)(2)在线调试器(ICD)方式 (11)(3)监控器方式 (11)7.基于μCOS-Ⅱ的嵌入式系统软件体系结构 (11)二、技能要求:嵌入式系统交叉开发环境的搭建 (2)1.交叉开发环境 (2)2.使用集成开发环境进行软件开发的流程 (2)3.ARM ADS集成开发工具及其组成 (3)(1)ADS集成开发工具 (3)(2)ADS集成开发工具的组成 (3)案例1.ADS 1.2的安装 (4)案例2.ADS集成开发环境的使用 (5)(1)新建工程 (5)(2)配置新建工程 (6)(3)添加文件,完成编译与链接,并生成目标文件.......... 错误!未定义书签。

案例3.其它工具的使用 .............................................................................. 错误!未定义书签。

(1)仿真器的连接与使用................................ 错误!未定义书签。

(2)超级终端的设置及映像下载.......................... 错误!未定义书签。

(3)Source Insight代码编辑器的使用.................... 错误!未定义书签。

学习情境二、嵌入式平台的接口驱动................................................................... 错误!未定义书签。

UCOSII操作系统课程设计

UCOSII操作系统课程设计

UCOSII操作系统课程设计一、课程目标知识目标:1. 理解UCOSII操作系统的基本原理和核心概念,包括任务管理、时间管理、通信与同步机制;2. 掌握UCOSII的移植方法和配置过程,学会在不同硬件平台上搭建UCOSII 操作系统环境;3. 学会使用UCOSII提供的API进行多任务编程,了解实时操作系统的任务调度和资源管理策略。

技能目标:1. 能够运用C语言在UCOSII环境下编写多任务应用程序,实现任务间的同步与通信;2. 能够分析并解决实际嵌入式系统开发中与操作系统相关的问题,提高系统稳定性和可靠性;3. 掌握UCOSII调试技巧,能够运用调试工具对操作系统运行状态进行跟踪和分析。

情感态度价值观目标:1. 培养学生对操作系统知识的好奇心和探索精神,激发学习兴趣和热情;2. 培养学生具备良好的团队合作精神和沟通能力,提高解决实际问题的能力;3. 增强学生的创新意识,鼓励他们在实际项目中积极尝试和应用所学知识。

课程性质:本课程为高年级专业课,以实际应用为导向,注重理论与实践相结合。

学生特点:学生已具备一定的C语言编程基础和嵌入式系统知识,具有较强的学习能力和实践能力。

教学要求:教师需采用项目驱动教学法,引导学生通过实际案例掌握UCOSII 操作系统的应用与开发。

在教学过程中,关注学生的个体差异,提供个性化指导,确保课程目标的实现。

同时,注重培养学生的自主学习能力和创新能力,为将来的职业发展打下坚实基础。

二、教学内容1. UCOSII操作系统概述:介绍实时操作系统的基本概念、特点及应用场景,引出UCOSII的背景、架构和优势。

教材章节:第一章 实时操作系统概述2. UCOSII内核原理:讲解UCOSII的核心组件,包括任务管理、时间管理、通信与同步机制等。

教材章节:第二章 UCOSII内核原理3. UCOSII移植与配置:介绍在不同硬件平台上移植和配置UCOSII的方法,以实际案例为例进行讲解。

嵌入式实时操作系统uC OS-2教程(吴永忠)章 (4)

嵌入式实时操作系统uC OS-2教程(吴永忠)章 (4)
第4章 中断处理与时间管理
第4章 中断处理与时间管理
4.1 中断处理的基本概念 4.2 μC/OS-Ⅱ的中断处理 4.3 μC/OS-Ⅱ的时钟节拍 4.4 μC/OS-Ⅱ的时间管理 习题
第4章 中断处理与时间管理
4.1 中断处理的基本概念
4.1.1 中断 中断定义为CPU对系统内外发生的异步事件的响应。异步
中断响应考虑的是系统在最坏情况下的响应中断时间,而 不是平均时间。如某系统100次中有99次在100 μs之内响应中 断,只有一次响应中断的时间是250 μs,只能认为中断响应 时间是250 μs。
第4章 中断处理与时间管理
4.1.4 中断恢复时间 中断恢复时间(Interrupt Recovery)定义为CPU返回到被
第4章 中断处理与时间管理 在前后台系统中:
中断延迟
=
MAX
最长指令 时间
,关 最中 长断 时的 间

中断向量 距转时间
在不可剥夺型和不可剥夺内核中:
中断延迟 = MAX
最长指令 时间
,中用断户时关间
,中内断核时关间 +
中断向量 跳转时间
第4章 中断处理与时间管理
4.1.3 中断响应 中断响应定义为从中断发生起到开始执行中断用户处理程
特点是中断优先级高、延迟时间短、响应快、不能被嵌套、不 能忍受内核的延迟,一般常应用于紧急事件处理,如掉电保护 等。非屏蔽中断的规则如下:
(1) 在非屏蔽中断处理程序中,不能处理临界区代码、不 能使用内核提供的服务。
(2) 在非屏蔽中断处理程序中,参数的传递必须用全程变 量,且全程变量的字节长度必须能够一.6 μC/OS-Ⅱ的中断处理过程示意图
第4章 中断处理与时间管理
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//output this tab for(n=0;n<=0xff;n++) {
if(n%0x10==0) printf("\n");
printf("%3d" , tab[n]); } printf("\n"); }
小结
系统通过查找任务就绪表来 获取待运行任务的优先级
优先级
任务切换过程
其实,调度 器在进行调 度时,在这 个位置还要 进行一下判 断:究竟是 待运行任务 是否为当前 任务,如果 是,则不切 换;如果不 是才切换, 而且还要保 存被中止任 务的运行环
OSRdyGrp D7 D6 D5 D4 D3 D2 00 1 0 1 0
D1 D0 00
OSRdyTbl[y ] D7 D6 D5 D4
0110
D3 D2 00
D1 D0 00
y = OSUnMapTal[OSRdyGrp];
x= OSUnMapTal[OSRdyTbl[y]];
D7 D6 D5 D4 D3 D2 D1 D0 prio=29 0 0 0 1 1 1 0 1
先保护被中 止任务的断
点数据
后恢复待运 行任务的断
点数据
不要企图用PUSH和POP指令来使程序计数 器PC压栈和出栈,因为没有这样的指令。
只好需一变次要通由中一宏断下或O了S_者。TA一SK次_S调W(用)来来使引发 中断动作和过OS程Ct调xS用w指( 令) 可以使PC压栈; 中断返回指令可以执使行P任C出务栈切。换工作
3.4任务就绪表 及
任务调度
多任务操作系统的核心工作就是任务调 度。
所谓调度,就是通过一个算法在多个任 务中确定该运行的任务,做这项工作的函数 就叫做调度器。
μC/OS_II进行任务调度的思想是 “近 似地每时每刻总是让优先级最高的就绪任务 处于运行状态” 。为了保证这一点,它在 系统或用户任务调用系统函数及执行中断服 务程序结束时总是调用调度器,来确定应该 运行的任务并运行它 。

y = OSUnMapTbl[OSRdyGrp]; prio = (INT8U)((y << 3)
+ OSUnMapTbl[OSRdyTbl[y]]);
优先级判定表OSUnMapTbl[256] (os_core.c)
举例: 如OSRdyGrp的值为
00101000B,即0X28,则 查得 OSUnMapTbl[OSRdyGrp] 的值是3,它相应于 OSRdyGrp中的第3位置1;
};
优先级判定表OSUnMapTbl[256]
OSUnMapTbl[]这个数组的生成原则:先把 一个数用二进制表示,然后从低位往高位 数,返回第一次碰到1的位置。比如: OSUnMapTbl[0x111100(60)] = 2。可 以看到,如果要表示8位数的对应关系, 则数组的大小为2^8=256。这也是为什么 OSRdyTbl[],OSRdyGrp采用8位的原因。
多任务操作系统的核心工作就是任 务调度。
所谓调度,就是通过一个算法在多
个任务中任确务定该就运行绪的表任务,做这项工
μC/OS_II进行任务调度 及 作的函数就叫做调度器。 μC/OS_II进行任务调度的思想是
的依据就是任务就绪表 任务调度 “近似地每时每刻总是让优先级最高的 就绪任务处于运行状态” 。为了保证 这一点,它在系统或用户任务调用系统 函数及执行中断服务程序结束时总是调 用调度器,来确定应该运行的任务并运 行它 。
OSRdyGrp | =OSMapTbl[prio>>3]; OSRdyTbl[prio>>3] | = OSMapTbl[prio&0x07];
如果要使一个优先级别为prio的任务脱离就绪 状态则可使用如下类似代码:
if((OSRdyTbl[prio>>3]&=~OSMapTbl[prio&0x07])== 0)
再从代码生成的角度看看是如何得到这个 表的?
编程生成优先级判定表OSUnMapTbl[256]
#include <stdio.h> int main(void) {
int i,t,n; int tab[256]={0}; for(i=0;i<8;i++)
for(t=1;(t<<i)<256;t++) tab[t<<i]=i;
OSRdyGrp&=~OSMapTbl[prio>>3];
在就绪表中查找最高优先级任务
已经知道OSRdyGrp和OSRdyTbl 求优先级最高的任务的优先级,也就是先求 OSRdyGrp的从最低位找,第一个为1的位 置y;再求OSRdyTbl[y]的从最低位找,第 一个为1的位置x;prio=y*8+x; char OSRdyGrp,OSRdyTbl[8]; 如何编程实现?
X OSRdyTbl[prio>>3]
| = OSMapTbl[prio&0x07];
OSRdyGrp
OSRdyTbl[3 ]
D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0
1
1பைடு நூலகம்
把prio为29的任务置为就绪状态
在程序中,可以用类似下面的代码把优先 级别为prio的任务置为就绪状态:
图5-6 在就绪表中查找最高优先级别任务的过程
从任务就绪表中获取优先级别最高的就绪任务可用如下 类似的代码:
y = OSUnMapTal[OSRdyGrp]; //D5、D4、D3位
x = OSUnMapTal[OSRdyTbl[y]]; //D2、D1、D0位
prio = (y<<3)+x;
//优先级别
为了能够使系统清楚地知道,系统中 哪些任务已经就绪,哪些还没有就绪, μC/OS_II在RAM中设立了一个记录 表,系统中的每个任务都在这个表中 占据一个位置,并用这个位置的状态 (1或者0)来表示任务是否处于就绪 状态,这个表就叫做任务就绪状态表, 简称叫任务就绪表
任务就绪表就是一个二维数组OSRdyTbl[ ]
typedef struct os_tcb { OS_STK *OSTCBStkPtr; //指向任务堆栈栈顶的指针
…… struct os_tcb *OSTCBNext;//指向后一个任务控制块的指针 struct os_tcb *OSTCBPrev; //指向前一个任务控制块的指针
…… INT16U INT8U INT8U
6 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
7 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 y
任务就绪表的示意图
D7 D6 D5 D4 D3 D2 D1 D0 prio=29 0 0 0 1 1 1 0 1
OSRdyGrp | =OSMapTbl[prio>>3]; Y
while(i=0;i<8;i++){ if(OSRdyGrp%2!=0) break; else OSRdyGrp=OSRdyGrp/2;
}y=i; while(i=0;i<8;i++){
if(OSRdyTbl[y]%2!=0) break; else OSRdyTbl[y]=OSRdyTbl[y]/2; }x=i; prio=y*8+x;
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 2
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 3
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 4
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
5 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
OSTCBDly; //任务等待的时限(节拍数) OSTCBStat; //任务的当前状态标志 OSTCBPrio; //任务的优先级别
…… } OS_TCB;
当进行系统初始化时,初始化函 数会按用户提供的任务数为系统创建 具有相应数量的任务控制块并把它们 链接为一个链表。
由于这些任务控制块还没有对应 的任务,故这个链表叫做空任务块链 表。即相当于是一些空白的身份证。
任务控制块链表
空任务控制块链表
当应用程序调用函数OSTaskCreate( )创 建一个任务时,这个函数会调用系统函数 OSTCBInit ( )来为任务控制块进行初始 化。这个函数首先为被创建任务从空任务 控制块链表获取一个任务控制块,然后用 任务的属性对任务控制块各个成员进行赋 值,最后再把这个任务控制块链入到任务 控制块链表的头部
为加快访问任务就绪表的 速度,系统定义了一个变 量OSRdyGrp来表明就绪表 每行中是否存在就绪任务。
OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 x 7 6
OSRdyTbl[ ] 5 43 2 1 0
0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1
根据就绪表获得 获 待得 运待 行运 任行 务任 的务任 的 务任 控务 制控 块制 指块 针
处理器的SP=任 务块中保存的SP
恢复待运行任务 的运行环境
处理器的PC=任 务堆栈中的断点 地址
如何获得待运行 任务的任务控制
块?
任务切换宏 OS_TASK_SW( )
任务切换就是中止正在运行的任务 (当前任务),转而去运行另外一个 任务的操作,当然这个任务应该是就 绪任务中优先级别最高的那个任务
嵌入式实时操作系统
μC/OS-II
信息学院
相关文档
最新文档