uCOSii任务设计

合集下载

uCOS-II的核心算法

uCOS-II的核心算法

uCOS核心算法1.任务调度算法每个任务被赋予不同的优先级等级,从0级到最低优先级OS_LOWEST_PR1O,包括0和OS_LOWEST_PR1O在内(见文件OS_CFG.H)。

当μC/OS-Ⅱ初始化的时候,最低优先级OS_LOWEST_PR1O总是被赋给空闲任务idle task。

注意,最多任务数目OS_MAX_TASKS 和最低优先级数是没有关系的。

用户应用程序可以只有10个任务,而仍然可以有32个优先级的级别(如果用户将最低优先级数设为31的话)。

每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRedyGrp和OSRdyTbl[]。

在OSRdyGrp中,任务按优先级分组,8个任务为一组。

OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。

任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。

就绪表OSRdyTbl[]数组的大小取决于OS_LOWEST_PR1O(见文件OS_CFG.H)。

当用户的应用程序中任务数目比较少时,减少OS_LOWEST_PR1O的值可以降低μC/OS-Ⅱ对RAM(数据空间)的需求量。

为确定下次该哪个优先级的任务运行了,内核调度器总是将OS_LOWEST_PRIO在就绪表中相应字节的相应位置1。

OSRdyGrp和OSRdyTbl[]之间的关系见下图,是按以下规则给出的:当OSRdyTbl[0]中的任何一位是1时,OSRdyGrp的第0位置1,当OSRdyTbl[1]中的任何一位是1时,OSRdyGrp的第1位置1,当OSRdyTbl[2]中的任何一位是1时,OSRdyGrp的第2位置1,当OSRdyTbl[3]中的任何一位是1时,OSRdyGrp的第3位置1,当OSRdyTbl[4]中的任何一位是1时,OSRdyGrp的第4位置1,当OSRdyTbl[5]中的任何一位是1时,OSRdyGrp的第5位置1,当OSRdyTbl[6]中的任何一位是1时,OSRdyGrp的第6位置1,当OSRdyTbl[7]中的任何一位是1时,OSRdyGrp的第7位置1,不妨假设prio的值为13, 即优先级为13. prio>>3 右移3位后值为1, 可以查下表找出OSMapTbl[1] 的值为 0000 0010. 再用 0000 0010 和 OSRdyGrp 进行异或运算OSRdyGrp |= OSMapTbl[prio >> 3];OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];OSMapTbl[]的值Index Bit Mask (Binary)0 000000011 000000102 000001003 000010004 000100005 001000006 010000007 10000000读者可以看出,任务优先级的低三位用于确定任务在总就绪表OSRdyTbl[]中的所在位。

ucOS-II实验说明

ucOS-II实验说明

例2-6 设计一个只有一个任务MyTask的应用程序,当程序运行后,任务MyTask的工作就是每秒在显示器上面显示一个字符“M”。

学习实验代码,分析实现过程,观测实验结果,并写出实验报告。

例2-7 在例2-6应用程序的任务MyTask中再创建一个任务YouTask,当程序运行后,任务MyTask的工作在显示器上面显示一个字符“M”;而任务YouTask则是在显示器上显示字符“Y”。

学习实验代码,分析实现过程,观测实验结果,并写出实验报告。

例2-8 修改例2-7应用程序的任务YouTask。

要求任务YouTask运行20次后,挂起任务MyTask;任务YouTask运行40次后,恢复任务MyTask。

学习实验代码,分析实现过程,观测实验结果,并写出实验报告。

例2-9 改造例2-7的任务MyTask,当任务MyTask运行10次时,用函数OSSchedLock( )对调度器进行加锁;而当任务MyTask运行到第80次时,再用函数OSSchedUnlock( )对调度器进行解锁,并运行该程序。

学习实验代码,分析实现过程,观测实验结果,并写出实验报告。

例2-10 修改例2-7的应用程序,使任务MyTask能删除任务YouTask。

学习实验代码,分析实现过程,观测实验结果,并写出实验报告。

例2-11 建立一个起始任务TaskStart,由它再建立4个任务Task1、Task2、Task3和TaskClk 来完成如下任务:●由Task2和Task3各自来完成一个动画显示任务:在屏幕上依次输出字符“|”、“\”、“-”、“/”,而产生一个向左转动和一个向右的动画标志;●由TaskClk来获取系统时间并显示;●由Task1来初始化屏幕,创建其他4个任务和检查所有5个任务的任务堆栈使用情况并显示出来。

学习实验代码,分析实现过程,观测实验结果,并写出实验报告。

例3-1 在例2-6应用程序的基础上,在OS_CPU_C文件中按如下代码定义函数OSTimeTickHook( ) ,然后运行并查看运行结果。

uCOSii任务设计

uCOSii任务设计

第四章任务设计在基于实时操作系统的应用程序设计中,任务设计是整个应用程序的基础,其他软件设计工作都是围绕任务设计来展开,任务设计就是设计“任务函数”和相关的数据结构。

4.1 任务函数的结构在用户任务函数中,必须包含至少一次对操作系统服务函数的调用,否则比其优先级低的任务将无法得到运行机会,这是用户任务函数与普通函数的明显区别。

任务函数的结构按任务的执行方式可以分为三类:单次执行类、周期执行类和事件触发类,下面分别介绍其结构特点。

4.1.1 单次执行的任务此类任务在创建后只执行一次,执行结束后即自行删除,其任务函数的结构如下:程序清单L4-1 单次执行任务函数的结构void MyTask (void *pdata) //单次执行的任务函数{进行准备工作的代码;任务实体代码;调用任务删除函数; //调用OSTaskDel(OS_PRIO_SELF)}单次执行的任务函数由三部分组成:第一部分是“进行准备工作的代码”,完成各项准备工作,如定义和初始化变量、初始化某些设备等等,这部分代码的多少根据实际需要来决定,也可能完全空缺。

第二部分是“任务实体代码”,这部分代码完成该任务的具体功能,其中通常包含对若干系统函数的调用,除若干临界段代码(中断被关闭)外,任务的其它代码均可以被中断,以保证高优先级的就绪任务能够及时运行。

第三部分是“调用任务删除函数”,该任务将自己删除,操作系统将不再管理它。

单次执行的任务采用“创建任务函数”来启动,当该任务被另外一个任务(或主函数)创建时,就进入就绪状态,等到比它优先级高的任务都被挂起来时便获得运行权,进入运行状态,任务完成后再自行删除,“启动任务”就是一个例子。

采用“启动任务”后,主函数就可以简化为三行,只负责与操作系统有关的事情,即初始化操作系统、创建“启动任务”、启动操作系统,使主函数的内容固定下来,与具体的应用系统无关。

真正启动系统所需要的准备工作由“启动任务”来完成,它的内容与具体的系- 1 -- 2 -统密切相关。

ucos-ii及其任务

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 在任务建立的时候被初始化。

Ucos-II基础原理讲解,任务创建及中断问题

Ucos-II基础原理讲解,任务创建及中断问题

Ucos-II基础原理讲解,任务创建及中断问题2013-6-26 周三Haibara AI Ucos-II在移植过程中的特性,首先要理解所加入的实时操作系统是一个给予定时器节拍的系统。

怎么理解这个问题呢,由该定时器产生脉冲来驱动不同的任务调度,且由于该系统是基于可剥夺内核类型,任务之间的切换时间间隔也由该定时器完成。

不宜过大,否则会造成CPU利用率不高,不宜过小,否则会造成CPU在执行任务时非常被动,时间特别赶。

就想人的心脏一样,动力是固定的,你非要去跑个100公里,心脏不加速你是会窒息而死的。

我们正常心脏跳动是60次左右,同样,单片机也需要一个这样的相对宽松的节拍驱动。

注:众所周知,脉冲本质上仍由晶振提供(或实时时钟),原理都一样,再次请各位不要较真,就暂时以晶振为例。

大家可以考虑一下,晶振的作用是否特别类似于人体的心脏呢?答案是很显然的。

心脏跳动给人体提供输送血液和养料的压力,晶振的设计原理也正是源于此。

他可以像人体心脏一样提供动力输送各个外设(相当于人体器官)所需要的能量。

说这么多,就是要大家理解,人可以实时做出反应,因为人是有生命的,也就是他有反应、判断和处理能力,可以决定什么时间应该做什么。

但是单片机是没有生命的,换句话说,他所谓的处理能力源于人们的代码和程序。

那么,怎么让单片机像人一样拥有生命呢?答案很简单,给他指令,帮助他决定什么时间该做什么,这也就是所谓的实时操作系统。

不只是ucos,其他实时操作系统也是这个道理。

下面我以代码为例,讲述一下ucos的工作流程,如有错误,还请各位前辈指点。

首先任务是怎么样开始执行的?os_err = OSTaskCreateExt((void (*)(void *)) App_TaskStart, */1 (void * ) 0, 2(OS_STK * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],3(INT8U ) APP_TASK_START_PRIO,4(INT16U ) APP_TASK_START_PRIO,5(OS_STK * )&App_TaskStartStk[0],6(INT32U ) APP_TASK_START_STK_SIZE,7(void * )0,8(INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));9这个东西好像是非常复杂,但是实际上并不需要细究(当然非要细究也是允许的,只不过是C语言而已,看也不是看不懂,对于初学者而言并不推荐而已)。

实验二-UCOS-II任务管理

实验二-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嵌入式操作系统_实验3 任务的创建

ucos-ii嵌入式操作系统_实验3  任务的创建

实验 3 任务的创建、挂起与恢复课程名称:嵌入式操作系统 B1、实验目的理解任务管理的基本原理,了解任务的各个基本状态及其转换过程;掌握µC/OS-II 中任务管理的基本方法(创建、启动、挂起、恢复任务);熟练使用µC/OS-II 任务管理的基本系统调用。

理解任务的创建、挂起与恢复的原理及功能,掌握任务创建、挂起与恢复的实现过程。

2、实验内容(1)设计 Task0、Task1 两个任务:任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行,并输出两个任务在各个时刻的状态。

Task0 的主要功能是显示 Task1 的状态,Task1 的主要功能是显示 Task0 的状态。

整个应用的运行流程如图 1 所示,其描述如下:在 main 函数创建起始任务 TaskStart,其优先级为 0。

TaskStart 任务主要完成创建 2 个应用任务 Task0、Task1,并挂起自己(不再被其它任务唤醒)。

之后整个系统的运行流程如下:t1 时刻,Task0 开始执行,它运行到 t2 时刻挂起自己;t2 时刻,系统调度处于就绪状态的优先级最高任务 Task1 执行,它在 t3 时刻唤醒 Task0,后者由于优先级较高而抢占 CPU;Task0 执行到 t4 时刻又挂起自己,内核调度 Task1执行;Task1 运行至 t5 时刻再度唤醒 Task0;注意:图中的栅格并不代表严格的时间刻度,而仅仅表现各任务启动和执行的相对先后关系。

(2)设计 MyTask、YouTask、KeyTask 三个任务:MyTask 任务输出 M;YouTask 任务输出 Y,并输出 MyTask 任务的状态;KeyTask 任务从键盘接收字符 Y 或 N,当接收 Y 时挂起 MyTask 任务,当接收 N 时恢复 MyTask 任务。

(3)设计 KeyTask 任务,当从键盘输入+号时动态创建任务,最多可以创建 10 个任务,这 10个任务都执行一个函数 MyTask,要求优先级是(PRIO_BASE+0,1,2,3,4,5,6,7,8,9),还要向不同的任务传递不同的参数(0,1,2,3,4,5,6,7,8,9)给 MyTask 函数,优先级为(PRIO_BASE+0,1,2,3,4,5,6,7,8,9)的任务分别输出数字(0,1,2,3,4,5,6,7,8,9)。

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的方法,以实际案例为例进行讲解。

uCOSII程序设计示例课件

uCOSII程序设计示例课件
发送信号量
退出中断
Beep任务 等待ISR发出的信号量
Beep报警
PPT学习交流
22
工程模板应用| μC/OS-II程序设计
中断服务程序ISR示例代码如下。
ISR任务示例
void Timer1_Exception (void) {
T1IR = 0x01; VICVectAddr = 0; OSSemPost (sem); }
①② 、任务BA运获行得一允段许时运间行后的,信发息送后信,息立让即任启务动A;启完动成,操与作此后同,时发,送任信务息B挂告起知。 任务B,任务B可以启动并执行接下来的操作。
PPT学习交流
28
任务的同步和通信| 数据采集系统
任务的同步
2、任务同步的通信手段
μC/OS-II实时操作系统提供了以下通信手段,使某一任务得以向 另一任务发送同步信息,从而实现任务同步:
*/
/* 初始化定时器1(省略)
*/
/* 目标板初始化TargeInit() (省略) */
OS_EXIT_CRITICAL();
while (1) {
OSSemPend(sem, 0, &err);
IO0CLR = BEEP;
OSTimeDly(60);
IO0SET = BEEP;
OSTimeDly(60);
12
工程模板应用| μC/OS-II程序设计
选择工程摸板建立新工程:
摸板使用步骤
PPT学习交流
13
工程模板应用| μC/OS-II程序设计
摸板使用步骤
使用摸板建立新工程分为四个步骤.主要操作如下:
拷贝工程摸板
用户将光盘中的“ARM EXECUTABLE IMAGE FOR UCOS LPC2200 “文件拷贝 到”..\ARM\ADSV1.2\STATIONERY

北航ARM9嵌入式系统实验实验三uCOS-II实验

北航ARM9嵌入式系统实验实验三uCOS-II实验

北航ARM9嵌⼊式系统实验实验三uCOS-II实验实验三 uCOS-II实验⼀、实验⽬的在内核移植了uCOS-II 的处理器上创建任务。

⼆、实验内容1)运⾏实验⼗,在超级终端上观察四个任务的切换。

2)任务1~3,每个控制“红”、“绿”、“蓝”⼀种颜⾊的显⽰,适当增加OSTimeDly()的时间,且优先级⾼的任务延时时间加长,以便看清三种颜⾊。

3)引⼊⼀个全局变量BOOLEAN ac_key,解决完整刷屏问题。

4)任务4管理键盘和超级终端,当键盘有输⼊时在超级终端上显⽰相应的字符。

三、预备知识1)掌握在EWARM 集成开发环境中编写和调试程序的基本过程。

2)了解ARM920T 处理器的结构。

3)了解uCOS-II 系统结构。

四、实验设备及⼯具1)2410s教学实验箱2)ARM ADS1.2集成开发环境3)⽤于ARM920T的JTAG仿真器4)串⼝连接线五、实验原理及说明所谓移植,指的是⼀个操作系统可以在某个微处理器或者微控制器上运⾏。

虽然uCOS-II的⼤部分源代码是⽤C语⾔写成的,仍需要⽤C语⾔和汇编语⾔完成⼀些与处理器相关的代码。

⽐如:uCOS-II在读写处理器、寄存器时只能通过汇编语⾔来实现。

因为uCOS-II 在设计的时候就已经充分考虑了可移植性,所以,uCOS-II的移植还是⽐较容易的。

要使uCOS-II可以正常⼯作,处理器必须满⾜以下要求:(1)处理器的C编译器能产⽣可重⼊代码可重⼊的代码指的是⼀段代码(如⼀个函数)可以被多个任务同时调⽤,⽽不必担⼼会破坏数据。

也就是说,可重⼊型函数在任何时候都可以被中断执⾏,过⼀段时间以后⼜可以继续运⾏,⽽不会因为在函数中断的时候被其他的任务重新调⽤,影响函数中的数据。

(2)在程序中可以打开或者关闭中断在uCOS-II中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。

这需要处理器的⽀持,在ARM920T的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。

实验二-UCOS-II任务管理

实验二-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的使用权让给别的任务而使任务进入等待状态。

ucosII实验报告

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”六、实验结论对实验数据和结果进行分析描述,给出实验取得的成果和结论。

第二章uCOSII中任务

第二章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 )。

uCOSII原理及应用

uCOSII原理及应用
通过任务函数实现特定的功能,每个任务函数 对应一个独立的执行线程。
任务控制块
用于存储任务的运行状态和控制信息,包括任 务的优先级、状态、堆栈指针等。
任务切换函数
用于实现任务之间的切换,包括保存当前任务的上下文和恢复下一个任务的上 下文。
ucosii的任务管理
创建任务
通过调用ucosii提供的函数, 创建新的任务并分配相应的 资源。
在物联网应用中,ucosii能够为各种智能硬件提供统一的操 作系统平台,实现设备的互联互通和智能化管理。同时, ucosii还提供了丰富的中间件和驱动程序,方便开发者快速 开发出各种智能硬件和应用软件。
ucosii在嵌入式系统中的应用
嵌入式系统是指嵌入到硬件中的计算机系统,具有特定的功能和性能要求。ucosii作为一种实时操作 系统,在嵌入式系统中也有着广泛的应用。
调试工具
使用JTAG、SWD等调试工具,通过串口、网络等方式与目标板进行通信,实现程序的 下载、运行、断点设置等操作。
调试步骤
首先确认硬件连接正确,然后通过调试工具将程序下载到目标板中,设置断点并运行程 序,观察程序运行过程中变量的变化和程序的执行流程。
常见问题
硬件连接问题、调试工具配置问题、程序编译错误等。
ucosii的性能分析
性能指标
响应时间、吞吐量、资源利用率等。
分析方法
通过代码审查、性能测试、瓶颈分析等方法,找出影响性能的 关键因素,如算法复杂度、内存访问模式、IO性能等。
优化建议
针对分析结果,提出优化建议,如改进算法、优化数据结 构、减少IO操作等。
ucosii的优化建议
算法优化
通过改进算法,减少计算量和复杂度,提高程序执行效率。
易用性

uCOS_II_任务设计

uCOS_II_任务设计

这种单次执行的任务函数也可以多次执行, 这种单次执行的任务函数也可以多次执行,即每次创建执行完成后自行 删除,下次再创建再执行. 删除,下次再创建再执行.
Hazardous Environment Solution Solutions
采用"任务创建"的方式来启动任务,可以省略用通信手段触发任务 采用"任务创建"的方式来启动任务, 的麻烦,还可以通过" 来传递原始参数, 的麻烦,还可以通过"pdata"来传递原始参数,使得每次启动任务 来传递原始参数 时可以有不同的工作状态. 时可以有不同的工作状态. 当然,这种采用"创建任务"的方式来启动任务的也有缺点: 当然,这种采用"创建任务"的方式来启动任务的也有缺点: ①比较耗时,实时性差: 比较耗时,实时性差: 因为每次启动时都要调用OSTaskCreat( )或OSTaskCreatExt( ), 因为每次启动时都要调用 或 需要对TCB进行全面初始化,并要对"TCB链表"和"任务就绪表" 进行全面初始化,并要对" 链表" 任务就绪表" 需要对 进行全面初始化 链表 进行调整等操作; 进行调整等操作 ②处理函数会留下隐患: 处理函数会留下隐患:
Hazardous Environment Solution Solutions
(2)周期执行类 周期执行类
任务在创建后一个固定的周期来执行,其任务函数的结构为: 任务在创建后一个固定的周期来执行,其任务函数的结构为: void MyTask (void *pdata) { 进行准备工作的代码; 进行准备工作的代码 while( 1 ) { 任务实体代码; 任务实体代码 OSTimeDly( )/ OSTimeDlyHMSM( ); //调用系统延时函数 调用系统延时函数; 调用系统延时函数 } } 系统延时函数把CPU 的控制权主动交给操作系统,使自己挂起, 系统延时函数把 的控制权主动交给操作系统,使自己挂起, 再由操作系统来启动其它已经就绪的任务,当延时时间到后 当延时时间到后, 再由操作系统来启动其它已经就绪的任务 当延时时间到后,重新进 执行类

基于STM32和uC_OS-II的多任务设计-嵌入式系统课程设计报告

基于STM32和uC_OS-II的多任务设计-嵌入式系统课程设计报告

基于STM32和uC_OS-II的多任务设计-嵌入式系统课程设计报告NORTH CHINA UNIVERSITY OF SCIENCE AND TECHNOLOGY嵌入式系统课程设计报告学生姓名:学号:学院:专业班级:指导教师:同组成员:2016年 12 月 26 日嵌入式系统课程设计报告一、课程设计目的本课程设计是在《嵌入式系统原理与应用》课程的基础上,通过软件编程及仿真调试的实践,进一步掌握嵌入式系统的原理和应用方法,是毕业设计前的一次重要实践,为今后从事嵌入式系统相关工作岗位打下良好的基础。

二、设计题目及要求2.1 设计题目:基于STM32和uC/OS-II的多任务设计2.2 功能实现:使用uC/OS-II的任务管理函数和STM32库函数控制相应的寄存器,完成一个多任务设计。

整个设计共有4个任务,驱动一个LED指示灯闪烁、由3个LED指示灯组成的流水灯、驱动蜂鸣器和利用swd方式进行printf输出。

2.3 设计要求:理解和熟练使用KEIL软件、STM32寄存器、STM32库函数和uC/OS-II任务管理函数,用KEIL软件完成编程和调试,下载到开发板中实现4个设定的任务,并完成课程设计报告。

四个任务分别为:(1)驱动1个LED指示灯闪烁、(2)由3个LED指示灯组成流水灯(3)驱动蜂鸣器发出响声。

(4)利用swd方式进行printf输出。

三、设计原理说明3.1 硬件说明本次课程设计主要使用的是STM32 神舟 IV 号开发板为基础进行课程设计的,本节将详细介绍神舟IV号开发板的各部分硬件原理与实现。

(1)开发板资源图- 1 -嵌入式系统课程设计报告(2)MCU开发板的处理器是STM32F107VCT6,该处理器基于ARM V7 架构的Cortex-M3 内核,主频72Mhz,内部含有256K字节的FLASH 和64K字节的SRAM,LQFP100 封装。

(3)蜂鸣器开发板板载一个无源蜂鸣器,用于产品告警或声音提醒。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如用一个“发送”按钮启动串行口通信任务,将数据发送到上位机。在键盘任务中,按 下“发送”按钮后就发出信号量。在串行口任务中,只要得到信号量就将数据发给上位机,
-6-
示意代码如下:
程序清单 L4-8 用信号量触发任务
OS_EVENT *Sem; //信号量指针
void TaskKey (void *pdata)
pdata = pdata; 串行口初始化;
//串行口发送任务(示意)
-3-
组织发送帧; 数据指针初始化; 发送数据; OSTaskDel (OS_PRIO_SELF); //删除自己 }
采用“任务创建”的方式来启动任务,可以省略用通信手段触发任务的麻烦,还可以通
过*pdata 来传递原始参数,使得每次启动任务时可以有不同的工作状态。如下面的程序在创 建串行口发送任务时同时指定波特率:
}
单次执行的任务函数由三部分组成:第一部分是“进行准备工作的代码”,完成各项准 备工作,如定义和初始化变量、初始化某些设备等等,这部分代码的多少根据实际需要来决 定,也可能完全空缺。第二部分是“任务实体代码”,这部分代码完成该任务的具体功能, 其中通常包含对若干系统函数的调用,除若干临界段代码(中断被关闭)外,任务的其它代 码均可以被中断,以保证高优先级的就绪任务能够及时运行。第三部分是“调用任务删除函 数”,该任务将自己删除,操作系统将不再管理它。
//键盘任务函数(示意)
{
INT8U key; for (;;)
4.1.2 周期性执行的任务
此类任务在创建后按一个固定的周期来执行,其任务函数的结构如下:
程序清单 L4-6 周期性任务函数的结构
void MyTask (void *pdata)
//周期性执行的任务函数
{ 进行准备工作的代码; for (;;)
//无限循环,也可用 while (1)
{ 任务实体代码; 调用系统延时函数;
-1-
统密切相关。主函数和“启动任务”的示意代码如下:
程序清单 L4-2 使用启动任务
void main (void) //主函数
{ OSInit ();
//初始化操作系统
OSTaskCreate(TaskStart,(void *)0,&TaskStartStk[TASK_STK_SIZE-1],1);//创建启动任务 OSStart (); //启动操作系统,开始对任务进行调度管理
程序清单 L4-4 用创建任务的方式启动任务
void TaskKey (void *pdata)
//键盘任务函数(示意)
{
INT8U key; for (;;)
//无限循环,也可用 while (1)
{ key=keyin();
//获取按键操作信息
switch (key)
{ case KEY_SUART:
z 占用的共享资源尚未释放,使其它需要使用该资源的任务不能运行。 z 通信关系的“上家”任务(或 ISR)发出的信号量或消息将被积压而得不到响应。 z 通信关系的“下家”任务因为得不到信号量或消息而被遗弃(被永远挂起)。 z 可能留下未删除干净的废弃变量。 因此: z 如果该任务使用了共享资源,必须在自我删除之前释放(如释放内存块,发送互斥
程序清单 L4-5 在创建任务时传送参数
void TaskKey (void *pdata)
//键盘任务函数(示意)
{
INT8U key; INT16U baud; for (;;)
//波特率,由用户通过键盘选定 //无限循环,也可用 while (1)
{ key=keyin();
//获取按键操作信息
虽然用“创建任务”的方式来启动一个任务有以上方便之处,但每次启动任务都要调用 “任务创建函数”,需要对“任务控制块”进行全面初始化,并对“任务控制块链表”和“任 务就绪表”进行操作,比较耗时,故只适用于实时性要求不高的任务(如键盘操作启动的任 务)。采用“创建任务”的方式来启动一个任务除了实时性差外,还可能在任务自我删除后 出现后遗症:
{
pdata = pdata;
系统硬件初始化; //时钟系统、中断系统、外设等等 创建各个任务; //如键盘任务、显示任务、采样任务、数据处理任务、打印任务等等 创建各种通信工具; //如信号量、消息邮箱、消息队列等等
用户任务 1 本身的代码;
}
使用“单次执行”的任务函数结构的场合反而是可以多次执行的任务,每当需要执行该 任务时就将该任务创建一次。由键盘操作来启动的任务常采用这种结构,如用一个“发送” 按钮启动串行口通信任务,其程序如下:
//初始化操作系统
OSTaskCreate(TaskUser1,(void *)0,&TaskUser1Stk[TASK_STK_SIZE-1],1);//创建任务 1 OSStart (); //启动操作系统,开始对任务进行调度管理
}
-2-
void TaskUser1(void *pdata)
//用户任务 1
switch (key)
{ case KEY_SUART:
//“发送”按钮,创建串行口发送任务,带参数
OSTaskCreate(TaskUart,&baud,&TaskUartStk[TASK_STK_SIZE-1],3);
break; case KEY_$$$: //其它按钮的处理代码
.
.
.
} OSTimeDly(2);
-5-
当延时时间到后,重新进入就绪状态,通常能够很快获得运行权。 通过合理设置调用 OSTimeDly( ) 或 OSTimeDlyHMSM( )时的参数值可以调整任务的执
行周期。当任务执行周期远大于系统时钟节拍时,任务执行周期的相对误差比较小;当任务 执行周期只有几个时钟节拍时,相邻两次执行的间隔时间抖动不能忽视,任务的执行周期的 相对误差比较大,只适用于对周期稳定性要求不高的任务(如键盘任务);当任务执行周期 只有一个时钟节拍时,可将该任务的功能放到 OSTimeTickHook( )(时钟节拍函数中的钩子 函数)中去执行;当任务执行周期小于一个时钟节拍或者不是时钟节拍的整数倍时,将无法 使用延时函数对其进行周期控制,只能采用独立于操作系统的定时中断来触发。采用独立定 时器触发的任务具有很高的周期稳定性。
程序清单 L4-7 事件触发的任务函数的结构
void MyTask (void *pdata)
//事件触发执行的任务函数
{ 进行准备工作的代码; for (;;)
//无限循环,也可用 while (1)
{ 调用获取事件的函数; 任务实体代码;
//如:等待信号量、等待邮箱中的消息等等。
}
}
事件触发执行的任务函数也由三部分组成:第一部分“进行准备工作的代码”和第三部 分“任务实体代码”的含义与前面两种任务的含义相同,第二部分是“调用获取事件的函数”, 使用了操作系统提供的某种通信机制,等待另外一个任务(或 ISR)发出的信息(如信号量 或邮箱中的消息),在取得这个信息之前处于等待状态(挂起状态),当另外一个任务(或 ISR) 发出相关信息时(调用了操作系统提供的通信函数),操作系统就使该任务进入就绪状态, 通过任务调度,任务的实体代码获得运行权,完成该任务的实际功能。
第四章 任务设计
在基于实时操作系统的应用程序设计中,任务设计是整个应用程序的基础,其他软件设 计工作都是围绕任务设计来展开,任务设计就是设计“任务函数”和相关的数据结构。
4.1 任务函数的结构
在用户任务函数中,必须包含至少一次对操作系统服务函数的调用,否则比其优先级低 的任务将无法得到运行机会,这是用户任务函数与普通函数的明显区别。任务函数的结构按 任务的执行方式可以分为三类:单次执行类、周期执行类和事件触发类,下面分别介绍其结 构特点。
//调用 OSTimeDly( )或 OSTimeDlyHMSM( )
}
} 周期性执行的任务函数也由三部分组成:第一部分“进行准备工作的代码”和第二部分
“任务实体代码”的含义与单次执行任务的含义相同,第三部分是“调用系统延时函数”,
把 CPU 的控制权主动交给操作系统,使自己挂起,再由操作系统来启动其它已经就绪的任务。
信号量)。 z 如果该任务有关联任务(或 ISR),必须在自我删除之前将这种关联关系解除,而解
除关联关系需要删除关联任务和通信工具,这是得不偿失而又非常麻烦的事情。 适合采用“创建任务”的方式来启动的任务,通常是“孤立任务”,它们不和其它任务 进行通信(ISR 除外),只使用共享资源来获取信息和输出信息。如果不满足这个条件,应该 采用下面两种任务函数机构,并在系统启动时创建好。
//“发送”按钮,创建串行口发送任务
OSTaskCreate(TaskUart,(void *)0,&TaskUartStk[TASK_STK_SIZE-1],3);
break; case KEY_$$$: //其它按钮的处理代码
.
.
.
} OSTimeDly(2);
//延时
}
}
void TaskUart(void *pdata) {
4.1.1 单次执行的任务
此类任务在创建后只执行一次,执行结束后即自行删除,其任务函数的结构如下:
程序清单 L4-1 单次执行任务函数的结构
void MyTask (void *pdata)
//单次执行的任务函数
{ 进行准备工作的代码; 任务实体代码; 调用任务删除函数;
//调用 OSTaskDel(OS_PRIO_SELF)
由于“启动任务”不是用户系统的实质任务,又占用高优先级资源和任务资源,故不常 用。更常用的方法是将“启动任务”所完成的操作交给一个用户系统的实质任务来完成。这 时,主函数和有启动功能的任务函Байду номын сангаас的示意代码如下:
相关文档
最新文档