μC-OS-II-实验一任务基本管理精品文档21页
uCOS-II中的任务管理

任务的优先权 及优先级别
void main(void) typedef unsigned int OS_STK; { 在应用程序中定义任务堆栈的栈区非常简单, //这是系统定义的一个数据类型 在创建用户任务时,要 …… 即定义一个 OS_STK 类型的一个数组并在创建 传递任务的堆栈指针和 OSTaskCreate( 任务优先级别 一个任务时把这个数组的地址赋给该任务就 MyTask, //任务的指针 可以了。 &MyTaskAgu, //传递给任务的参数 例如: & MyTaskStk[MyTaskStkN-1],//任务堆栈栈顶地址 20 //任务的优先级别 //定义堆栈的长度 ); #define TASK_STK_SIZE 512 …… }
μC/OS-II规定,一个 用户应用程序必须 可运行而处于所谓的空闲状态, 有调用任务延时函数 pdata =CPU pdata; //防止某些编译器报错 系统提供的空闲任务 使用这个空闲任务, 为了使 在没有用户任务可执 for(;;) 行的时候有事可做, μC/OS-II { 而且这个任务是不 OS_ENTER_CRITICAL( );//关闭中断 提供了一个叫做空闲任务 能用软件来删除的 OSdleCtr++; //计数
保存 CPU 寄存器中的内容及存 使用函数 储任务私有数据的需要,每个 OSTaskCreate( )创建任 任务都应该配有自己的堆栈, 务时,一定要注意所使 任 务 堆 栈 任务堆栈是任务的重要的组成 用的处理器对堆栈增长 部分
任务的状态及其转换
系统为任务配备 了任务控制块且 在任务就绪表中 进行了就绪登记, 这时任务的状态 叫做就绪状态。 处于就绪状态的 任务如果经调度 器判断获得了 CPU的使用权, 则任务就进入运 行状态
UCOS-II培训-20页精选文档

内容介绍1、介绍uC/OS-II嵌入式操作系统2、基于uC/OS-II的用电管理终端软件的设计书籍:《嵌入式实时操作系统uC/OS-II》作者:Jean LabrosseuC/OS-II V2.52 通过了美国航空航天管理局(FAA)的安全认证;安全性、可靠性是得到认证的。
我们为什么会选择uC/OS-II嵌入式操作系统?1、与终端硬件平台相适应全部源代码5500行,可裁减定制,生成的可执行代码占15~20k,可以移植到多种系列单片机上,包括ARM;2、考虑成本,免费的源代码公开;3、uC/OS-II代码简单,容易掌握和使用;具有多任务调度的基本功能;uC/OS-II嵌入式操作系统的缺点:1、缺少技术支持,相关的支持软件少;2、和商业软件比,功能较弱(如不支持时间片轮转,最大任务数为64等);对应用开发的支持不够;uC/OS内核介绍和基于RTOS的设计介绍一、概述●使用嵌入式RTOS的优点1 将复杂的系统分解为多个相对独立的任务,采用“分而治之”的方法降低系统的复杂度。
通过将应用程序分割成若干独立的任务,RTOS使得应用程序的设计过程大为简化;2 使得应用程序的设计和扩展变得容易,无需较大的改动就可以增加新的功能;3 用户给系统增加一些低优先级的任务,则用户系统对高优先级的任务的响应时间几乎不受影响;4 实时性能得到提高。
使用可剥夺型内核,所有时间要求苛刻的事件都得到了尽可能快捷有效的处理;5 通过有效的服务,如信号量、邮箱、队列、延时及超时等,RTOS使资源得到更好的利用;●使用嵌入式RTOS的缺点1 使用RTOS增加了系统的内存和CPU等使用开销,例如任务之间的通讯、RTOS的调度程序等;2 需要采用一些新的软件设计方法,对系统设计人员的要求高一些。
例如驱动程序的设计要考虑到共享资源的互斥问题;3 系统任务的划分是比较复杂的过程,需要设计人员对业务和RTOS操作系统都很熟悉。
●uC/OS操作系统的特点uC/OS是一个完成的,可移植、可固化、可裁减的抢占式实时多任务操作系统内核。
uC_OS-II实验指导书

µC_OS-II实验指导书电子科技大学嵌入式软件工程中心北京科银京成技术有限公司目录第一部分实验系统简介及入门 (5)1 实验系统的目的 (5)2 实验系统的构成 (5)3 操作系统简介 (5)3.1 µC/OS-II概述 (5)3.2 µC/OS-II的特点 (6)3.3 µC/OS-II主要源代码文件介绍 (7)4 LambdaTOOL集成开发环境简介 (7)5 µC/OS-II实验内容简介 (8)5.1 任务管理实验 (8)5.2 优先级反转实验 (8)5.3 优先级继承实验 (9)5.4 哲学家就餐实验 (9)5.5 内存管理实验 (9)5.6 时钟中断实验 (9)5.7 消息队列实验 (9)6 预备实验:嵌入式开发环境的建立 (9)6.1 目的 (9)6.2 实验步骤及说明 (10)第二部分µC/OS-II实验 (24)实验1 任务的基本管理 (24)1 实验目的 (24)2 实验原理及程序结构 (24)2.1 实验设计 (24)2.2 操作系统配置 (25)2.3 源程序说明 (27)3 运行及观察应用输出信息 (29)4 本实验中所用到的µC/OS-II相关函数 (31)4.1 OSTaskCreate() (31)4.2 OSTaskSuspend() (31)4.3 OSTaskResume() (32)实验2 优先级反转 (33)1 实验目的 (33)2 原理及程序结构 (33)2.1 实验设计 (33)2.2 操作系统配置 (35)2.3 源程序说明 (36)3 运行及观察应用输出信息 (39)4 本实验中所用到的µC/OS-II相关函数 (39)4.1 OSSemCreate() (39)4.2 OSSemPend() (40)4.3 OSemPost() (40)4.4 OSTimeDly() (41)实验3 优先级继承 (42)1 实验目的 (42)2 原理及程序结构 (42)2.1 实验设计 (42)2.2 操作系统配置 (45)3 运行及观察应用输出信息 (46)4 本实验中所用到的µC/OS-II相关函数 (47)4.1 OSMutexCreate() (47)4.2 OSMutexPend() (47)4.3 OSMutexPost() (48)5 应用调试过程 (49)实验4 信号量:哲学家就餐问题的实现 (51)1 实验目的 (51)2 原理及程序结构 (51)2.1 实验设计 (51)2.2 操作系统配置 (52)3运行及观察应用输出信息 (53)4 本实验中所用到的µC/OS-II相关函数 (55)实验5 µC/OS-II的内存管理 (56)1 实验目的 (56)2 原理及程序结构 (56)2.1实验设计 (56)2.2 操作系统配置 (62)3 本实验中所用到的µC/OS-II相关函数 (63)3.1 OSMemCreate() (63)3.2 OSMemGet() (64)3.3 OSMemPut() (64)3.4 OSMemQuery() (65)实验6 时钟中断 (66)1 实验目的 (66)2 原理及程序结构 (66)2.1 实验设计 (66)2.2 操作系统配置 (68)3 运行及观察应用输出信息 (70)4 本实验中所用到的µC/OS-II相关函数 (71)实验7 消息队列 (72)1 实验目的 (72)2 原理及程序结构 (72)2.1 实验设计 (72)2.2 源程序说明 (72)2.3 操作系统配置 (77)3 运行及观察应用输出信息 (78)4 本实验中所用到的µC/OS-II相关函数 (82)4.1 OSQCreate() (82)4.2 OSQPend() (82)4.3 OSQPostFront() (83)4.4 OSQPost() (83)4.5 OSQFlush () (84)4.6 OSQQuery() (84)4.7 OSQDel() (85)4.8 OSTimeDlyHMSM() (85)第一部分实验系统简介及入门1 实验系统的目的通过此实验系统,读者可以了解嵌入式实时操作系统µC_OS-II的内核机制和运行原理。
实验一 uCOS-II的移植

实验一uC/OS-II的移植1.实验目的(1)理解uCOS-II实时内核的工作原理;(2)熟悉uCOS-II在XS128上的移植过程;(3)掌握uCOS-II移植的细节。
2.实验任务(1)观察示例程序中的代码,体会实时操作系统与前后台程序的不同之处。
(2)完成由前后台程序编程到基于实时操作系统编程的思想转变。
3.预习要求(1)参考《嵌入式实时操作系统uCOS-II》(第2版),熟悉uCOS-II各模块的基本工作原理。
(2)参考《单片机与嵌入式系统开发方法》第9章内容以及《uCOS-II移植说明文档》。
熟悉uCOS-II在XS128上的移植过程。
4.实验步骤(1)打开示例程序,观察程序结构。
(2)识别出哪些是与硬件无关的文件,哪些是移植需要修改和添加的文件。
(3)打开OS_CPU.H文件,该文件定义CPU的数据类型,定义相关的宏。
打开OS_CPU_C文件,分析文件里各个函数的作用。
这两个文件是与CPU特性有关的文件。
(4)分别打开OS_CFG.H, INCLUDES.H. OS_CFG.H这三个文件,了解这三个文件的作用。
用户根据自己的应用系统来定制合适的内核服务功能.包括两个文件:OS_CFG.H, INCLUDES.H. OS_CFG.H是来配置内核, 用户根据需要对内核进行定制, 留下需要的部分, 去掉不需要的部分, 设置系统的基本情况. 比如系统可提供的最大任务数量, 是否定制邮箱服务, 是否需要系统提供任务挂起功能, 是否提供任务优先级动态改变功能等等;头文件INCLUDES.H为整个实时系统程序所需要的文件,包括了内核和用户的头文件。
(5)修改.prm文件中的中断向量,将其中的ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;改为ROM_C000 = READ_ONLYDATA_NEAR IBCC_NEAR 0xC000 TO 0xEEFF;将结尾处原有的VECTOR 0 _Startup;改为VECTOR ADDRESS 0xEFFE _Startup;再添加上VECTOR ADDRESS 0xEFF6 OSCtxSw;VECTOR ADDRESS 0xEFF0 OSTickISR两个中断向量。
ucos-ii及其任务

• 中断管理
1、uc/os-ii的概述 2、 uc/os-ii的任务 3、任务控制块 4、任务创建 5、uc/os-ii的初始化及任务启动
• uc/os-ii中的任务是一个线程,其代码通常是一个无 限循环结构/超循环结构,看起来像其它C 函数一样。 void mytask(void *pdata) //示意代码 { for (;;) { do something; waiting; do something; } }
uc/os-ii概述—性能特点
• 可剥夺性(Preemptive)与可确定性
内核可剥夺、函数调用或系统服务的执行时间具有 可确定性,是硬实时操作系统。
• 支持多任务
• 任务栈
uc/os-ii可以管理64个任务 每个任务有自己单独的栈,uc/os-ii允许每个任允 许每个任务有不同的栈空间,以便压低应用程序对 RAM的需求。
删除任 务
等待
等 待 时 间 到 创建任务 任务调度
挂 起
中断 运行 任务被占先 中断结束 中断任务
uc/os-ii的任务—优先级
uc/os-ii支持64个任务,每个任务有一个特定 的优先级。 任务的优先级别用数字表示,0表示的任务的 优先级最高,数字越大表示的优先级越低。 通过常数OS__LOWEST__PRIO(在 OS_CFG.H中)定义系统的最低优先级别,同 时限定系统能容纳的最多任务数量。 OS_LOWEST_PRIO给空闲任务, OS_LOWEST_PRIO-1给统计任务。
1、uc/os-ii的概述 2、 uc/os-ii的任务 3、任务控制块 4、任务的创建 5、uc/os-ii的初始化及任务启动
任务控制块—结构
任务控制块 (Task Control Blocks, OS_TCBs)是 ucos-ii用来存储任务堆栈指针、当前状态、优先级及 任务链表指针等属性的一个数据结构。 任务控制块是任务的身份证,每个任务都有一个属于 自已的任务控制块,当任务的CPU使用权被剥夺时, 任务的属性被保存在任务控制块中,而当任务重新得 到CPU使用权时任务控制块能确保任务从当时被中断 的那一点丝毫不差地继续执行。 OS_TCBs全部驻留在RAM中。 OS_TCBs 在任务建立的时候被初始化。
uc_osⅡ实验一报告

班级学号姓名实验日期预备实验嵌入式开发环境的建立实验一、实验目的1.掌握嵌入式软件开发环境的建立过程;2.初步掌握嵌入式程序的编译和调试过程。
二、实验内容建立嵌入式开发环境;编译和调试嵌入式程序。
三、实验原理、程序结构实验设计了 Task0 、Task1 两个任务:任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行。
(1)系统经历一系列的初始化过程后进入 boot_card() 函数,在其中调用 ucBsp_init() 进行板级初始化后,调用 main() 函数;(2)main() 函数调用 OSInit() 函数对 uC/OS-II 内核进行初始化,调用 OSTaskCreate 创建起始任务 TaskStart ;(3)main() 函数调用函数 OSStart() 启动 uC/OS-II 内核的运行,开始多任务的调度,执行当前优先级最高的就绪任务 TaskStart ;(4)TaskStart 完成如下工作:a、安装时钟中断并初始化时钟,创建 2 个应用任务;b、挂起自己(不再被其它任务唤醒),系统切换到当前优先级最高的就绪任务Task0 。
四、实验步骤及操作过程1.安装集成开发环境 LambdaEDU集成开发环境 LambdaEDU 的安装文件夹为 LambdaEDU ,其中有一个名为“Setup.exe ”的文件,直接双击该文件便可启动安装过程。
具体的安装指导请看“LambdaEDU 安装手安装手册册 .doc ”文件。
当 LambdaEDU 安装完毕之后,我们看到的是一个空的界面,现在就开始一步一步地将我们的实验项目建立并运行起来。
2.建立项目为了我们的实验运行起来,需要建立 1 个项目基于 x86 虚拟机的标准应用项目。
通过点击“文件”、“新建”、“项目”开始根据向导创建一个项目。
在随后出现的对话框中选择“Tool/ 标准应用项目”,点击下一步,开始创建一个标准的可执行的应用程序项目。
06 uCOS_II任务管理

26
1 μC/OS-II概述
可确定性
全部μC/OS-II的函数调用与服务的执行时间具有其可确
定性。
执行时间是可知的。 执行时间不依赖于应用程序任务的多少。
27
1 μC/OS-II概述
任务栈
每个任务有自己单独的栈,μC/OS-II允许每个任务 有不同的栈空间,以便压低应用程序对RAM的需求。
47
内容提要
1 μC/OS-II概述
2 μC/OS-II任务概述
3 μC/OS-II任务管理
48
3 任务管理
μC/OS-II任务的存储结构 任务控制块OS_TCB 任务状态及转换 任务管理
49
3.1 μC/OS-II任务的存储结构
从任务的存储结构来看,任务三个组成部分: 任务程序代码 任务堆栈 任务控制块 是任务的执行部分 用来保存任务工作环境 用来保存任务属性
3 μC/OS-II任务管理
13
参考书目
14
1 μC/OS-II简介
micro C O S 2 ----“微控制器操作系统版本2”。 μC/OS-II是一个免费的、源代码公开的嵌入式实时多 任务内核,是专门为嵌入式应用设计的RTOS,只提 供了实时系统所需的基本功能。 如任务调度、任务管理、时间管理、内存管理、 中断管理、任务间的同步与通信等实时内核的基 本功能。
43
2.2 任务
从应用程序设计的角度来看,μC/OS—II的 任务就是一个线程,是一个用来解决用户问题 的C函数和与之相关联的一些数据结构而构成 的一个实体。 μC/OS-II可以管理多达64个任务,但建议保留4个 最高优先级和4个最低优先级的任务,供以后 μC/OS-II的版本使用。
ucosii实时操作系统分析-任务管理及调度精品PPT课件

(119页例4-4,122页例4-5) 11、用消息邮箱实现任务间通信示例程序演示--0.9(可选)(136页例4-8) 3
实时操作系统C/OБайду номын сангаас-II
1 C/OS-II概述 2 任务概念 3 任务调度核心问题分析
4
C/OS简介
美国人Jean Labrosse 1992年完成 应用面覆盖了诸多领域,如照相机、医疗器械、音
响设备、发动机控制、高速公路电话系统、自动提 款机等 1998年C/OS-II,目前的版本C/OS -II V2.61 ,2.72 2000年,得到美国航空管理局(FAA)的认证, 可以用于飞行器中 网站()
( 31页2.4.2) 5、任务调度器实现流程图表述--1 (43页2.4.3) 6、任务调度器实现及源代码分析--1 (43页2.4.3 ) 7、任务切换的过程描述--0.8(可选) (43页2.4.3 ) 8、用户任务的实现(编写一个示例程序验证调度算法)--1 (43页例2-7) 9、任务状态切换(挂起和恢复任务)示例程序演示--0.9(可选)
任务控制块是一个数据结构,保存该任务的相关参数,包括任务 堆栈指针,任务的当前状态,任务的优先级等。
任务CPU使用权被剥夺时,TCB保存该时刻任务状态;任务重新得 到CPU控制权时,TCB确保任务从当时被中断的那一点丝毫不差地 继续执行。
OS_TCB全部驻留在RAM中。
任务控制块就相当于一个任务的身份证,没 有任务控制块的任务是不能被系统承认和管 理的。
µC/OS-II操作系统中进程调 度模块分析
1
1、课程任务:
背景
分析µC/OS-II操作系统中的进程调度模块的源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
正在运行的任务,需要
等待一段时间或需要等
待一个事件发生再运行
时,该任务就会把CPU
任务在没有被配备
的使用权让给别的任务
任务控制块或被剥 夺了任务控制块时
。 一个正在运行的
而使任务进入任等务待一状旦态响应中
的状态叫做任务的
断申请就会中止
任务的状态及其转换 睡眠状态
运行而去执行中 断服务程序,这 时任务的状态叫
➢ 恢复任务函数原型: INT8U OSTaskResume (INT8U prio)
任务挂起和恢复示例
//创建两个任务,优先级分别为5和6 OSTaskCreate(MyTask, 0, &MyTaskStk[TaskStkSize-1], 5); OSTaskCreate(YourTask, 0, &YourTaskStk[TaskStkSize-1], 6);
void MyTask(void *pdata) { while(1) { printf("This is MyTask!\n"); Beep(1950, 20); n++; //通过空循环进行延时 if(n>=10) { printf("MyTask Suspended!\n"); n = 0; OSTaskSuspend(OS_PRIO_SELF); } }
}
int main(void) {
OSInit(); OSTaskCreate(MyTask, 0,
&MyTaskStk[TaskStkSize-1], 5); OSStart(); return 0; }
任务的挂起和恢复
➢ 所谓挂起一个任务,就是由这个任务自身或其他任 务暂时中止这个该任务的运行,并进入等待状态。 μC/OS_II提供的系统函数OSTaskSuspend()用与挂 起一个任务。
➢ 所谓任务恢复一个任务,就是将一个挂起的任务恢 复进入就绪状态。 μC/OS_II提供的系统函数 OSTaskResume()用于恢复一个挂起sume()
OSTaskSupend()
OS_TASK_SW() 就绪状态
运行状态
任务CPU使用权被剥夺
➢ 挂起任务函数原型 INT8U OSTaskSuspend (INT8U prio); 如果参数prio为常数OS_PRIO_SELF,则表示挂起 当前任务自身。
做中断服务状态
系统为任务配备 了任务控制块且 在任务就绪表中 进行了就绪登记, 这时任务的状态 叫做就绪状态。
处于就绪状态的 任务如果经调度 器判断获得了 CPU的使用权, 则任务就进入运
行状态
任务的优先级
➢μC/OS_II 把任务的优先权分为64个优先级别, 每一个级别都用一个数字来表示。数字0表示 任务的优先级别最高,数字越大则表示任务 的优先级别越低
OSTaskCreate() 休眠状态
OSTaskDelete()
就绪状态
➢ 删除任务函数原型 INT8U OSTaskDelelte (INT8U prio); 如果参数prio为常数OS_PRIO_SELF,则表示删除 当前任务自身。
任务删除示例
//创建两个任务,优先级分别为5和6 OSTaskCreate(MyTask, 0, &MyTaskStk[TaskStkSize-1], 5); OSTaskCreate(YourTask, 0, &YourTaskStk[TaskStkSize-1], 6);
void (*task)(void *pd),//指向任务的指针 void *pdata, //传递给任务的参数 OS_STK *ptos, //指向任务堆栈栈顶的指针 INT8U prio //任务的优先级 )
创建任务示例示例
void MyTask(void *pdata) { pdata = pdata; while(1) { printf("M"); Beep(1950, 20); n++; if(n>=CharPerLine) { printf("\n"); n = 0; } OSTimeDly(OS_TICKS_PER_SEC); }
μC/OS-II的应用程序结构
➢ 基于DevCpp的μC/OS-II应用程序结构 基于ADS的μC/OS-II应用程序结构
μC/OS-II的任务代码结构
➢ μC/OS-II下的任务代码一般定义为一个任务函数, 函数的主体通常是一个无限的循环
void MyTask(void *pdata) { for (;;) { 用户代码; }
}
void YourTask(void *pdata) { while(1) { printf("This is YourTask!\n"); Beep(4000, 20); m++; //通过空循环进行延时 if(m>=10) { printf("MyTask Resumed!\n"); m = 0; OSTaskResume(5); } }
void MyTask(void *pdata) {
while(1) { printf("This is MyTask!\n"); Beep(1950, 20); n++; if(n==10) {
printf("MyTask任务删除YourTask任务!\n"); OSTaskDel(6); } OSTimeDly(OS_TICKS_PER_SEC); } }
任务创建
➢ 用户定义了任务函数,但μC/OS_II不会理会这些代 码,这些代码也不会运行。
➢ 任务创建的工作就是给任务分配一个任务控制块, 并通过任务控制块把任务代码、任务堆栈关联起来 形成一个完整的任务。
➢ 任务创建后,它就可以接受μC/OS_II的管理和调度。
➢ 创建任务OSTaskCreate( )函数的原型如下: INT8U OSTaskCreate (
}
任务删除
➢ 所谓删除一个任务,就是把任务置于休眠状态,具 体的做法就是,把当初分配给该任务的任务控制块 从任务控制块链表中删除,并归还给空任务控制块 链表,然后就绪任务表中把该任务的就绪状态位置 0.
➢ 删除一个任务,并不是说任务的代码被删除了,只 是任务的代码不能被μC/OS_II的内核管理和调用。