实验二 UCOS-II任务管理
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的使用权, 则任务就进入运 行状态
ucosii实时操作系统分析-任务管理及调度精讲
实时操作系统C/OS-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)的认证,可 以用于飞行器中
网站()
5
数 据 类 型
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned int INT16U; typedef signed int INT16S; typedef unsigned long INT32U; typedef signed long INT32S; typedef float FP32; typedef double FP64;
struct os_tcb *OSTCBPrev; //指向前一个任务控制块的指针 ……
INT16U
INT8U INT8U
OSTCBDly;
OSTCBStat; OSTCBPrio;
//任务等待的时限(节拍数)
//任务的当前状态标志 //任务的优先级别
……
} OS_TCB;
10
任务控制块链表
系统在调用函数OSInit()对uC/OS-II系统进行初始化时,先在RAM中 建立一个OS_TCB结构类型的数组OSTCBTbl[ ],每个数组元素就是一 个任务控制块,然后把这些控制块链接成一个如图所示的链表。由 于链表中的这些控制块还没有与具体任务相关联,因此这个链表叫 做空任务块链表。 每当应用程序调用系统函数OSTaskCreate()创建一个任务时,系统 就会将任务控制块链表头指针OSTCBFreeList指向的任务控制块分配 给该任务。在给任务控制块中的各成员赋值后,就按任务控制块链 表的头指针OSTCBList将其加入到任务控制块链表中。
UCOSII操作系统实验教程
下次实验的准备工作
• 阅读《嵌入式实时操作系统μC/OS原理与 实践》P67-72任务的挂起和恢复
实验9
任务的挂起和恢复
• 1.编译运行代码,输入选项3继续运行程序 • 2.运行查看结果
• 3.查看代码,说明为什么得到这样的运行 结果 • 4.对任务代码进行修改,得到不同的结果 • 5.改变任务的优先级,查看运行结果,说 明输出的不同之处,说明原因
补充,各个例子的运行结果展示 3
下次实验的准备工作
• 阅读《嵌入式实时操作系统μC/OS原理与 实践》P102-129 • 事件管理的重要数据结构,事件管理程 序,信号量管理
实验10 信号量管理实验
• 1.例子程序说明见《嵌入式实时操作系统 μC/OS原理与实践》 P129,运行结果见 P133图4.9 • 打开原始工程运行代码,输入选项4继续 运行程序 • 2.运行查看结果 • 3.说明使用信号量实现的功能,为什么能 实现这样的功能,都使用了哪些数据结构。
补充,各个例子的运行结果展示 1
准备工作
• 阅读《嵌入式实时操作系统μC/OS原理与 实践》P24-40 2.1任务管理的重要数据结 构,为以后的实验做准备
实验2
调试模式跑第一个任务
• 本实验的目的在于学会使用VC的调试模式 运行和调试操作系统。 • 步骤 • 1.在上次实验的基础上不改动代码,打开工 程 • 2.在usercode.c中的 • printf(“welcome to embeded system\n”);处 设置断点。
• 阅读《嵌入式实时操作系统μC/OS原理与 实践》P41-43任务控制块的初始化,P5154任务的创建
实验3
任务的创建
• 掌握任务创建的过程 • 步骤 • 1. 去掉前面的断点,找到main.c中 OSTaskCreate(FirstTask, 0, &TaskStk[5][TASK_STK_SIZE-1], 5);函数,设置 断点,并按F5调试运行,运行代码的时候输入 1,在运行到断点时,按F11追进函数内部,再按 F10单步运行,与书上51页进行比较。 • 2。画出该函数运行完成后的就绪表和就绪组,任 务控制块空闲链表和任务链表。
uCOS-II
实验一、任务创建与删除1、uC/OS-II介绍对于操作系统的学习,创建任务和删除任务是最为基础的工作,uC/OS-II以源代码的形式发布,是开源软件, 但并不意味着它是免费软件。
可以将其用于教学和私下研究;但是如果将其用于商业用途,那么必须通过Micrium获得商用许可。
uC/OS-II属于抢占式内核,最多可以支持64个任务,分别对应优先级0~63,每个任务只能对应唯一的优先级,其中0为最高优先级。
63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整型变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。
μC/OS-II可管理多达63个应用任务,并可以提供如下服务,本章将针对以下服务分别以例程的方式来介绍1)信号量2)互斥信号量3)事件标识4)消息邮箱5)消息队列6)任务管理7)固定大小内存块管理8)时间管理2、任务创建与删除想让uC/OS-II管理用户的任务,用户必须要先建立任务,在开始多任务调度(即调用OSStart())前,用户必须建立至少一个任务。
uC/OS-II提供了两个函数来创建任务:OSTask Create()或OSTaskCreateExt()。
可以使用其中任意一个即可,其函数原型如下:INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U pri o)INT8U OSTaskCreateExt (void(*task)(void *pd),void *pdata,SD_STK *ptos,INT8U prio, INT16U id,OS_STK *pbos,INT32U stk_size, void *pext,INT16U opt)task:任务代码指针pdata:任务的参数指针ptos:任务的堆栈的栈顶指针prio:任务优先级id:任务特殊的标识符(uC/OS-II中还未使用)pbos:任务的堆栈栈底的指针(用于堆栈检验)stk_size:堆栈成员数目的容量(宽度为4字节)pext:指向用户附加的数据域的指针opt:是否允许堆栈检验,是否将堆栈清零,任务是否要进行浮点操作等等删除任务,是说任务将返回并处于休眠状态,任务的代码不再被uC/OS-II调用,而不是删除任务代码。
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任务间通讯和同步实验15页
二 实验内容
实验内容
使用信号量实现任务间同步 使用邮箱实现任务之间的通讯
4
三 预备知识
预备知识
了解操作系统任务调度的机制 了解操作系统任务间通讯的机制 学习uC/OS-II操作系统下多任务应用程序的编写方法
5
四 实验设备
实验设备
JX44B0教学实验箱 ADT1000仿真器和ADT IDE集成开发环境 串口连接线
JX44B0实验系统教案 uC/OS-II任务间通讯和同步实验
武汉创维特信息技术有限公司
11.01.2020
提纲
1
实验目的
2 实验内容
3 预备知识
4 实验设备
5 基础知识 6 实验过程 7 实验报告要求
2
一 实验目的
实验目的
掌握uC/OS-II操作系统下使用信号量解决任务之间的同步 问题
掌握uC/OS-II操作系统下任务间通讯的-II中使用消息队列实现任务之间的通讯
消息队列是uC/OS-II中另一种通讯机制,它可以使一个任 务或者中断服务子程序向另一个任务发送以指针方式定义 的变量。因具体的应用有所不同,每个指针指向的数据结 构变量也有所不同。
uC/OS-II提供了7个对消息队列进行操作的函数:创建消 息队列函数OSQCreate(),等待消息队列函数OSQPend(), 先进先出(FIFO)发送消息函数OSQPost(),后进先出(LIFO) 发送消息函数OSQPostFront(),无等待获取消息函数 OSQAccept(),清空消息队列函数OSQFlush()和查询消息 队列函数OSQQuery()。
12
六 实验过程
实验过程
13
六 实验报告要求
实验2 uCOS-II任务间通讯和同步实验
嵌入式实时操作系统实验报告1实验名称:uC/OS-II任务间通讯和同步实验姓名:班级:信科10-4班学号:uC/OS-II任务间通讯和同步实验一、实验目的1、掌握uC/OS-II操作系统下使用信号量解决任务之间的同步问题;2、掌握uC/OS-II操作系统下任务间通讯的方法。
二、实验内容1、使用信号量实现任务间同步(Eg2工程)2、使用邮箱实现任务之间的通讯(Eg3工程)三、基础知识uC/OS-II任务之间的通讯与同步方式1、利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断2、利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度函数上锁和开锁3、信号量4、邮箱5、队列uC/OS-II中使用信号量进行任务之间同步1、通过调用OSSemCreate()建立信号量2、通过调用OSSemPost()函数发送一个信号量3、通过调用OSSemPend()函数等待一个信号量OSSemCreate1、Sem1 = OSSemCreate(0);2、参数为信号量的初始计数值赋值。
该初始值为0到65,535之间的一个数。
3、如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。
4、如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。
5、如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用。
OSSemPost和OSSemPend1、如果信号量当前是可用的(信号量的计数值大于0),将信号量的计数值减1,然后函数将“无错”错误代码返回给它的调用函数。
如果信号量的计数值为0,而OSSemPend()函数又不是由中断服务子程序调用的,则调用OSSemPend()函数的任务要进入睡眠状态,等待另一个任务(或者中断服务子程序)发出该信号量。
ucosII实验报告
实验1《任务得创建、删除、挂起、恢复》实验学时: 2实验地点:二综x203 实验日期: 2013/12/13一、实验目得1.实验环境得建立2.任务得接口函数得应用二、实验内容1.设计一个只有一个任务Task1,当程序运行后任务得工作就就是每秒在显示器上显示一个字符“M”。
2.在任务Task1中在创建一个任务Task2 。
当程序运行后,任务Task1得工作在显示器上显示一个字符“M”;Task2 则就是在显示器上显示字符“Y”。
3、要求任务Task2运行20次后,挂起任务Task1;任务Task2运行40次后,恢复任务Task1。
4、当任务Task1运行5次时,用函数OSSchedLock()对调度器进行加锁;而当任务Task1运行到第10次时,再用函数OSSchedUnlock()对调度器进行解锁,并运行该程序。
5、使任务Task1能删除任务Task2。
三、实验方法包括实验方法、原理、技术、方案等。
四、实验步骤1.将BC45文件夹拷贝到C分区根目录下。
2.将software文件夹拷贝到任意分区根目录下。
3、分别完成实验1、2、3、4、5五、实验结果1、 DOS窗口每秒显示一个字符“M”。
每行显示10个“M”字符,行与行得间隔就是一行。
按ESC键程序退出2、 DOS窗口交替显示字符"M"与“Y”,每隔一秒显示一次。
每行显示10个字符,行与行之间得间隔就是一行。
按ESC键程序退出3.DOS窗口开始交替显示字符"M"与“Y”,显示20次以后,Task1挂起,只显示“Y”,当Task2运行40次以后,Task1恢复,然后开始Task1,Task2交替运行。
4.DOS窗口开始交题显示字符"M"与“Y”,显示5次以后,Task1将任务调度器上锁,此时只有“M”打印,当Task1运行10次后,Task1,Task2开始交替运行。
5.DOS窗口开始交替显示字符“M”与“Y”,显示10次后,只显示“Y”六、实验结论对实验数据与结果进行分析描述,给出实验取得得成果与结论。
实验二-UCOS-II任务管理
班级学号姓名同组人实验日期室温大气压成绩实验二 UCOS-II任务管理一、实验目的1、掌握UCOS-II中任务管理的函数的应用。
2、掌握UCOS-II在STM32平台下对硬件的控制。
3、掌握开发UCOS-II应用的程序结构。
二、实验步骤1、UCOSII工作原理UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。
这个时钟节拍由OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms~100ms。
本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。
UCOSII的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。
在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。
UCOSII不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。
任务的调度其实就是CPU 运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程UCOSII的每个任务都是一个死循环。
每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。
睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。
就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。
运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。
实验二-UCOS-II任务管理
班级学号姓名同组人实验日期室温大气压成绩实验二 UCOS-II任务管理一、实验目的1、掌握UCOS-II中任务管理的函数的应用。
2、掌握UCOS-II在STM32平台下对硬件的控制。
3、掌握开发UCOS-II应用的程序结构。
二、实验步骤1、UCOSII工作原理UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。
这个时钟节拍由OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms~100ms。
本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。
UCOSII的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。
在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。
UCOSII不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。
任务的调度其实就是CPU 运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程UCOSII的每个任务都是一个死循环。
每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。
睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。
就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。
运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。
ucos-II操作系统概述及任务管理
演讲人:伍莹莹
背景
目前,嵌入式系统在家电、 移动电话、 PDA等 各种领域的应用日益广泛,程序设计也越来越复杂, 这就需要采用一个通用的嵌入式操作系统来对其 进行管理和控制。移植了操作系统的嵌入式系统 开发,可大大减轻程序员的负担,操作系统提供了多 任务的管理功能,只需专注于每个任务的管理。对 于不同的应用,可以按照相同的步骤完成系统设计。 如果更换硬件平台,则只需要对操作系统进行少量 的移植工作, 与硬件无关的应用代码完全无需修改。
任务划分原则
以CPU为核心,将与各种输入输出设备相关的功能划分为独立的 任务。 发现关键功能,用一个独立的任务或者ISR完成。 紧迫任务,用一个优先级较高的任务完成。 将耗时较多的数据处理功能划分出来,使用低优先级的任务。 将有相同事件触发的若干功能合并为一个任务。 将运行周期相同的若干功能合并为一个任务。 将关系密切的若干功能组合为同一个任务,达到功能聚合的效果。
uC/OS-II移植(与处理器相关的代码) OS_CPU.HOS_CPU_A.ASMOS_CPU_C.C
软件 硬件
CPU
时钟
μC/OS-II移植
移植, 就是使一个实时内核能在某个微处理器或微控制器上运行。
要使 μ C/OS- II 能够正常运行,处理器必须满足以下几 个条件 (1)处理器的 C编译器能产生可重入代码; (2)在程序中可以打开或者关闭中断; (3) 处理器支持中断, 并且能产生定时中断 (通常在 l0~l000Hz之间); (4)处理器支持能够容纳一定量数据的硬件堆栈; (5)处理器有将堆栈指针和其他CPU寄存器存储和读出
μC/OS-II任务管理
第二章uCOSII中任务
2)任务状态
• 运行态(RUNNING): 正在使用CPU的状态称运行 态。就绪的任务只有当所有优先级高于自己的 任务转为等待状态,或者是被删除了,才能进 入运行态。
• 等待态(WAITING):等待某事件发生的状态.
–正在运行的任务可以通过调用OSTimeDly()或 OSTimeDlyHMSM()进入等待状态
void mytask(void *pdata) {
for (;;) { do something; waiting; do something; } }
从任务的存 储结构看, 任务由三个 部分组成:
1)任务概述
任务控制块
指向前一个任务控制块的指针 指向后一个任务控制块的指针 指向任务的指针 指向任务堆栈的指针 任务的优先级别 ……
–调用OSSemPend() 、 OSMboxPend() 或 OSQPend() 进 入等待状态(WAITING)。。
2)任务状态
• 中断服务态(ISR):
–正在运行的任务被中断(除非中断是关闭的)时就 进入了中断服务态(ISR)。
2)任务状态
3)系统任务
• 空闲任务(Idle Task)
–μC/OS-Ⅱ总要建立一个空闲任务,这个任务在没 有其它任务进入就绪态时投入运行。这个空闲任 务OSTaskIdle()永远设为最低优先级,即 OS_LOWEST_PRI0。
1)堆栈创建
– 堆栈是在存储器中按数据“后进先出(LIFO)的 原则组织的连续存储空间。为满足任务切换和响 应中断时保存CPU寄存器中的内容及任务私有数 据的需要,每个任务都应该配有自己的堆栈。
– uC/OS-II中堆栈的数据类型为为OS_STK (typedef unsigned int OS_STK )。
2 uCOS-II操作系统实验
uC/OS-II操作系统
实验视频
• 点击此处观看视频 • 如果不能正确观看,请点击此处 • 本实验使用简易JTAG接口,在程序中必
须选择ARM9Simple ,如果使用标准 JTAG接口,请选择ARM9Lpt
uC/OS-II操作系统
2.6 uC/OS-II软件定时器编程实验
uC/OS-II操作系统
uC/OS-II操作系统
实验视频
• 点击此处观看视频 • 如果不能正确观看,请点击此处 • 本实验使用简易JTAG接口,在程序中必
须选择ARM9Simple ,如果使用标准 JTAG接口,请选择ARM9Lpt
uC/OS-II操作系统
2.11 uC/OS-II俄罗斯方块游戏设计
uC/OS-II操作系统
uC/OS-II操作系统
2.1 uC/OS-II移植实验
uC/OS-II操作系统
实验效果
• 如果实验运行正确,实验箱上最右边的 •
•
数码管将依次从0到F显示数据,同时四 个跑马灯由亮变灭或者由灭变亮 跑马灯闪烁和数码管显示分别在两个不 同的任务中进行 在DNW中有相应的显示
uC/OS-II操作系统
实验效果
• 采集实验箱的AIN0和AIN1两个通道的模 •
拟量,并转换成为数字以曲线的方式显 示在LCD上 通过旋动AIN0和AIN1旋钮可以改变输入 模拟的值,LCD上显示将发生变化 编译这些应用之前,必须先编译uc-gui库 工程
•
uC/OS-II操作系统
实验视频
• 点击此处观看视频 • 如果不能正确观看,请点击此处 • 本实验使用简易JTAG接口,在程序中必
须选择ARM9Simple ,如果使用标准 JTAG接口,请选择ARM9Lpt
嵌入式实时操作系统ucosII实验2
嵌入式实时操作系统实验报告任务间通信机制的建立系别计算机与电子系专业班级电子0901班学生姓名高傲指导教师黄向宇提交日期 2012 年 4 月 1 日一、实验目的二掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。
掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。
二、实验内容1.建立并熟悉Borland C 编译及调试环境。
2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。
3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。
观察程序运行结果并记录。
4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。
5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。
三、实验原理1. 信号量µC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。
用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样µC/OS-II 才能支持信号量。
在使用一个信号量之前,首先要建立该信号量,也即调用OSSemCreate()函数(见下一节),对信号量的初始计数值赋值。
uCOS-II原理2_任务管理
O從SR任dy務Grp就緒表中獲取優先順序O別SRd最yT高bl[y的] 就緒任務可用如 D下7 類D6似D的5 代D4碼D:3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0
00 1 0 1 0 00 0 1 1 0 00 00
保存CPU寄存器中的內容及存 v{oi在d m應ain(用voi程d) 式/t/中y這pe是定de系f義統un任定si在g義n務創e的d建堆一in用t個疊戶O數的任S據_務S棧類T時K型區,; 要非常簡單,
即定……義一個OS_STK類傳型遞任的務一的個堆疊數指組針和並在創建
使OS用Ta函sk數Create( )創建任 儲任務私有數據的需要,每個 一 可以個OS了任Ta。s務kM&CMr時yeTayatT把esak(s,k這Ag個u, 數組任//的//務任傳優地務遞先的給址順指任賦序針 務別的給參該數任務就
程式通過訪問它來瞭解CPU的利用率, 所以這個系統任務OSTaskStat( )叫做 統計任務
任務及的優優先先順權序別 用O的說該供O個固O應把統順共SSS戶_常明常使_定_用優計序OCLLS可F數應數用O地O程先任別_GWW權 每 來 的 越 序L以.用一的EOμ,E式順務是OHSSCSW一優大分 表 別根程旦優T中_系T中序,:E/_L_SO個先則為 示 越據式被先P通O統P還別因0TSRWR,_級順表應中定I過 E。低6_總I使此OPOS4IOS1R用任義序給T,I示別序數個是用用自_,I_LO把程務,別表P共把了戶動O2-任都別優字RW1…任式優則為示IO最統任賦E個務用最先0OSSO表務的先意:最_賦低計務給TS的一高順L__需順味低O值0示的優任可空PLW,優個,序RO要序著優E的任優先務以閒IWS1先數O數E別,別 系先T方,順, 使任S-務先_T1順字字,在的統順P法2序系用務_自R,P檔數中序I,別統的。動RO…I目可別+來則優如賦O1…-。會先果給2,,
uCOS-II操作系统简介及实验
•
这两个宏的定义取决于所用的微处理器, 这两个宏的定义取决于所用的微处理器,每种微 处理器都有自己的OS_CPU.H文件。 文件。 处理器都有自己的 文件
uC/OS-II操作系统 uC/OS-II操作系统
uC/OS-II操作系统 uC/OS-II操作系统
1.2 uC/OS-II特点 特点
• 1、uC/OS-II内核具有很强的可移植性。 内核具有很强的可移植性。 、 内核具有很强的可移植性 • 2、具有可抢占的实时多任务调度功能。 、具有可抢占的实时多任务调度功能。 • 3、提供了许多系统服务,如信号量、消 、提供了许多系统服务,如信号量、 •
任务状态
• • • • • •
休眠态 - OSTaskCreate()或OSTaskCreateExt() 或 就绪态 等待态,就绪态 就绪态,运行态 等待态 就绪态 运行态 - OSTaskDel() - 休眠态 就绪态 - OSStart() - 运行态 运行态 - OSTimeDly()或OSTimeDlyHMSM() , 或 OSSemPend(),OSMboxPend(),或OSQPend() , , 等待态 等待态 - OSTimeTick() -就绪态 就绪态 空闲任务 - OSTaskIdle()
uC/OS-II操作系统 uC/OS-II操作系统
任务调度
• μC/OS-Ⅱ总是运行进入就绪态任务中优 μC/OS先级最高的那一个。 先级最高的那一个。确定哪个任务优先 级最高, 级最高,下面该哪个任务运行了的工作 是由调度器(Scheduler)完成的。 是由调度器(Scheduler)完成的。
ucos-ii工作原理
ucos-ii工作原理uC/OS-II(Micro C/Operating System-II)是一种用于嵌入式系统的实时操作系统。
它的工作原理可以简单归纳为以下几个步骤:1. 任务管理:uC/OS-II使用优先级调度算法管理多个任务。
每个任务都有一个优先级,高优先级的任务会优先执行。
uC/OS-II通过一个任务控制块(TCB)来管理每个任务的信息,包括任务的状态、堆栈信息、优先级等。
2. 中断处理:uC/OS-II可以处理多种类型的中断。
当发生中断时,uC/OS-II会根据中断类型进行相应的处理,并且可以自动切换到中断服务程序(ISR)进行执行。
中断服务程序中的代码通常是短小且高效的,用于处理特定的中断事件。
3. 任务切换:uC/OS-II使用抢占式的任务调度方式,因此任务切换可以发生在任何时刻。
当一个任务的时间片用尽或者有更高优先级的任务需要执行时,uC/OS-II会保存当前任务的上下文信息,并切换到下一个任务的执行。
任务切换时,uC/OS-II会保存当前任务的栈指针等信息,并从下一个任务的栈指针中恢复相应的上下文,以使下一个任务继续执行。
4. 事件同步:uC/OS-II提供了多种事件同步机制,如信号量、事件标志、消息邮箱等,用于任务之间的同步和通信。
这些机制可以帮助任务之间按照一定的顺序进行执行,实现数据共享和互斥访问等功能。
5. 内存管理:uC/OS-II提供了内存管理功能,可以动态分配和释放内存块。
这种内存管理机制可以帮助节省内存空间,提高系统的效率。
总而言之,uC/OS-II通过任务管理、中断处理、任务切换、事件同步和内存管理等机制,实现了对嵌入式系统的实时调度和资源管理,以提供稳定、可靠的操作系统支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
班级学号姓名同组人实验日期室温大气压成绩实验二 UCOS-II任务管理一、实验目的1、掌握UCOS-II中任务管理的函数的应用。
2、掌握UCOS-II在STM32平台下对硬件的控制。
3、掌握开发UCOS-II应用的程序结构。
二、实验步骤1、UCOSII工作原理UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。
这个时钟节拍由OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms~100ms。
本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。
UCOSII的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。
在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。
UCOSII不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。
任务的调度其实就是CPU 运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程UCOSII的每个任务都是一个死循环。
每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。
睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。
就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。
运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。
中断服务状态,一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。
UCOSII任务的5个状态转换关系如图所示:与任务相关的几个函数:1)建立任务函数UCOSII提供了我们2个建立任务的函数:OSTaskCreat和OSTaskCreatExt,我们一般用OSTaskCreat函数来创建任务,该函数原型为:OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio) 该函数包括4个参数:task:是指向任务代码的指针;pdata:是任务开始执行时,传递给任务的参数的指针;ptos:是分配给任务的堆栈的栈顶指针;prio是分配给任务的优先级。
每个任务都有自己的堆栈,堆栈必须申明为OS_STK类型,并且由连续的内存空间组成。
可以静态分配堆栈空间,也可以动态分配堆栈空间。
OSTaskCreatExt也可以用来创2)任务删除函数任务删除,就是把任务置于睡眠状态,并不是把任务代码给删除了。
UCOSII提供的任务删除函数原型为:INT8U OSTaskDel(INT8U prio)其中参数prio就是我们要删除的任务的优先级。
故该函数是通过任务优先级来实现任务删除的。
3)请求任务删除函数必须确保被删除任务的资源被释放的前提下才能将其删除,所以我们通过向被删除任务发送删除请求,来实现任务释放自身占用资源后再删除。
UCOSII提供的请求删除任务函数原型为:INT8U OSTaskDelReq(INT8U prio)同样还是通过优先级来确定被请求删除任务。
4)改变任务的优先级函数UCOSII在建立任务时,会分配给任务一个优先级,但是这个优先级并不是一成不变的,而是可以通过调用UCOSII提供的函数修改。
UCOSII提供的任务优先级修改函数原型为:INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio)。
5)任务挂起函数任务挂起和任务删除有点类似,但是又有区别,任务挂起只是将被挂起任务的就绪标志删除,并做任务挂起记录,并没有将任务控制块任务控制块链表里面删除,也不需要释放其资源,而任务删除则必须先释放被删除任务的资源,并将被删除任务的任务控制块也给删了。
被挂起的任务,在恢复(解挂)后可以继续运行。
UCOSII提供的任务挂起函数原型为:INT8U OSTaskSuspend(INT8U prio)6)任务恢复函数有任务挂起函数,就有任务恢复函数,通过该函数将被挂起的任务恢复,让调度器能够重新调度该函数。
UCOSII提供的任务恢复函数原型为:INT8U OSTaskResume(INT8U prio)三、实验内容在UCOSII里面创建3个任务:开始任务、LED0任务和LED1任务,开始任务用于创建其他(LED0和LED1)任务,之后挂起;LED0任务用于控制DS0 的亮灭,DS0每秒钟亮80ms;LED1任务用于控制DS1的亮灭,DS1亮300ms,灭300ms,依次循环。
所要用到的硬件资源1)指示灯DS0 、DS1 的硬件电路图如图其中PWR是系统电源指示灯,为蓝色。
LED0和LED1分别接在PB5和PE5上。
为了方便大家判断,我们选择了DS0为红色的LED,DS1为绿色的LED。
2)软件参数设置在os_cfg.h里面定义OS_TICKS_PER_SEC=200,也就是设置UCOSII的时钟节拍为5ms。
OS_MAX_TASKS = 10,也就是最多10个任务(包括空闲任务和统计任务在内)。
前面提到,我们需要在sys.h里面设置SYSTEM_SUPPORT_UCOS为1,以支持UCOSII,通过这个设置,不仅可以实现利用delay_init来初始化SYSTICK,产生UCOSII的系统时钟节拍,还可以让delay_us和delay_ms函数在UCOSII下能够正常使用,这使得我们之前的代码可以十分方便的移植到UCOSII下。
虽然UCOSII也提供了延时函数:OSTimeDly和OSTimeDLyHMSM,但是这两个函数的最少延时单位只能是1个UCOSII时钟节拍,在本次实验中,即5ms,显然不能实现us级的延时,而us级的延时在很多时候非常有用:比如IIC 模拟时序,DS18B20等单总线器件操作等。
而通过delay_us和delay_ms,则可以方便的提供us和ms的延时服务,这比UCOSII本身提供的延时函数更好用。
在设置SYSTEM_SUPPORT_UCOS为1之后,UCOSII的时钟节拍由SYSTICK的中断服务函数提供,该部分代码如下:systick中断服务函数,使用ucos时用到void SysTick_Handler(void){OSIntEnter();//进入中断OSTimeTick(); //调用ucos的时钟服务程序OSIntExit(); //触发任务切换软中断}以上代码,其中OSIntEnter是进入中断服务函数,用来记录中断嵌套层数(OSIntNesting增加1);OSTimeTick是系统时钟节拍服务函数,在每个时钟节拍了解每个任务的延时状态,使已经到达延时时限的非挂起任务进入就绪状态;OSIntExit是退出中断服务函数,该函数可能触发一次任务切换(当OSIntNesting==0&&调度器未上锁&&就绪表最高优先级任务!=被中断的任务优先级时),否则继续返回原来的任务执行代码(如果OSIntNesting 不为0,则减1)。
事实上,任何中断服务函数,都应该加上OSIntEnter和OSIntExit函数,这是因为UCOSII是一个可剥夺型的内核,中断服务子程序运行之后,系统会根据情况进行一次任务调度去运行优先级别最高的就绪任务,而并不一定接着运行被中断的任务!最后,打开test.c,输入如下代码:#include "sys.h"#include "usart.h"#include "delay.h"#include "led.h"#include "includes.h"///////////////////////////////////////UCOSII任务设//////////////////////////////////////////////// //START 任务//设置任务优先级#define START_TASK_PRIO 10 //开始任务的优先级设置为最低//设置任务堆栈大小#define START_STK_SIZE 64//任务堆栈OS_STK START_TASK_STK[START_STK_SIZE];//任务函数void start_task(void *pdata);//LED0任务//设置任务优先级#define LED0_TASK_PRIO 7//设置任务堆栈大小#define LED0_STK_SIZE 64//任务堆栈OS_STK LED0_TASK_STK[LED0_STK_SIZE];//任务函数void led0_task(void *pdata);//LED1任务//设置任务优先级#define LED1_TASK_PRIO 6//设置任务堆栈大小#define LED1_STK_SIZE 64//任务堆栈OS_STK LED1_TASK_STK[LED1_STK_SIZE];//任务函数void led1_task(void *pdata);int main(void){Stm32_Clock_Init(9); //系统时钟设置delay_init(72); //延时初始化LED_Init();LED_Init(); //初始化与LED连接的硬件接口OSInit();OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务OSStart();}//开始任务void start_task(void *pdata){OS_CPU_SR cpu_sr=0;pdata = pdata;OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断) OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)}//LED0任务void led0_task(void *pdata){while(1){LED0=0;delay_ms(80);LED0=1;delay_ms(920);};}//LED1任务void led1_task(void *pdata){while(1){LED1=0;delay_ms(300);LED1=1;delay_ms(300);};}该部分代码我们创建了3个任务:start_task、led0_task和led1_task,优先级分别是10、7和6,堆栈大小都是64(注意OS_STK为32位数据)。