μCOS操作系统任务间消息邮箱通信程序设计论文.doc_第1页
μCOS操作系统任务间消息邮箱通信程序设计论文.doc_第2页
μCOS操作系统任务间消息邮箱通信程序设计论文.doc_第3页
μCOS操作系统任务间消息邮箱通信程序设计论文.doc_第4页
μCOS操作系统任务间消息邮箱通信程序设计论文.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南京工程学院嵌入式微控制器设计及应用课程设计论文 题 目:C/OS-II操作系统任务间消息邮 箱通信程序设计 系 别: 康尼学院 专 业: 自动化 班 级: K自动化121 姓 名: 孙 浩 学 号: 240120917 指导教师: 论文成绩: 2015年7月4日自动化学院摘 要在基于C/OS-的嵌入式应用程序设计中,不仅要充分利用C/OS-的任务间切换和调度机制,而且要很好地使用C/OS-的通信方式,才能使得应用程序更加灵活、有效。为了获得高效的应用程序,通过分析C/OS-的消息邮箱通信机制,并利用C/OS-的任务状态转换方法,提出一种应用程序设计方法,给出了应用程序的基本结构,大量实验说明,该方法是有效的,并且此应用程序结构清晰,易于理解,也容易实现。 关键字:嵌入式系统 C/OS- 消息邮箱AbstractIn embedded application design based on C/OS-,the mechanism of task switch and the ways of communications in C/OS- are used well so that application design is more flexible and effective. For obtaining a high effective application, a method of application design is produced through analyzing the mechanism of message mailboxes and using the ways of task switch in C/OS-, and the basic structure of the application is given. Many experiments show that the method is valid. The clear structure of the application is understood and realized easily. Key Words: embedded system C/OS- message mailboxes- 14 -目录1、C/OS-II的消息邮箱通信机制简述- 3 -2、C/OS-II实时操作系统- 3 -2、1 C/OS-II简介- 3 -2、2 C/OS-II工作原理- 3 -2、2、1 C/OS-II的组成- 4 -2、2、2 C/OS-II的任务调度机制- 4 -2、3 C/OS-II的文件结构- 5 -2、4 C/OS-II操作系统的特点- 7 -3、C/OS-II消息邮箱设计- 8 -3、1 功能图- 8 -3、2 流程图- 9 -3、3 程序清单- 10 -3、4 系统函数调用及说明- 12 -3、5 程序调试- 13 -3、6 程序执行结果及分析- 13 -4、总结- 13 -参考文献- 14 -1、C/OS-II的消息邮箱通信机制简述在多任务操作系统中,任务与任务间的切换往往要传递一些数据,为了适应不同数据的需求,最好在存储器中建立数据缓冲器,把要传递的数据放在数据缓冲器,以实现任务间的数据通信。如果把这个数据缓冲器称为消息数据缓冲器,那么在任务间传递数据的一个最简单的方法就是传递消息数据缓冲器的指针,这种用来传递消息数据缓冲器指针的数据结构就叫做消息邮箱。本设计实现了两个任务My task和You task之间的数据通信,由My task向You task发送消息。通过消息邮箱指针Str_Box从My task的任务堆栈区收取数据消息,再将消息发送至You task的任务堆栈区,实现任务间的消息传递。设计中,消息的每一次传递都显示任务名称及消息内容。最终可通过Esc键终止任务。2、C/OS-II实时操作系统2、1 C/OS-II简介C/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。C /OS-II是一个完整的、可移植、可固化、可裁剪的抢占式实时多任务内核。C/OS-II绝大部分的代码是用ANSII的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到64位,C/OS-II已在超过40种不同架构上的微处理器上运行。C/OS-II已经在世界范围内得到广泛应用,包括很多领域, 如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。实际上,C/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局(Federal Aviation Administration)的认证,可以用在飞行器上。这说明C/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统。除此以外,C/OS-II 的鲜明特点就是源码公开,便于移植和维护。2、2 C/OS-II工作原理2、2、1 C/OS-II的组成按功能分类,C/OS-II主要由5部分组成:(1) 核心部分(OS_CORE.C):完成操作系统初始化、任务调度等工作。 (2) 任务部分(OS_TASK.C):完成任务建立、删除、挂起和恢复等工作。 (3) 时钟部分(OS_TIME.C):完成任务延时和时间控制等工作。 (4) 任务通信和内存管理部分(OS_FLAG.C、OS_MBOX.C、OS_MEM.C、 OS_SEM.C、OS_Q.C、OS_MUTEX.C):完成协调任务和临界资源管理等 工作。(5) 与移植相关部分(OS_CPU_C.C、OS_CPU_A.ASM):需要根据不同的CPU 来编制实现堆栈 建立的函数和底层任务切换、时钟节拍中断函数等;另外还需要根据应用不同而更改或调整部分头函数(OS_CFG.H、UCOS_II.H、OS_CPU.H)的内容。2、2、2 C/OS-II的任务调度机制一个任务通常是一个无限的循环,由于任务的执行是操作系统内核调度的,因此任务是绝不会返回的,其返回参数必须定义成void。在C/OS-II中,当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就会被抢占,高优先级任务会立刻得到CPU的控制权(在系统允许调度和任务切换的前提下)。C/OS-II可以管理多达64个任务,但目前版本的C/OS-II有两个任务已经被系统占用了(即空闲任务和统计任务)。必须给每个任务赋以不同的优先级,任务的优先级号就是任务编号(ID),优先级可以从0到OS_LOWEST_PR10-2。优先级号越低,任务的优先级越高。C/OS-II总是运行进入就绪态的优先级最高的任务。调度的本质是任务堆栈与工作堆栈的相互复制。任务堆栈是每一个任务应有的、用于保存其执行时的上下文环境参数,包括其被中断的地址、工作寄存器和局部变量的值等信息。任务堆栈的数量与任务数量相等,系统任务也要有它们各自的任务堆栈。工作堆栈则是正在占用CPU的任务所使用的堆栈,也称硬件堆栈或系统堆栈。每台机器或者说每个系统只有一个工作堆栈,CPU通过堆栈指针操作工作堆栈的内容,如图中(1)、 (2)两部分所示。箭头组是指工作堆栈的内容向任务堆栈的复制,而则恰恰相反。每一次任务的调度都要进行任务上下文的保存和切换工作,即将当前工作堆栈的内容复制到旧任务的任务堆栈中,同时也把新任务的任务堆栈内容装入工作堆栈中去。 C/OS-II操作系统总是调度当前就绪队列中优先级最高的任务,并使其作为新任务进入执行状态并开始占用CPU资源。调度发生在每一个时钟节拍中断中,或在任务有函数调用后。这时,就绪队列中优先级均有可能发生变化。在其它情况下,也可能发生就绪队列优先级的变化,如当前执行任务对临界资源释放时引起的变化。用时钟节拍中断来实现调度,使系统对任务的实时调度响应时间大约在一个时钟节拍左右,以满足系统实时性的要求。C/OS-II中任务的优先级编号是唯一的,而任务编号和优先级编号可以不同。2、3 C/OS-II的文件结构(1) 核心部分:这部分代码与处理器无关,包括7个源程序文件和1个头文件。这部分主要负责的功能分别是内核管理、事件管理、消息队列管理、存储管理、消息管理、信号量处理、任务调度和定时管理。(2) 配置文件部分:这部分包括2个头文件,用来配置事件控制块的数目,以及是否包含消息管理相关的代码。(3) 移植代码部分:这部分包括1个头文件、1个汇编代码文件和1个C语言文件。在C/OS-II的移植过程中,用户所需要修改的也就是这部分。C/OS-II的文件结构图相关文件的具体功能:功能文件名称描述处理器相关OS_CPU.H操作系统移植时需要关注的文件,主要进行了数据类型、关中断方法、任务堆栈方向、任务切换的宏定义。OS_CPU_A.ASM操作系统移植时需要关注的文件,主要对任务切换时的处理过程进行了定义。其中OSTickISR()、OSStartHighRdy()、OSCtxSw()、OSIntCtxSw() 这几个函数的编写是整个移植的关键。OS_CPU_C.C操作系统移植时需要关注的文件,主要定义了堆栈初始化以及使用时的函数,以及对中断的处理,OSTaskStkInit() 函数的编写十分重要。应用相关INCLUDES.H操作系统移植时需要关注的文件,包括操作系统的头文件和用户设计的应用系统的头文件。OS_CFG.H操作系统移植时需要关注的文件,操作系统配置的定义,包括是否在DEBUG模式、支持的最多任务数等等。时间管理OS_TMR.C提供有关定时器的接口函数。OS_TIME.C提供有关系统时间以及时间延迟的接口函数。基础操作LIB_STR.C提供字符串拷贝函数 Str_Copy()。OS_DBG.C提供有关初始化函数以及其他调试信息相关的代码。任务管理OS_TASK.C提供了任务管理的各种函数调用,包括创建任务、删除任务、改变任务优先级、任务挂起和恢复等。任务间通讯和同步OS_MBOX.C提供了任务间通讯的邮箱方式的接口函数。OS_Q.C提供任务间通讯的消息队列方式的接口函数。OS_FLAG.C提供了任务间通讯的事件方式的接口函数。OS_SEM.C提供了任务间通讯的信号量方式的接口函数。OS_MUTEX.C提供了任务间通讯的互斥信号量的接口函数。内存管理OS_MEM.C提供内存管理相关的接口函数。任务调度OS_CORE.C有关操作系统中任务调度的代码。2、4 C/OS-II操作系统的特点1、源代码:C/OS-II全部以源代码的方式提供给使用者(约5500行)。该源码清晰易读,结构协调,且注解详尽,组织有序;2、可移植(portable): C/OS-II的源代码绝大部分是用移植性很强的ANSI C写的,与微处理器硬件相关的部分是用汇编语言写的。C/OS-II可以移植到许许多多不同的微处理器上,条件是:该微处理器具有堆栈指针,具有CPU内部寄存器入栈、出栈指令,使用的C编译器必须支持内嵌汇编,或者该C语言可扩展和可链接汇编模块,使得关中断和开中断能在C语言程序中实现;3、可固化(ROMable): C/OS-II是为嵌入式应用而设计的,意味着只要具备合适的系列软件工具(C编译、汇编、链接以及下载/固化)就可以将C/OS-II嵌入到产品中作为产品的一部分;4、可裁减(scalable): 可以只使用C/OS-II中应用程序需要的系统服务。可裁减性是靠条件编译实现的,只需要在用户的应用程序中定义那些C/OS-II中的功能应用程序需要的部分就可以了;5、可抢占性(preemptive): C/OS-II是完全可抢占型的实时内核,即C/OS-II总是运行就绪条件下优先级最高的任务;6、多任务: C/OS-II可以管理64个任务。赋予每个任务的优先级必须是不相同的,这就是说C/OS-II不支持时间片轮转调度法(该调度法适用于调度优先级平等的任务);7、可确定性: 绝大多数C/OS-II的函数调用和服务的执行时间具有可确定性。也就是说用户能知道C/OS-II的函数调用与服务执行了多长时间。进而可以说,除了函数OSTimeTick()和某些事件标志服务,C/OS-II系统服务的执行时间不依赖于用户应用程序任务数目的多少;8、任务栈: 每个任务都有自己单独的栈。C/OS-II允许每个任务有不同的栈空间,以便降低应用程序对RAM的需求;9、系统服务: C/OS-II提供许多系统服务,比如信号量、互斥信号量、事件标志、消息邮箱、消息队列、时间管理等等;10、中断管理: 中断可以使正在执行的任务暂时挂起。如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可以达255层;11、稳定性和可靠性: C/OS-II的每一种功能、每一个函数以及每一行代码都经过了考验和测试,具有足够的安全性与稳定性,能用于与人性命攸关、安全性条件极为苛刻的系统中。3、C/OS-II消息邮箱设计3、1 功能图定义任务1为My Task,用于发送消息。在此任务中,消息内容被压入发送消息缓冲区,并将其显示出来。消息指针Str_Box从发送消息缓冲区取出消息,并发送至任务2 You Task存入读取消息缓冲区,再由You Task显示其内容。过程中任意时刻按下Esc键则终止程序。3、2 流程图 3、3 程序清单/*Test*/#include includes.h#define TASK_STK_SIZE 512 /任务堆栈长度OS_STK StartTaskStkTASK_STK_SIZE;/定义任务堆栈区OS_STK MyTaskStkTASK_STK_SIZE;/定义任务堆栈区OS_STK YouTaskStkTASK_STK_SIZE;/定义任务堆栈区INT16S key; /用于退出的键INT8U err; /错误返回INT8U y=0; /字符显示位置OS_EVENT *Str_Box; /创建邮箱void StartTask(void *data); /声明起始任务void MyTask(void *data); /声明任务void YouTask(void *data); /声明任务/*主函数*/void main (void) OSInit( ); /初始化C/OS- PC_DOSSaveReturn( ); /保存Dos环境 PC_VectSet(uCOS, OSCtxSw); /安装C/OS-中断 Str_Box = OSMboxCreate(NULL); /创建互斥型信号量 (void*)0 OSTaskCreate(StartTask, /创建任务StartTask(void*)0, /给任务传递参数&StartTaskStkTASK_STK_SIZE - 1, /设置任务堆栈栈顶0); /使任务的优先级别为0 OSStart( ); /启动多任务管理/*任务StartTask*/void StartTask (void *pdata)#if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr;#endif pdata = pdata; OS_ENTER_CRITICAL( ); PC_VectSet(0x08, OSTickISR); /安装时钟中断向量 PC_SetTickRate(OS_TICKS_PER_SEC); /设置C/OS-时钟频率 OS_EXIT_CRITICAL( ); OSStatInit( ); /初始化统计任务 OSTaskCreate(MyTask, /创建任务MyTask(void*)0, /给任务传递参数&MyTaskStkTASK_STK_SIZE - 1, /设置任务堆栈栈顶3); /使任务的优先级别为3 OSTaskCreate(YouTask, /创建任务YouTask(void*)0, /给任务传递参数&YouTaskStkTASK_STK_SIZE - 1, /设置任务堆栈栈顶4); /使任务的优先级别为4 for (;) if (PC_GetKey(&key) = TRUE) /如果按下Esc键则退出 if (key = 0x1B) PC_DOSReturn(); OSTimeDlyHMSM(0, 0, 2, 0); /等待2秒 /*任务MyTask*/void MyTask (void *pdata)char *s=My Message;#if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr;#endif pdata = pdata; for (;) PC_DispStr(5, +y, /显示字符串MyTask, DISP_BGND_BLACK+DISP_FGND_WHITE );OSMboxPost(Str_Box,s); /发送消息 PC_DispStr(15,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE ); OSTimeDlyHMSM(0, 0, 1, 0); /等待1秒 /*任务YouTask*/void YouTask (void *pdata)char *ss;#if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr;#endif pdata = pdata; for (;) PC_DispStr(40, +y, /显示字符串YouTask, DISP_BGND_BLACK+DISP_FGND_WHITE ); ss=OSMboxPend(Str_Box,0,&err); /接收消息 PC_DispStr(50,y,ss,DISP_BGND_BLACK+DISP_FGND_WHITE ); OSTimeDlyHMSM(0, 0, 1, 0); /等待1秒 /*End*/3、4 系统函数调用及说明函数名称功能说明OSInit( )OS运行的第一个函数,它完成各初始变量的初始化

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论