ucosii消息邮箱的使用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

-1-南京工程学院《嵌入式系统设计及应用》题目:μC/OS-II任务间消息邮箱程序设计班级:数控(卓越)131姓名:朱雨杭学号:203130501指导教师:徐友2016年6月4日-2-目录1、μC/OS-II实时操作系统......................................错误!未定义书签。(1)、μC/OS-II简介..........................................错误!未定义书签。(2)、μC/OS-II的组成......................................错误!未定义书签。(3)、μC/OS-II操作系统任务..........................错误!未定义书签。2、μC/OS-II消息邮箱设计......................................错误!未定义书签。(1)、功能图......................................................错误!未定义书签。(2)、流程图及设计理念..................................错误!未定义书签。(3)、程序清单................................................错误!未定义书签。(4)、系统函数调用及说明.......................................................-13-(5)、调试过程..................................................错误!未定义书签。(6)、调试结果..................................................错误!未定义书签。3、总结.......................................................................错误!未定义书签。-3-一.μC/OS-II实时操作系统1.μC/OS-II简介uC/OSII是用C语言与汇编语言编写的,大部分的代码都是用C语言来写,只有少数的与处理器相关的部分代码,用汇编语言来写。uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,具有移植方便,构思巧妙,结构简洁精练,执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。uC/OS-II只是一个多任务并发的实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,并且移植性很强,可以方便的移植到现实中大量存在的8位单片机系统与16位甚至32位系统,这些非必须的功能完全可以由用户自己根据需要分别实现。它的移植只与4个文件相关:汇编文件(OS_CPU_A.ASM)、处理器相关C文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_CFG.H)。有64个优先级,系统占用8个,用户可创建56个任务,不支持时间片轮转。它的基本思路就是“近似地每时每刻总是让优先级最高的就绪任务处于运行状态”。为了保证这一点,它在调用系统API函数、中断结束、定时中断结束时总是执行调度算法。-4-2.μC/OS-II组成μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。1)核心部分(OSCore.c):操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。2)任务处理部分(OSTask.c):任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。3)时钟部分(OSTime.c):μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。4)任务同步和通信部分:为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。5)与CPU的接口部分:是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。-5-3.μC/OS-II操作系统任务任务管理:uC/OS-II中最多可以支持256个任务,分别对应优先级0~255,其中0为最高优先级。255为最低级。uC/OS中最多可以支持64个任务,分别对应优先级0~63,其中0为最高优先级。63为最低级。uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整型变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。时间管理:uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。uC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。在ANSIC中是使用malloc和free两个函数来动态分配和释放内存。但在嵌入式实时系统中,多次这样的操作会导致内存碎片,且由于内存管理算法的原因,malloc和free的执行时间也是不确定。通信同步:uC/OS-II中把连续的大块内存按分区管理。每个分区中包含-6-整数个大小相同的内存块,但不同分区之间的内存块大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。任务调度:1)高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。2)高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。这两种调度方式在uC/OS-II的执行过程中非常普遍,一般来说前者发生在系统服务中,后者发生在时钟中断的服务程序中。调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。其最高优先级任务的寻找是通过建立就绪任务表来实现的。uC/OS-II中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块TCB(TaskControlBlock)的数据结构,其中第一个成员变量就是保存的任务堆栈指针。任务调度模块首先用变量OSTCBHighRdy记录当前最高级就绪任务的TCB地址,然后调用OS_TASK_SW()函数来进行任务切换。-7-二.μC/OS-II消息邮箱设计邮箱能够实现一个任务向另外一个任务发送消息。所谓的消息指的是指向某一变量、数组,字符串等的指针,所谓的邮箱指的是指向标记为邮箱使用的事件控制块的指针,用事件控制块结构体内的OSEventPtr来存储消息。消息传递的机制和信号量基本一致。1.创建消息邮箱函数原型如下OS_EVENT*OSMboxCreate(void*msg//消息指针);2.向消息邮箱发送消息函数原型如下INT8UOSMboxPost(OS_EVENT*pevent,//消息邮箱指针void*msg//消息指针);3.请求消息邮箱函数原型如下void*OSMboxPend(OS_EVENT*pevent,//消息邮箱指针INT16Utimeout,//等待时限INT8U*err//函数执行信息);-8-4.删除消息邮箱函数原型如下OS_EVENT*OSMboxDel(OS_EVENT*pevent,//消息邮箱指针INT8Uopt,//删除方式选项INT8U*err//函数执行信息);1.功能图:µC/OS-II提供了5种对邮箱的操作:OSMboxCreate(),OSMboxPend(),OSMboxPost(),OSMboxAccept()和OSMboxQuery()函数。下图描述了任务、中断服务子程序和邮箱之间的关系,这里用符号“I”表示邮箱。邮箱包含的内容是一个指向一条消息的指针。一个邮箱只能包含一个这样的指针(邮箱为满时),或者一个指向NULL的指针(邮箱为空时)。从图中可以看出,任务或者中断服务子程序可以调用函数OSMboxPost(),但是只有任务可以调用函数OSMboxPend()和OSMboxQuery()。-9-2.流程图及设计理念定义时间为30s,每过10秒,往分钟进1,任务结束后,显示3:0,下方出现“Timeisup!”。任务1为MyTask,用于发送消息。在此任务中,消息内容被压入发送消息缓冲区,并将其显示出来。消息指针Str_Box从发送消息缓冲区取出消息,并发送至任务2YouTask存入读取消息缓冲区,再由YouTask显示其内容。过程中任意时刻按下Esc键则终止程序。开始StartTaskStartTask任务挂起3秒MyTask发送消息至str_box显示缓冲区消息MyTask任务挂起1sYouTask从Str_Box接受消息显示缓冲区消息YouTask任务挂起1秒Ese-10-3.程序清单/************************Test*****************************/#includeincludes.h#defineTASK_STK_SIZE512//任务堆栈长度OS_STKStartTaskStk[TASK_STK_SIZE];//定义任务堆栈区OS_STKMyTaskStk[TASK_STK_SIZE];//定义任务堆栈区OS_STKYouTaskStk[TASK_STK_SIZE];//定义任务堆栈区INT16Skey;//用于退出的键INT8Uerr;INT8Uy=0;//字符显示位置INT32UTimes;OS_EVENT*Str_Box;voidStartTask(void*data);//声明起始任务voidMyTask(void*data);//声明任务voidYouTask(void*data);//声明任务/************************主函数*********************************/voidmain(void){OSInit();//初始化uCOS_IIPC_DOSSaveReturn();//保存Dos环境PC_VectSet(uCOS,OSCtxSw);//安装uCOS_II中断Str_Box=OSMboxCreate(NULL);//创建互斥型信号量(void*)0OSTaskCreate(StartTask,//创建任务StartTask(void*)0,//给任务传递参数&StartTaskStk[TASK_STK_SIZE-1],//设置任务堆栈栈顶0);//使任务的优先级别为0OSStart();//启动多任务管理}/**********************任务StartTask*******************************/voidStartTask(void*pdata){#ifOS_CRITICAL_METHOD==3OS_CPU_SRc

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功