μCOS2在ARM7中的移植与应用—毕业设计.doc

上传人:仙人指路1688 文档编号:3932951 上传时间:2023-03-28 格式:DOC 页数:39 大小:352.50KB
返回 下载 相关 举报
μCOS2在ARM7中的移植与应用—毕业设计.doc_第1页
第1页 / 共39页
μCOS2在ARM7中的移植与应用—毕业设计.doc_第2页
第2页 / 共39页
μCOS2在ARM7中的移植与应用—毕业设计.doc_第3页
第3页 / 共39页
μCOS2在ARM7中的移植与应用—毕业设计.doc_第4页
第4页 / 共39页
μCOS2在ARM7中的移植与应用—毕业设计.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《μCOS2在ARM7中的移植与应用—毕业设计.doc》由会员分享,可在线阅读,更多相关《μCOS2在ARM7中的移植与应用—毕业设计.doc(39页珍藏版)》请在三一办公上搜索。

1、C/OS-在ARM7中的移植与应用摘要随着信息化技术的发展和数字化产品的普及,以计算机技术、半导体技术和软件技术为核心的嵌入式系统再度成为当前研究和应用的热点.通信、计算机、消费电子技术合一的趋势正在逐步形成,无所不在的网络和无所不在的计算正在将人类带入一个崭新的信息社会。由于当前的嵌入式系统大多数具有一定的实时性要求,本文将重点讨论嵌入式实时系统。嵌入式实时操作系统已经在通信网络、自动控制、信息家电、国防等领域得到了越来越广泛的应用,其中嵌入式实时操作系统(RTOS)是整个嵌入式实时系统的核心。本文叙述了一种源代码开放的嵌入式实时操作系统C/OS-多任务内核的工作原理,及其在ARM7系列单片

2、机上的移植及应用设计。分析了C/OS-的源代码,并对API的应用方法,任务的建立方法,以及移植相关部分的核心代码作了深入的研究;具体应用在LPC2134微处理器上在C/OS-的环境中,实现了串口通信及流水灯控制两个任务。关键词:ARM7 ;C/OS-;移植;串口通信Transplantation and applied of C/OS-into ARM7AbstractAs information technology development and digital product popularization, the embedded system based computer scien

3、ce, chip and software technology is becoming hotspot of research and application. The syncretism of the communication, computer and consumptive electronic product is coming into being. Everything connecting and ever where computing is bringing the people to a new information world. An embedded real-

4、time system,as its name implies,possesses the characteristics of both an embedded system and a real-time system.Embedded real-time operating system has been in communication networks, automatic control, information appliances, defense and other fields has been growing a wide range of applications, i

5、ncluding embedded real-time operating system (RTOS) is the core of embedded real-time systems. This paper describes an open-source embedded real-time multi-tasking operating system kernel C/OS- working principle, and its single chip ARM7 family and the transplant applications. C/OS- analyzed the sou

6、rce code, and the application of API methods, the establishment of the task, as well as transplant-related part of the core code of the study in depth; specific application in LPC2134 microprocessors in C/OS- environment, the realization of the serial communication and control of two task lights wat

7、er.Key words: ARM7; C/OS-; transplantation; serial communication目录1 绪论11.1嵌入式系统的定义11.2嵌入式系统的发展与现状21.3目前主要的实时操作系统21.3.1商用型实时嵌入式操作系统31.3.2免费的实时操作系31.4本文主要工作42 嵌入式实时操作系统C/OS-52.1 嵌入式实时操作系统C/OS-II分析52.1.1临界段代码处理52.1.2 任务62.2.3 任务的调度72.2.4 任务切换92.2.5 中断92.2.6 信号量92.2.7 消息邮箱112.2.8 消息队列122.2.8 任务的建立133 AR

8、M简介与C/OS-在ARM7上的移植143.1 ARM简介143.1.1 ARM7TDM I (-S)143.1.2 ARM核芯片的指令集143.1.3 ARM的寄存器153.2 C/OS-在ARM7上的移植163.2.1修改OS_CPU.H文件163.2.2修改0S_CPU_C.C文件183.2.3修改OS_CPU_A.S文件194 移植应用234.1 硬件平台介绍234.1.1 处理器LPC2134244.2 软件介绍244.2.1 软件总体框架244.3任务一 C/OS-中的串口通讯254.3.1 原理与实现254.3.2 初始化254.3.3 串口通信中断处理264.3.4发送数据29

9、4.3.5 接收数据304.4 任务二 对流水灯的控制31结论33致谢34参考文献351 绪论如今,随着计算机技术和网络技术的发展,嵌入式系统已经得到迅速与广阔的发展,渗透到世界的每个角落:空间技术,军事技术,科学工程, 民用产业等。比如我们所熟悉的手机,MP3,再远到美国的火星行走机器人无一不用到嵌入式系统。可以说嵌入式技术已经和我们的生活紧密结合在一起,在PC时代可能很多并没有接触到计算机,而在不远的将来我们将无时无刻不和大大小小的嵌入式计算机打交道。可见的未来数字化将不断渗透到我们的生活中,特别是消费电子,计算机,通讯(3C)将不断融合,在这样大的环境和巨大的需求下嵌入式系统越发成为研究

10、与应用的焦点。1.1嵌入式系统的定义根据 IEEE的定义嵌入式系统是“Devices used to control,monitor,or assist of operation of equipment ,machinery or plants”(用来控制,监视和辅助设备,机器和各种平台运行的装置)这是一种针对嵌入式系统作用的高度概括,从定义中可以知道嵌入式系统是一种实实在在的物体,可以一种更详细的描述“嵌入式系统是以应用为中心,计算机技术为基础,软件与硬件结合并且可进行相应的裁减,适应应用系统对功能,可靠性,成本,体积,功耗均严格要求的定制的计算机系统”1。对嵌入式系统的理解可归结为如下几

11、点:1.嵌入式系统是以应用为目标的,具有很强的实用性,它必须与实用相结合才具 有生命力。2. 嵌入式系统是多学科相融合的产物,包括了计算机软件技术,电子技术,半导体技术等。 3.嵌入式系统必须针对不同的实际应用而进行相应的裁减,以保证最后得到一 个所需的安全,可靠,满足要求的应用系统。比如同样的一个嵌入式系统内核根据应用的不同而进行不同的裁减,裁减后的代码大小可以从几十K到几K。4.嵌入式系统的定义是很广泛的,如今很难准确的给它下一定义,可以说 在实际中应用的软件与硬件相结合的,具有控制和其他外延功能的装置都可以称之为嵌入式系统。1.2嵌入式系统的发展与现状嵌入式系统的概念很早就存在了,从诞生

12、到现在己有近五十年的时间,嵌入式实时系统(RTOS)的研究是是从上世纪六十年代开始的,从其系统结构上来看嵌入式系统的发展可分为三个主要阶段:1. 早期的实时操作系统早期的实时操作系统还不能称之为真正的RTOS,它只是一种小而简单的,带有一定专用性的软件,功能较为简单,可以认为其是一种实时监控程序。它一般为用户提供初始化管理与简单的实时时钟管理,有的实时监控程序也引入了任务调度于简单的任务间协调功能,属于这类实时监控程序的有RTMX等。这个阶段。实时应用比较简单,实时性要求也不高,应用程序,实时监控程序和硬件平台紧密结合在一起,不具有通用性。2.专用的实时操作系统随着应用的发展,早期的RTOS越

13、来越显现出不足之处,有些实时系统的开发者为了满足实时应用的需要, 自己研制与硬件平台相匹配的实时操作系统,这类专用实时操作系统被称之为Real-Time Operation System Developed in House。它是早期为满足用户需要而研制的,只能满足特定的硬件环境,缺乏严格的测试,移植性也很差。3.通用的实时操作系统各种专用的RTOS中,一些多任务的机制如基于优先级的调度,实时时钟管理,任务间的通讯,同步互斥机制是基本相同的,不同的只是面对各自不同的硬件环境与应用目标。实际上,相同的多任务机制是能够共享的,因而可以很好的把这部分组织起来,形成一个实时操作相同的内核。这类实时操作

14、系统大多采用软组织结构,以一个个通用的软件“标准组件”构成通用的实时操作系统。一方面,在RTOS的最底层将不同的硬件特性屏蔽起来;另一方面,对不同的应用环境提供了标准的,可裁减的系统服务软件组件,这使得用户可根据不同的实时应用要求与硬件环境选择不同的软组件,这也使得实时操作系统开发商在开发阶段减少重复性的操作。1.3目前主要的实时操作系统20世纪80年代起,国际上就有有一些IT组织,公司开始进行商用嵌入式操作系统与专用操作系统的研发,这其中涌现了一些著名的嵌入式操作系统。经过多年的发展,目前世界上己经有一大批十分成熟的嵌入式实时操作系统。这些实时操作系统种类繁多,大体上可以分为两类,商用的和免

15、费的,商用型的实时操作系统功能稳定,可靠,并且有完善的技术支持与售后服务,但是往往价格昂贵。免费型的实时操作系统在价格方面具有突出的优势, 目前主要是Linux与C/OS-。1.3.1商用型实时嵌入式操作系统1.VxworksVxworks操作系统是美国WinderRiver公司于1983年设计开发的一种实时嵌入式操作系统(RTOS),由于具有高性能的系统内核和友好的用户开发环境,在实时嵌入操作系统领域占有一席之地。值得一提的是,美国的JPI.实验室研制的著名的“索杰纳”火星车采用的就是Vxworks操作系统。Vxworks的突出特点是:可靠性、实用性和可裁剪性,它是目前嵌入式系统领域使用最广

16、泛,市场占有率最高的操作系统。2. Window CE 3.0一种针一对小容量,移动式,智能化,32位,连接设备的模块化实时嵌入式操作系统。需要说明的是,Windows CE 3.0.以前的的产品都不是实时操作系统,属于软实时操作系统,其优点是基于Windows背景,用户界面比较漂亮,容易为用户所接受。3. PSOSPSOS原属ISI公司的产品,但ISI己经被WindRiver公司兼并,现在PSOS属于WindRiver公司的产品。该系统是一个模块化、高性能的实时操作系统,专为嵌入式微处理器设计,提供一个完全的多任务环境,在定制的或是商业化的硬件上具有高性能和高可靠性,可以让开发者根据操作系统

17、的功能和内存需求定制每一个应用所需的系统。开发者可以利用它来实现从简单的单个独立设备到复杂的、网络化的多处理器系统。其它的实时操作系统还有QNX,OS-9,LynxOS,Palm OS等等。1.3.2免费的实时操作系1. Linux自由免费Linux的出现对目前商用嵌入式操作系统带来了冲击。Linux有一些吸引人的优势,它可以移植到多个有不同结构的CPU和硬件平台上,具有很好的稳定性,而且容易开发。Linux有得天独厚的优势。首先,Linux是开放源代码的,不存在黑箱技术,遍布全球的众多的Linux爱好者又是Linux开发的强大技术后盾;其次,Linux的内核小、功能强大、运行稳定、效率高;第

18、三,Linux是一种开放源码的操作系统,易于定制裁剪;第四,Linux不仅支持x86CPU,还可以支持其他数十种CPU的芯片;第五,Linux沿用了Unix的发展方式,遵循国际标准,可以方便地获得第三方软硬件厂商的支持。因此它不仅可以充当嵌入式系统的开发平台,其本身也是嵌入式系统应用开发的好工具。2. C/OS-C/OS-是“C/OS的升级版本。C/OS-是一个源代码开放的实时操作系统,可移植、可固化嵌入到产品中成为产品的一部分)、可裁剪,属于占先式实时内核。执行时间可确定(即函数调用与服务的时间是可知的,不依赖于应用程序的多少),支持现有大多数型号的8位、16位、32位MCU/MPUI己被广

19、泛应用于交换机、路由器、过程控制、汽车业、办公自动化、计算机外设以及民用消费类产品等,具有稳定的可靠性。1.4本文主要工作本文分析和研究了实时操作系统的原理与源代码开放的C/OS-嵌入式实时操作系统,及其C/OS-在ARM7内核的32位微处理器LPC2134上的移植及应用,同时对C/OS-环境下的应用进行了研究。2 嵌入式实时操作系统C/OS-2.1 嵌入式实时操作系统C/OS-II分析C/OS-II 是一个简单、高效的嵌入式实时操作系统内核,被应用到各种嵌入式系统中。目前,它支持 x86、ARM、PowerPC、MIPS 等众多体系结构,并有上百个商业应用实例,其稳定性和可用性是经过实践验证

20、的。同时,它的源代码公开,可以从网站上获得全部源码以及其在各种体系结构平台上的移植范例。最新的C/OS-II 2.0 版以上的内核都具有可抢占的实时多任务调度功能,另外它还提供了许多系统服务,例如信号量、消息队列、邮箱、内存管理、时间函数等,这些功能可以根据不同的需求进行裁减。可以说,C/OS-II是一个具备现代操作系统特点的RTOS,同时它结构清晰、注解详尽,具有良好的可扩展性和可移植性,被广泛地应用于各种架构的微处理器上2。2.1.1临界段代码处理临界区代码在处理时是不可分割的。运行这些代码不允许被打断。一旦这部分代码开始执行,则不允许任何中断打入(这不是绝对的,如果中断不调用任何包含临界

21、区的代码,也不访问任何临界区使用的共享资源,则这个中断可能可以执行)。几乎所有的实时系统内核在处理临界段代码时都须要关中断,C/OS-II同样如此,关中断的好处在于能避免其它任务或资源同时进入临界段代码,在进入临界区之前要关中断,而临界区代码执行完成以后要立即开中断。C/OS-II定义了2个宏(MACROS)以实现关中断与开中断,两个宏调用分别是:OS_E NTER_CRITICAL()和OS_EXIT_CRITICAL()。在文件OS_CPU.H中可以找到相应宏定义。OS_ ENTER_CRITICAL()和OS_EXIT_CRITICAL()总是成对使用的,以下是示意代码,程序清单: OS

22、_ENTER_CRITICAL();/*C/OS-II 临界段代码*/OS_EXIT_CRITICAL();2.1.2 任务任务也称为线程。一个任务就是一个简单的程序,该程序可以认为CPU完全只属于自己。实时应用程序的设计过程包括如何把问题分割成多个任务。每个任务都是整个应用的一部分,都被赋予一定的优先级,有自己的一套CPU寄存器和栈空间。每个任务都是一个无限的循环,在任何时刻,任务都处在以下5种状态休眠态、就绪态、运行态、挂起态及中断态。图2.1是C/OS-控制下的任务状态切换图。C/OS-可以管理多达64个任务,但目前版本的C/OS-有2个任务已经被系统占用了。必须给每个任务赋以不同的优先

23、级,优先级号越低,任务的优先级越高。C/OS-总是运行进入就绪态的优先级最高的任务。OSTaskDel()等待或挂起运 行就 绪 中断服务程序OSIntSendSignal()OSSendSignal()OSSemIntPost()OSSemPost()OSQIntPost()OSQPost()OSQIntPostFront()OSQPostFront()OSWait()OSQPend()OSSemPend()OSTimeDly()OSIntExit()OS_TASK_SW()任务被占先中断OSIntExit()休 眠 OSTaskDel()OSTaskCreate()OSTaskCreate

24、Ext()OSTaskDel()图2.1 C/OS-控制下的任务状态切换图休眠态指任务驻留在程序空间之中,还没有交给C/OS-管理。把任务交给C/OS-是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。当任务一旦建立,这个任务就进入就绪态准备运行。任务的建立可以是在多任务运行开始之前,也可以是动态的被一个运行着的任务建立。如果一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的那个任务,则这个刚刚建立的任务将立即得到CPU的控制权。一个任务可以通过调用OSTaskDel()返回到休眠态,或通过调用该函数让另一个任务进入休眠态。调用OSStar

25、t()可以启动多任务调度系统。OSStart()函数运行进入就绪态的优先级最高的任务。就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或OSTimeHMSM()。这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU的控制权。等待的时间过去以后,系统服务函数OSTimeTick()使延迟了的任务进入就绪态。正在运行的任务期待某一事件的发生时也要等待,方法是调用以下3个函数之一:OSSemPend(),OSMboxP

26、end(),或OSQPend()。调用后任务进入了等待状态。当任务因等待事件被挂起,下一个优先级最高的任务立即得到了CPU的控制权。当事件发生了,被挂起的任务进入就绪态。事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。正在运行的任务是可以被中断的,除非该任务将中断关了,或者C/OS-将中断关了。被中断了的任务就进入了中断服务态(ISR)。响应中断时,正在执行的任务被挂起,中断服务子程序控制了CPU的使用权。中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种情况下,从中断服务子程序返回之前,C/OS-要判定被中断的任务是否还是就绪态任务中优先级最高的。

27、如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原来被中断了的任务才能继续运行。当所有的任务都在等待事件发生或等待延迟时间结束,C/OS-执行空闲任务,执行OSTaskIdle()函数。2.2.3 任务的调度C/OS-总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntEx()完成的。如果不是在中断服务子程序调用OSSched(),并且任务调度是允许的,即没有上锁,则任务调度

28、函数将找出那个进入就绪态且优先级最高的任务,进入就绪态的任务在就绪任务表中有相应的位置位。一旦找到那个优先级最高的任务,OSSched()检验这个优先级最高的任务是不是当前正在运行的任务,以此来避免不必要的任务调度2。OSSched()函数程序一开始首先关中断,因为OSSchdeO所有代码都属于临界区;任务需要调度时,寻找优先级最高的就绪任务并判断该任务是否为当前运行任务,不是当前任务时将变量OSTCBHighRdy指向优先级最高任务的控制块OS_TCB(C/OS-中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块TCB的数据结构,其定义在C/OS_ii.h中,C/OS-用它来保存任务的

29、状态,其中第一个成员变量保存对应任务的堆栈指针,任务调度模块用OSTCBHighRdy记录当前最高优先级就绪任务TCB地址);然后调用OS_TASK_SW()函数进行实际上的任务切换。OSSched()的程序流程见图2.2。关中断找出进入就绪态且优先级最高的任务OSTCBHighRdy指向优先级最高的任务控制块统计计数器OSCtxswCtr加1(存放每秒调度次数用以跟踪任务切换次数)调用OS_TASK_SW()完成任务切换开中断开始调用来自中断服务子程序或任务调度上锁?结束优先级最高的任务正在运行?YY图2.2 OSSched程序流程图2.2.4 任务切换当多任务内核决定运行另外的任务时,保存

30、正在运行任务的当前状态,即保存CPU寄存器中的全部内容。这些内容保存在任务的当前状态保存区,也就是任务自己的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状态从任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程就成为任务切换。这个过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。实时内核的性能不应该以每秒钟能做多少次任务切换来评价。2.2.5 中断中断是一种硬件机制,用于通知CPU有异步事件发生了。中断一旦被识别,CPU保存部分(或全部)上下文即部分(或全部)寄存器的值,跳转到专门的子程序。该

31、子程序称为中断服务子程序(ISR)。中断服务子程序做事件处理,处理完成后,程序回到以下部分:(1)在前、后台系统中,程序回到后台程序;(2)对非占先式内核而言,程序回到被中断了的任务;(3)对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。中断使得CPU可以在事件发生时才予以处理,而不必让微处理器连续不断地查询是否有事件发生。通过两条特殊指令,即关中断和开中断,可以让微处理器不响应或响应中断。在实时环境中,关中断的时间应尽量地短。关中断影响中断延迟时间。关中断时间太长可能会引起中断丢失。微处理器一般允许中断嵌套,也就是说在中断服务期间,微处理器可以识别另一个更重要的中断,并服务于那个更

32、重要的中断。2.2.6 信号量信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(065535);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H 中将OS_SEM_EN开关量常数置成1,这样C/OS-才能支持信号量。OSSemCreate()信号量的初始计数值赋值,初始值为0到65,535之间的一个数。如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。最后,如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并

33、把该信号量作为一个可计数的信号量使用。C/OS-提供了5个对信号量进行操作的函数。它们是:OSSemCreate()建立信号量,OSSemPend()等待信号量,OSSemPost()发送信号量,OSSemQuery()查询信号量。程序清单:建立一个信号量OS_EVENT *OSSemCreate (INT16U cnt) OS_EVENT *pevent; OS_ENTER_CRITICAL();pevent = OSEventFreeList;/*从空闲任务控制块链表中得到一个事件控制块*/if (OSEventFreeList != (OS_EVENT *)0) /*指向下一个空闲的事件

34、控制块*/ OSEventFreeList = (OS_EVENT *)OSEventFreeList-OSEventPtr; OS_EXIT_CRITICAL();if (pevent != (OS_EVENT *)0) pevent-OSEventType = OS_EVENT_TYPE_SEM; /*设置任务控制块的事件类型*/ pevent-OSEventCnt = cnt; OSEventWaitListInit(pevent);/*初始化一个任务控制块*/ return (pevent);2.2.7 消息邮箱消息邮箱也称作交换消息,用于在任务与任务、任务与中断服务程序之间传递消息。

35、一个任务或中断服务程序可以通过内核服务把一消息(即指向消息的指针)放到邮箱里。同样,任务或中断服务程序可以通过肉核服务从邮箱中接收一则消息。发送消息的任务和接收消息的任务约定,该指针指向的内容就是那则消息。每个邮箱有对应的等待消息的任务列表,要得到消息的任务会因为邮箱为空而被挂起,且被记录到等待消息的任务列表中,直到该任务从邮箱中接收到消患。通常情况下,内核允许定义等待超时,如果等待消息的时间超过了,仍然没有接收到消息,该任务直接进入就绪态,并且返回出错信息,报告等待超时错误。C/OS-提供了7种对邮箱的操作:创建一个邮箱OSMboxCreate()、删除一个邮箱OSMboxDel()、等待邮

36、箱中的消息OSMboxPend()、向自器箱发送一则消息OSMboxPost()、向邮箱中发送一则消息OSMboxPostOpt()、无等待地从邮箱中得到一则消息OSMboxAccept()、查询邮箱的状态OSMboxQuery()。这些函数对于任务和中断服务程序的适用情况不同。程序清单:建立一个邮箱OS_EVENT *OSMboxCreate (void *msg) OS_EVENT *pevent; OS_ENTER_CRITICAL(); pevent = OSEventFreeList; if (OSEventFreeList != (OS_EVENT *)0) OSEventFree

37、List = (OS_EVENT *)OSEventFreeList-OSEventPtr; OS_EXIT_CRITICAL(); if (pevent != (OS_EVENT *)0) pevent-OSEventType = OS_EVENT_TYPE_MBOX; /*设置事件控制块的类型*/ pevent-OSEventPtr = msg; /*容纳消息指针*/ OSEventWaitListInit(pevent); return (pevent);2.2.8 消息队列消息队列实际为邮箱阵列,一个消息队列可以存放多则消息。通过内核提供的服务,任务或中断服务程序可以将一则消息(指向该

38、消息的指针)放入消息队列。同样,任务或中断服务程序可以通过内核服务从消息队列中得到一则消息。发送和接收消息的任务约定传递的实际是指向消息的指针。C/OS-提供了9个对消息队列操作的函数:创建一个消息队列OSQCreate()、删除一个消息队列OSQDel()、等待消息队列中昀消息OSQPend()、向消息队列发送一则消息(FIFO)OSQPost()、向消息队列中发送一则消息(LIFO)OSQPostFront()、向消息队列中发送一则消息(FIFO或LIFO)OSQPostOpt()、无等待地从消息队列中获取消患OSQAccept()、清空消息队列OSQFlush()和获取消息队列的状态OS

39、QQuery()。这些函数对于任务和中断服务程序的适用情况不同3。程序清单:清空消息队列INT8U OSQFlush (OS_EVENT *pevent) OS_Q *pq; OS_ENTER_CRITICAL(); if (pevent-OSEventType != OS_EVENT_TYPE_Q) /*检查pevent指针是否是执行一个消息队列*/ OS_EXIT_CRITICAL(); return (OS_ERR_EVENT_TYPE); pq = pevent-OSEventPtr; pq-OSQIn = pq-OSQStart;/*将队列的插入指针复位*/ pq-OSQOut =

40、pq-OSQStart; /*将队列的取出指针复位*/ pq-OSQEntries = 0;/*将队列中的消息数设为0*/ OS_EXIT_CRITICAL(); return (OS_NO_ERR);2.2.8 任务的建立任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建立。在开始多任务调度(即调用OSStart()前,用户必须建立至少一个任务。任务不能由中断服务程序(ISR)来建立。OST askCreate()或OSTaskCreateExt()负责建立任务,OSTaskCreateExt()是OSTaskCreate()的扩展,提供了一些附加功能。C/OS-可以管理多达6

41、4个任务,并从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有56个任务。任务的优先级越高,反映优先级的值则越低。在最新的C/OS-版本中,任务的优先级数也可作为任务的标识符使用。注意C/OS-系统不允许程序执行到大括号外,所以必须调用延时程序。3 ARM简介与C/OS-在ARM7上的移植3.1 ARM简介ARM 是Advanced RISC Machines的缩写,其主要优势在于简单的设计和高效的指令集。ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权。从90年代初,ARM率先推出32位RISC微处理器芯片系统(SOC)知识产权公开授权概念,从此改变了半

42、导体行业的经营理念。将技术授权给其他半导体厂商,比如INTEL ,LG,PHILIPS等,ARM架构是面向低端市场的第一款RISC处理器4。3.1.1 ARM7TDM I (-S)ARM7TDMI是低端ARM核,具有广泛应用。ARM7TDMI(-S)是ARM7TDMI的可综合(synthesiaahle)版本(软核)。对应用工程师来说,除非芯片厂商对ARM7TDMI(-S)进行裁减,否则与ARM7TDMI没有区别。ARM7TDM I(-S)处理器是ARM通用32位微处理器家族的成员之一。ARM具有优异的性能,功耗低,使用门的数量也很少。ARM结构是基于精简指令集计算机(RISC)原理设计的。指

43、令集和相关的译码机制比复杂指令集计算机要简单得多。这样的简化实现了:高的指令吞吐量;出色的实时中断响应;小的且高性价比的处理器宏单元。ARM7TDMI(-S)处理使用冯诺依曼结构,指令数据共用一条32位总线。只有加载,存储和交换指令可以对存储器中的数据进行访问。数据可以是8位字节,16位半字节或者32位字。字必须分配为占用4字节,而半字必须分配为占用2字节。3.1.2 ARM核芯片的指令集指令集是硬件和软件中间的重要环节,向上要有力的支持编译器,向下要方便硬件的设计实现。ARM是典型的RISC体系,它可以通过一系列简单的指令来实现复杂指令的功能。ARM指令集可以分6类,即跳转指令、数据处理指令

44、、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理器指令和异常中断产生指令。ARM 指令集有以下一些优点:(1)所有ARM指令都是32位定长,在地址中以4字长边界保存(地址最后两位为0),这样方便译码电路和流水线的实现(16位的指令集Thumb可以看作是ARM指令集的一种压缩形式,在ARM处理器中仍然要扩展为标准的32位ARM指令来运行)。(2)Load /Store架构。ARM指令集属于RISC体系,一般指令只能把内部寄存器和立即数作为操作数,只有Load/Store类型的数据移动指令才可以访问内存,在内存和寄存器之间转移数据。(3)由于硬件上有barerl(桶型)移位器,

45、所以ARM可以在一个指令中用一个指令周期完成一个移位操作和一个ALU(算术逻辑)操作。(4)所有指令都可以条件执行,这是由其指令格式决定的。任何指令的头4位都是条件指示位,根据CPSR(当前程序状态寄存器)中的N(负指示)、Z(零指示)、C(进位指示)、V(溢出指示)决定该指令是否执行,这样可以方便高级语言的编译器设计,很容易实现分支和循环。(5)有功能很强的一次加载和存储多个寄存器的指令:LDM和STM。当发生过程调用和中断处理时,可以只用一条指令就能把当前多个寄存器的内容保护到内存堆栈中。ARM7TDMI是目前广泛应用的适应于一般场合的32位处理器,它名字的含义为:T:表示Thumb,即A

46、RM的16位压缩指令集。D:表示Debug,指内核中增加了用于支持片上调试的结构,能使微处理器进入调试模式,从而可方便的进行断点设置,单步调试,通常可采用JTAG连接方式.M:表示Mulitpleir,增强型乘法器,可进行32位数相乘直接产生64位结果。I:表示嵌入式ICE硬件提供片上断点和调试点支持。3.1.3 ARM的寄存器ARM处理器共有37个寄存器,其中13个是通用寄存器,包括程序计数器PC,另外6个是程序状态寄存器。但是这些寄存器不能同时看见,处理器的状态和处理器的操作模式决定哪些寄存器可用。在ARM状态下执行字对准的ARM指令,在Thumb状态下执行半字对准的Thumb指令。在Thumb状态下,程序计数器PC使用位1:0选择另一个半字。ARM和Thumb之间状态的切换不影响处理器模式和寄存器的内容。两种状态下的寄存器组物理结构有重叠部分。3.2 C/OS-在ARM7上的移植所谓移植,就是使一个实时操作系统能够在某个微处理器平台上或微控制器上运行。在移植之前,首先要分析移植C/OS-的处理器是否满足移植条件:处理器的C编译器能产生可重入代码;用C语言可打开和关闭中断;处理器支

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号