arm嵌入式系统设计论文AbstractThe paper researches design of embedded system based on ARM mostly. Considering from the cost,performance and power consumption,ARM microprocessor is selected in the hardware platform.Considering the stability, reliability and effective management of resource,the real-time operating system is adopted in the software platform.Operating Systems can simplify the design by dividing the application into some tasks.We finish whole construction of platform system in the method of software and hardware co-design. About the software platform the anthor dissertated in general the feature of the RTOSμC/OS-II and analyze the requirement of porting it to a kind of hardware platform and what must be done with a specific processor.And then gave the detail process of porting to our hardware platform.Meanwhile,the thesis also dissertated the GUI software μC/GUI using on μC/OS-II,at last realized the GUI interface on μC/OS-II,that greatly improve the value of its application. In the porting of the operating system,the porting for ARM microprocessor has been realized.The article stated the file structure of μC/OS-II,register structure and operational mode of ARM7.We discuss the porting operatingsystem by analyzing the concrete source code.The purpose that the operate system is ported is to make the real-time operate system run on ARM processor platform.It is a foundation of structuring the systems software platform.The technological difficult point of the porting operating system lies in that the developer must understand the system structure of the processor and operating system in depth.lwfree.cn
Keyword:Embedded System;μC/OS-II;ARM;Porting论文摘 要本文主要研究基于ARM的嵌入式系统的设计从成本、性能和功耗三方面考虑,系统硬件平台采用ARM微处理器。从系统的稳定性、可靠性和资源有效管理的角度,软件平台采用实时操作系统,它可以将应用分解成多个任务,简化应用系统软件的设计。系统采取软硬件协同设计的方法完成整个平台的构建。本文简述了嵌入式实时操作系统μC/OS-II的优势及基本特点,并分析了其移植到一个硬件平台上所需的条件与结合本文选用的CPU需要作出的工作,进而给出了移植代码,同时也论述了图形用户界面μC/GUI及其在μC/OS-II平台上的应用,实现了在μC/OS-II上的图形化人机接口,大大提升了系统的应用价值。操作系统的移植过程中,实现了嵌入式系统对ARM微处理器的移植。在文中说明了μC/OS-II的文件结构和ARM7的寄存器结构及运行模式,结合具体源代码讨论了操作系统移植的实现流程。操作系统移植的目的是使实时内核能在ARM处理器平台上运行,是构建系统软件平台的基础。操作系统移植的技术难点在于开发者必须深入了解处理器和操作系统的体系结构。
关键词:嵌入式系统;μC/OS-II;ARM;移植331
arm嵌入式系统设计论文目 录
摘 要 1Abstract 21 绪论 11.1 嵌入式系统的概念和特点 11.1.1 嵌入式系统的概念 11.1.2 嵌入式系统的特点 21.2 嵌入式系统的应用领域 31.3 嵌入式系统的组成 31.3.1嵌入式系统的硬件核心 31.3.2嵌入式系统的软件核心 41.4嵌入式系统的发展现状与展望 41.5课题研究的意义与完成的工作 51.5.1课题研究的意义 51.5.2.课题所完成的工作 62.嵌入式系统的开发过程 72.1 嵌入式开发考虑的几个要素 72.2嵌入式系统的总体结构 72.3嵌入式系统开发的基本流程 82.4 嵌入式系统的一般设计方法 102.5 软硬件协同设计 103嵌入式系统开发平台设计 133.1 ARM微处理器概述 133.1.1 ARM微处理器的应用领域、分类及特点 133.1.2 ARM7微处理器的RISC结构 153.1.3 ARM7微处理器的寄存器结构 163.1.4 ARM微处理器的指令结构 173.1.5 ARM内核的中断技术 174 嵌入式实时操作系统 μC/OS-Ⅱ 214.1 概述 214.2μC/OS-Ⅱ的任务管理 224.2.1μC/OS-Ⅱ的任务管理 224.2.2 μC/OS-II中的任务调度 244.3 中断时钟与节拍 295 μC/OS-II在S3C44BOX上的移植 325.1μC/OS-II系统移植概述 325.2 移植方法 335.2.1 编制OS_CPU.H文件 335.2.2 编制 OS_CPU_A.S 文件 345.2.3 编制OS_CPU_C.C文件 366 用户界面 μC/GUI的实现 386.1 μC/GUI简介 386.2 用μC/GUI开发GUI的方法 396.3 μC/GUI在系统中的应用 39结 束 语 43参考文献 44致 谢 45
arm嵌入式系统设计论文绪论随着信息技术和网络技术的高速发展和后PC(Post-PC)时代的到来,嵌入式系统已经广泛地渗透到科学研究、军事技术、各类产业和商业文化艺术以及人们的日常生活等领域。有关嵌入式的产品越来越占有巨大的市场,对嵌入式系统的研究和开发就越来越具有重要的实际意义。本课题基于ARM与μC/OS-II的嵌入式系统的研究与应用,首先是嵌入式系统的开发过程,对传统方法与软硬件相结合的方法进行了对比,总结了软硬件协同的设计方法的优点。其次介绍ARM微处理器的应用与S3C44B0X开发板。从成本、性能和功耗三方面对ARM 7TDMI及S3C44B0X开发板进行了分析。再次对嵌入式实时操作系统μC/OS-II进行了深入的剖析,着重分析了任务调度,优先级算法与中断的具体实现。实现了嵌入式实时操作系统μC/OS-II在S3C44B0X开发板上的移植,着重对下面的OS_CPU.H,OS_CPU_A.S,OS_CPU_C.C三个移植文件进行了分析与实现。最后在嵌入式实时操作系统μC/OS-II上实现用户界面μG/GUI的应用,同时对μG/GUI进行了对比和分析。1.1 嵌入式系统的概念和特点1.1.1 嵌入式系统的概念嵌入式系统是嵌入到对象体系中的专用计算机系统。根据IEEE(国际电气和电子工程师协会)的定义,“嵌入式系统是控制、监视或者辅助设备,机械和车间运行的装置。”(原文devices used to control,monitor,or assist the operationof equipment,machinery or plants)在国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软件硬件可裁剪,适应应用系统,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式系统的最大特点是其所具有的目的性或针对性,即每一套嵌入式系统的开发设计都有其特殊的应用场合与特定功能,这也是嵌入式系统与通用的计算机系统最主要的区别。另外,嵌入式技术与实时性有着天然的联系,由于嵌入式系统是为特定的目的而设计的,且常常受到空间、成本、存储、带宽等条件的限制,因此它必须最大限度地在硬件上和软件上“量身定做”以提高效率,这样的结果最终导致了实时性的增强。1.1.2 嵌入式系统的特点从某种意义上来说,通用计算机行业的技术是垄断的。嵌入式系统则不同,它是一个分散的工业,充满了竞争、机遇与创新,没有哪一个系列的处理器和操作系统能够垄断全部市场。即便在体系结构上存在着主流,但各不相同的应用领域决定了不可能有少数公司、少数产品垄断全部市场。因此嵌入式系统领域的产品和技术,必然是高度分散的,留给各个行业的中小规模高技术公司的创新余地很大。另外,社会上的各个应用领域是在不断向前发展的,要求其中的嵌入式处理器核心也同步发展,这也构成推动嵌入式工业发展的强大动力。嵌入式系统是将先进的计算机技术、半导体技术、电子技术和各个行业的吉林大学硕士学位研究生论文具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。概括起来,嵌入式系统有以下几个特点:(1)嵌入式系统无所不在嵌入式技术广泛应用于自动控制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事、消费等各个领域,嵌入式系统几乎存在于我们周围各种电器设备中,在数量上远远超过了各种通用计算机。(2)嵌入式系统是完成专用功能的最小系统,嵌入式系统不仅和通常PC机上的应用系统不同,就是针对不同的具体应用而设计的嵌入式系统之间差别也很大。嵌入式系统一般功能单一,用来完成某种具体应用,在兼容性方面而要求不高,但是在大小、成本方面限制较多,要求硬件、软件都要发挥最高效率,可靠性高,力争以最小系统达到最高性能。(3)嵌入式系统对软件的要求,由于嵌入式产品要求体积小,可靠性高,一般不具有硬盘等大容量存储设备。而且由于成本的限制,嵌入式系统软件一般固化在容量较小的Flash存储器中。这就要求软件代码具有较高的质量和可靠性,有的系统还要求软件具有实时处理能力。(4)嵌入式系统的开发环境和开发工具,由于嵌入式系统自身没有足够的资源,不具备自主开发能力,所以一般嵌入式系统的开发模式是作为目标机的嵌入式系统与作为宿主的主机相连接,构成交叉开发环境。另外,还需要编译器、链接器等作为开发工具。(5)系统测试和可靠性评估体系,建立完整的嵌入式系统工程的系统测试和可靠性评估体系,能够保证嵌入式系统进行高效、可靠、稳定地工作。首先,如果有了科学的测试仪方法,建立科学的系统测试和可靠性评估体系,就能够避免因为系统的不可靠而造成巨大损失。其次,引入多种嵌入式系统的测试方法和可靠性评估体系,才能科学、完整地测试全天候运行的嵌入式复杂软件。在大多数嵌入式系统中一般都包括一些机制,比如看门狗定时器,它在软件失去控制后能使之重新开始正常运行。1.2 嵌入式系统的应用领域进入21世纪后,嵌入式系统迅猛发展。有资料显示,嵌入式系统带来的工业年产值已超过了10000亿美元,1997年美国嵌入式系统大会的报告预测:未来5年仅仅基于嵌入式系统的全数字电视产品就将在美国产生一个每年1500亿美元的新市场。美国著名未来学家尼葛洛庞帝于1999年1月访问中国时预言“4-5年后,嵌入式智能产品将是继PC和Internet之后最伟大的发明”,嵌入式产品按用途大致分为4类:(1)信息家电:现在已是后PC时代,家用电器的发展方向是数字化和网络化。电视机、电冰箱、微波炉等都将使用嵌入式计算机并通过家庭控制中心与Intenet连接,转变为智能网络家电。(2)移动计算设备:手机、PDA和手提电脑等多种移动设备在未来几年将在我国得到快速发展。(3)网络设备:网络设备是嵌入式系统应用最早的领域之一,由全球网络化的发展趋势可知,嵌入式系统应用在这方面的市场前景将会很广阔。网络设备主要包括路由器、交换机、网络接入设备等。(4)工控及仿真设备:在工控领域,嵌入式设备早已得到了广泛的应用。智能控制设备、智能仪表等都是嵌入式系统应用的广大领域。1.3 嵌入式系统的组成1.3.1嵌入式系统的硬件核心嵌入式硬件包括处理器、存储器、外设和I/O端口等。其中嵌入式处理器是核心,目前使用较多的有嵌入式微控制器(EMCU)、嵌入式微处理器(EMPU)、嵌入式数字信号处理器(EDSP)、片上系统(SOC)等。其中嵌入式微处理器由于性价比较高,在嵌入式系统中越来越受到青睐。嵌入式微处理器在目前的嵌入式系统硬件设计上处于核心地位。从嵌入式微处理器的市场占有率来看,8位产品占了一半左右的市场,其次是16位及32位的产品,4位和64位的产品市场占有率最低。随着电子技术的迅速发展, 32位处理器的性价比越来越高,很多场合使用32位处理器的系统成本比采用8/16位的系统成本更低。而ARM框架是目前嵌入式应用中占主导地位的32位微控制器/微处理器框架ARM(Advanced RISC Machines)公司是全球领先的16/32位RISC微处理器知识产权设计供应商。ARM公司通过转让高性能、低成本、低功耗的RISC微处理器、外围和系统芯片设计技术给合作伙伴,使他们能用这些技术来生产各具特色的芯片。ARM已成为移动通信、手持设备、多媒体数字消费嵌入式技术解决方案的RISC标准。ARM提供一系列内核、体系扩展、微处理器和系统芯片方案。由于所有产品均采用一个通用的体系,所以相同的软件可以直接或稍加修改可在所有产品中运行。目前,ARM处理器主要分以下几个系列:ARM7系列,ARM9系列,ARM9E系列,SecurCore系列及最新的ARMll系列,它们都是为特定目的的应用而设计,实际应用可根据具体性能要求选择相应的系列。1.3.2嵌入式系统的软件核心嵌入式软件部分主要包括嵌入式操作系统和应用软件,是整个嵌入式系统的应用核心。嵌入式操作系统是嵌入式应用的基础平台。早期的嵌入式实时应用软件直接在处理器上运行,没有RTOS支持,现在的大多嵌入式应用开发都需要嵌入式操作系统的支持。实际上,此时的嵌入式操作系统相当于一个通用而复杂的主控程序,为嵌入式应用软件提供更强大的开发平台和运行环境。因为嵌入式系统己经将处理器、中断、定时器、I/O等资源包装起来,用一系列的API提供给用户,应用程序可以不关注底层硬件,直接借用操作系统提供的功能进行开发,此时的嵌入式操作系统可以视为一个虚拟机。嵌入式操作系统的种类繁多,大体上可分为两种:商用型和免费型。商用操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵。免费的操作系统在价格方面具有优势,但也存在着开发困难,技术支持少的不足。目前市场上流行的,使用最多的EOS产品包括有:Windows CE、LYNX、vxwork、Nucleus、PalmOS、pSOS、QNX、各种嵌入式的Linux、μC/OS-II等。嵌入式实时操作系统μC/OS-II是一个可移植、源码公开、可抢占的RTOS,其性能完全可以与商业产品竞争。μC/OS-II基于抢占式的实时多任务内核,可固化、可剪裁、具有高稳定性和可靠性,此外μC/OS-II的鲜明特点就是源码公开,便于移植和维护。自1992年以来,全世界成千上万的开发者已经成功地将μC/OS-II应用于各种系统。在μC/OS-II上还提供了嵌入式图形支持的μC/GUI模块和嵌入式文件系统UC/FS,它支持多种小型化的设备,如CF卡、SMC卡等。嵌入式操作系统的选择主要考虑以下几个方面:操作系统的硬件支持程度,是否支持目标硬件平台;源码是否开放、可移植性如何;开发工具的支持程度,是否有利于项目的加快开发;能否满足应用需求,如对操作系统实时性能的要求,网络性能,对中文的支持等;是否收取费用,是否对产品的成本产生严重影响。
嵌入式系统的发展现状与展望国内的32位嵌入式开发近两年来异常火爆,基于32位SOC芯片的应用系统能够大大提高产品的性能和附加值,增强产品的市场力,因此越来越多的工程师开始将目光从8位/16位转移到32位微处理器上。1.嵌入式系统的应用开发需要强大的开发工具和操作系统的支持随着因特网技术的成熟、带宽的提高,ICP和ASP在网上提供的信息内容日趋丰富、应用项目多种多样。像电话手机、电话座机及电冰箱、微波炉等嵌入式电子设备的功能不再单一,电气结构也更为复杂。为了满足应用功能的升级,设计师们一方面采用更强大的嵌入式处理器如32位、64位RISC芯片或信号处理器DSP增强处理能力;同时还采用实时多任务编程技术和交叉开发工具技术来控制功能复杂性,简化应用程序设计,保障软件质量和缩短开发周期。由于μC/OS-II与嵌入式Linux的源代码开放,嵌入式实时操作系统被广为采用,并由于其开放性,在众多的院校与科研机构得到研究与应用。2.具备网络能力成为必然趋势为适应嵌入式分布处理结构和应用上网需求,面向21世纪的嵌入式系统要求配备标准的一种或多种网络通信接口。针对外部联网要求,嵌入设备必需配有通信接口,相应需要TCP/IP协议簇软件支持。由于家用电器相互关联(如防盗报警,灯光能源控制,影视设备和信息终端交换信息)及实验现场仪器的协调工作等要求,新一代嵌入式设备还需具备IEEE 1394、USB、CAN、Bluetooth或IrDA通信接口,同时也需要提供相应的通信组网协议软件和物理层驱动软件。为了支持应用软件的特定编程模式,如Web或无线Web编程模式,还需要相应的浏览器,如支持HTML、WML等。3.支持小型电子设备实现小尺寸、微功耗和低成本为满足这种特性,要求嵌入式产品设计者相应降低处理器的性能,限制内存容量和复用接口芯片。这就相应提高了对嵌入式软件设计技术要求。如选用最佳的编程模型和不断改进算法,采用Java编程模式,优化编译器性能。因此既要软件人员有丰富经验,更需要发展先进嵌入式软件技术,如Java、Web和WAP等。4.提供精巧的多媒体人机界面带图形界面的嵌入式设备之所以为用者乐于接受,重要因素之一是它们与使用者之间的亲和力,自然的人机交互界面。人们与信息终端交互要求以GUI屏幕为中心的多媒体界面。应用于嵌入式系统的儿个著名的GUI有:Microwin、QT/E及国内开发的MiniGUI等。1.5课题研究的意义与完成的工作1.5.1课题研究的意义嵌入式系统技术是目前电子产品设计领域最为热门的技术之一。目前已经广泛地应用于军事国防、消费电子、网络通信、工业控制等各个领域。小到智能卡、手机、水表,大到信息家电、汽车、飞机、宇宙飞船,我们的生活已经被嵌入式软件包围。近年来,嵌入式系统开发和生产应用获得了巨大的发展。2004年我国的软件产值中的40%来自嵌入式软件。嵌入式系统己经深入到社会及生活的每一个角落,在各行各业都能发挥其独特的作用,在监视与控制场合嵌入式系统更具有其性能与成本等综合优势,特别是我国工业控制领域具有大量的传统设备在辅助功能的添加、信息化、技术改造等方面有巨大的需求。对先进的嵌入式系统技术进行研究,充分掌握其硬件系统与软件系统的开发流程,对于学习研究与科研实践都有明显的现实意义。但是,我国的高端32位嵌入式系统开发技术从上个世纪90年代才开始,现在仍处于起步阶段,因此对于嵌入式系统的开发与研究十分有价值。1.5.2.课题所完成的工作本课题基于ARM与μC/OS-II的嵌入式系统的研究与应用,主要完成了以下的任务: (1)嵌入式系统的开发过程,着重对传统方法与软硬件相结合的方法进行了对比,总结了软硬件协同的设计方法的优点。在协同设计(Co-design)、协同测试(Co-test)和协同验证(Co-verification)上,充分考虑了软硬件的关系,并在设计的每个层次上给以测试验证,使得尽早发现和解决问题,避免灾难性的错误出现。(2)ARM微处理器的应用与S3C44B0X开发板的介绍。从成本、性能和功耗三方面对ARM 7TDMI及S3C44B0X开发板进行了分析。(3)对嵌入式实时操作系统μC/OS-II进行了深入的剖析,着重分析了任务调度,优先级算法与中断的具体实现。(4)实现了嵌入式实时操作系统μC/OS-II在S3C44B0X开发板上的移植,着重对OS_CPU.H,OS_CPU_A.S,OS_CPU_C.C三个移植文件进行了分析与实现。(5)在嵌入式实时操作系统μC/OS-II上实现用户界面μG/GUI的应用,同时对μG/GUI进行了对比和分析。
2.嵌入式系统的开发过程2.1 嵌入式开发考虑的几个要素嵌入式系统是以实际应用为主要考虑对象的专用计算机系统,嵌入式的特点就是软硬件可配置,功能可靠成本低,体积小,功耗低,实时性强。因此,嵌入式系统受功能和具体应用环境的约束,其开发流程就不同于一般的通用计算机系统。在嵌入式系统设计开发时必须考虑以下因素:1.所开发的嵌入式系统的功能是否可靠、实用,便于以后的升级和维护。2.系统的实时并发处理,能否及时响应。3.产品的体积是否符合要求,结构是否紧凑。4.系统的接口是否符合规范,易于操作和掌握。5.配置要精简稳定,以便于维护。6.功耗管理严格,成本低廉。2.2嵌入式系统的总体结构由于嵌入式系统运行于特定的目标环境,该目标环境又面向特定的应用领域,功能比较专一,需要实现预期要实现的功能,并且还需要软硬件协同设计,因此在不同的场合,嵌入式系统呈现出的外观和形式都不尽相同。但通过对其嵌入式系统的内部结构进行分析与研究之后,就可以发现,一个嵌入式系统一般都由嵌入式计算机系统和执行装置组成(如图2-1所示),其中嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、软件层和功能层组成。执行装置也称为被控对象,它可以接受嵌入式计算机系统发出的控制命令,执行规定的操作或任务。目前所提及的嵌入式系统一般指嵌入式计算机系统,下面对嵌入式计算机系统的组成进行简要描述。lwfree.cn1.硬件层硬件层由嵌入式微处理器、存储器、通用设备接口和I/O接口(A/D、D/A等)组成。它是以嵌入式处理器为核心,最初的嵌入式处理器都是为通用目的而设计的,后来随着嵌入式系统应用的不断普及,出现了专用集成芯片 (Application specific integrated circuit,ASIC)。近年来,各种可编程芯片的出现,改变了嵌入式硬件模块的设计方法,出现了“可重构计算”的概念,它结合了通用微处理器和ASIC的特点,是通过现场编程门阵列(Field-programmable gatearray,FPGA)实现的,FPGA是20世纪80年代中期以后发展起来的一种可编程的大规模集成器件,属于一种新型的ASIC产品。FPGA的出现,是电子系统设计领域内的一次重大变革。
图2.1嵌入式系统的典型组成
2.中间层硬件层与软件层之间为中间层,也称为硬件抽象层(HardwareAbstractLayer,HAL)或板级支持包(Board Support Package,BSP),它把系统软件与底层硬件部分隔离,使得系统的底层设备驱动程序与硬件无关,一般应具有相关硬件的初始化、数据的输入/输出操作和硬件设备的配置等功能。3.软件层软件层是由实时多任务操作系统(RTOS)、文件系统、图形用户接口(GUI)、网络系统及通用组件模块组成。RTOS是嵌入式应用软件的基础和开发平台,它实际上是一段嵌入式目标代码中的程序,系统复位后首先执行,相当于用户的主程序,用户的其他应用程序都建立在RTOS之上。4.功能层功能层由基于RTOS开发的应用程序组成,用来完成对被控对象的控制功能。功能层是面向被控对象和用户的,为方便用户操作,往往需要提供一个友好的人机界面。2.3嵌入式系统开发的基本流程嵌入式系统开发必须将硬件、软件、人力资源等元素结合起来。任何一个嵌入式产品都是软硬件的结合体,是软硬件综合开发,这是嵌入式系统开发的最大特点。这也就是说在开发系统的过程中,我们必须要始终的综合考虑各个方面的因素。面向具体应用的嵌入式系统的开发方法和流程各有不同,但通过对嵌入式系统具体的分析,嵌入式系统设计一般都是由5个阶段构成的:系统需求分析、体系结构设计、硬件/软件设计、系统集成和系统测试,如图2-2。
arm嵌入式系统设计论文嵌入式系统的设计阶段1.系统需求分析确定系统开发最终需要达到的总目标、系统实现的可行性、系统开发所采取策略,估计系统完成所需的资源和成本,制定工程进度安排计划,并提炼出设计规格说明书,作为正式设计指导和验收的标准。系统的需求一般分为功能性需求和非功能性需求两方面。功能性需求是系统的基本功能,如输入输出信号、操作方式等;非功能需求包括系统性能、成本、功耗等因素。2.体系结构设计描述系统如何实现所述的功能和非功能需求,包括对硬件、软件和执行装置的功能划分以及系统的软件、硬件选型等。一个好的体系结构是设计成功与否的关键。3.硬件/软件设计基于体系结构,对系统的软件、硬件进行详细设计。为了缩短产品开发周期,设计往往是并行的。4.系统集成把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进单元设计过程中的错误。5.系统测试将测试完成的软件系统装入制作好的硬件系统中,进行系统的综合测试,验证功能是否能被正确无误地实现。测试最终完成的系统性能是否满足设计任务书的各项性能指标和要求。若满足,则可将正确无误的软件固化在目标硬件中;若需要回到设计的初始阶段,则重新进行系统设计方案的制定。2.4 嵌入式系统的一般设计方法在嵌入式系统的应用开发中,整个系统的开发过程如图2-3所示。
图2.3嵌入式系统的开发过程可见,在应用嵌入式系统开发的过程中,因为对应于每一个处理器的硬件平台都是通用的、固定的、成熟的。所以,在开发过程中减少了硬件系统错误的引入机会。同时,因为嵌入式操作系统屏蔽掉了底层硬件的很多复杂信息,使得开发者通过操作系统提供的API函数就可以完成大部分工作,大大地简化了开发过程,提高了系统的稳定性。嵌入式系统的开发通常采用“宿主机/目标机”方式,首先利用宿主机上丰富的资源及良好的开发环境开发和仿真调试目标机上的软件;然后,通过串行口或网络将交叉编译生成的目标代码传输并装载到目标机上,并用交叉调试器在监控程序或实时内核操作系统的支持下进行实时分析和调度;最后,目标机在特定的环境下运行。2.5 软硬件协同设计1.传统的嵌入式系统设计方法如图2-5所示,传统的嵌入式系统开发,采用的是软件开发与硬件开发分离的方式,其过程可描述如下:(1)需求分析,总体设计;(2)软硬件分别设计、开发、调试、测试;(3)系统集成:软硬件集成;(4)集成、测试、验证;(5)若系统正确,则结束,否则进行(6);(6)若出现错误,需要对软、硬件分别验证和修改;返回(3),继续进行集成测试。这种传统的开发方式,虽然在设计的最初的阶段考虑了软硬件之间的接口问题,但是由于软硬件分别开发,各自部分的修改和缺陷很容易导致系统集成出现错误。因为这种开发方式的局限性,这些错误不但难于定位,而且更重要的是,对它们修改往往会涉及整个软件结构或硬件配置的改动,这对于整个的系统开发是灾难性的。2.软硬件协同设计如图2-6所示,与传统的设计方法相比,软硬件协同的设计方法有两个显著的特点:(1)描述硬件和软件使用统一的表示形式。(2)硬件/软件划分可选择多种方案,知道满足要求。
图2.5传统的嵌入式系统的设计方法图2.6软硬件协同设计方法
软硬件协同设计过程可归纳为:(1)需求分析。(2)软硬件协同设计。(3)软硬件实现。(4)软硬件协同测试和验证。这种方法的特点是协同设计(Co-design)、协同测试(Co-test)和协同验证(Co-verification)上,充分考虑了软硬件的关系,并在设计的每个层次上给以测试验证,使得尽早发现和解决问题,避免灾难性的错误出现。3嵌入式系统开发平台设计3.1 ARM微处理器概述ARM是英国一家电子公司的名字,全名的意思是Advanced RISC Machine。ARM敢为天下先,12年前首创了chipless的生产模式,即该公司既不生产芯片,也不设计芯片,而是设计出高效的IP内核,授权给半导体公司使用,半导体公司在ARM技术的基础上添加自己的设计并推出芯片产品,最后由OEM客户采用这些芯片来构建基于ARM技术的系统产品。ARM的产品是IP Core,没有任何物理意义上的硬件或者软件实体。目前全球有103家巨型IT公司在采用ARM技术,20家最大的半导体厂商中有19家是ARM的用户,包括德州仪器,Philips,Intel等 。20大巨头中唯一没有购买ARM授权的是AMD,而AMD则收购了Alchemy公司与之抗衡,采用的是MIPS结构(有少数宽带路由器使用MIPS处理器,思科路由器也有使用这个牌子的)。目前面向市场的有ARM7,ARM9,ARM9E-S,StrongARM和ARM10系列。ARM(Advance RISC Machines)既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。目前,采用ARM技术知识产权(IP)的微处理器(即通常所说的ARM微处理器),己遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,约占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到日常生活的各个方面。3.1.1 ARM微处理器的应用领域、分类及特点1.ARM微处理器的应用领域较广,到目前为止,ARM微处理器及技术的应用几乎己经深入到各个领域。(1)工业控制领域。作为32位的RISC架构,基于ARM核的微控制器芯片不但占据了高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩展,ARM微控制器的低功耗、高性价比,向传统的8位/16位微控制器提出了挑战。(2)无线通讯领域。目前己有超过85%的无线通讯设备采用了ARM技术, ARM以其高性能和低成本在该领域的地位日益巩固。(3)网络应用。随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。此外,ARM在语音及视频处理上行了优化,并获得广泛支持,也对DSP的应用领域提出了挑战。(4)消费类电子产品。ARM技术在目前流行的数字音频播放器、数字机顶盒和游戏机中得到广泛应用。
arm嵌入式系统设计论文成像和安全产品。现在流行的数码相机和打印机中绝大部分采用ARM技术,手机中的32位SIM智能卡也采用了ARM技术。2.ARM微处理器具有一定的独到之处,采用RISC架构的ARM微处理器一般具有如下特点:(1)体积小、低功耗、低成本、高性能。(2)支持Thumb(16位)/ARM(32位)双指令集。(3)大量使用寄存器,指令执行速度更快。3.ARM微处理器分类。ARM微处理器目前包括:ARM7系列、ARM9系列、ARM9E系列、ARM10E系列、SecurCore系列、Intel的Xscale和Intel的StrongARM等几个系列的处理器产品以及其它厂商基于ARM体系结构的处理器。这些处理器最高主频达到了800MIPS,功耗数量级为MW/MHZ。对于支持同样ARM系列的处理器,其软件是兼容的。ARM7微处理器系列ARM7系列微处理器为低功耗的32位RISC处理器,它主要用于对价位和功耗要求比较苛刻的消费类产品,其最高主频可以达到130MIPS。ARM7系列处理器支持16位的Thumb指令集,使用Thumb指令集可以以16位的系统开销得到32位系统的性能。 图3.1 ARM7TDMI 3级流水线处理方式ARM7TDMI微处理器系列具有如下特点:1.三级流水线:ARM7TDMI使用3级流水线处理指令,需要三个阶段处理一条指令,即取指令、译指令、执行指令,图3-1显示了这个过程。由图3-1可见,采用3级流水线的处理方式可以大大提高指令执行效率。通常,在执行一条指令时,同时解译下一条指令,而第三条指令也正在从存储器中读出。因此,程序计数器一直指向下一条要执行的指令的地址,而不是当前正在执行的指令的地址。2.高级微控制器总线结构(AMBA),32位数据总线。3.支持32位ARM指令集,代码密度高并兼容16位的Thumb指令集,使用Thumb指令集可以以16位系统开销得到32位的系统性能。4.存储采用冯.诺伊曼结构的32位线性地址空间,寻址空间为4G字节。5.支持嵌入式片内仿真器调试。6.最大时钟频率可达到110MHz(TSMC 0.18m生产工艺)。7.支持低电压工作方式,平均功耗约0.25m W/MHz。8.具有嵌入式ICE-RT逻辑,调试开发方便。9.极低的功耗,适合对功耗要求较高的应用,如便携式产品。10.对操作系统的支持广泛,包括Windows CE、Linux、PalmOS等。11.指令系统与ARM9、ARM9E和ARM10E系列兼容,便于用户的产品升级换代。ARM7系列微处理器的主要应用领域包括工业控制、Internet设备、网络和调制解调器设备、移动电话等多种多媒体和嵌入式应用。ARM7系列微处理器包括如下几种类型的核:ARM7TDMI、ARM7TDMI-S、ARM720T、ARM7EJ-S。其中,ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器。TDMI的基本含义为:T表示支持16位压缩指令集,D表示支持片上Debug,M表示内嵌硬件乘法器(MultiPlier),I表示嵌入式ICE支持片上断点和调试点。3.1.2 ARM7微处理器的RISC结构 RISC结构优先选取使用频率最高的简单指令,避免复杂指令;将指令长度固定,指令格式和寻地方式种类减少;以控制逻辑为主,不用或少用微码控制等措施来达到上述目的。RISC体系结构应具有如下特点:1.采用固定长度的指令格式,指令归整、简单、基本寻址方式有2-3种。2.使用单周期指令,便于流水线操作执行。3.大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/存储指令可以访问存储器,以提高指令的执行效率。除此以外,ARM体系结构还采用了一些特别的技术,在保证高性能的前提下尽量缩小芯片的面积,并降低功耗,具体如下:(1)所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。(2)可用加载/存储指令批量传输数据,以提高数据的传输效率。(3)可在一条数据处理指令中同时完成逻辑处理和移位处理。(4)在循环处理中使用地址的自动增减来提高运行效率。当然,和CISC架构相比较,尽管RISC架构有上述的优点,但决不能认为RISC架构就可以取代CISC架构,事实上RISC和CISC各有优势,而且界限并不那么明显。现代的CPU往往采用CISC的外围,内部加入了RISC的特性,如超长指令集CPU就是融合了RISC和CISC的优势,成为未来的CPU发展方向之一。3.1.3 ARM7微处理器的寄存器结构 ARM处理器共有37个寄存器(如图3-2),被分为若干个组(BANK),这些寄存器包括:31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器;6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。同时,ARM处理器又有7种不同的处理器模式,在每一种处理器模式下均有一组相应的寄存器与之对应。即在任意一种处理器模式下,可访问的寄存器包括15个通用寄存器(R0-R14)、1-2个状态寄存器和程序计数器。在所有的寄存器中,有些是在7种处理器模式下共用的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理寄存器,ARM7TDMI支持表3-1中给出的操作模式。除User模式以外的其它模式都叫做特权模式,除User和System外的其它5种模式叫做异常模式。大部分应用程序都在User模式下运行,当处理器处于User模式下时,执行的程序无法访问一些被保护的系统资源,以利于操作系统控制系统资源的使用,也不能改变模式,否则就会导致一次异常。对于System模式,任何异常都不会导致进入这一模式,而且它使用的寄存器和User模式下基本相同,主要是用于有访问系统资源请求而又需要避免使用额外的寄存器的操作系统任务。在特权模式下,它们可以完全访问系统资源,可以自由地改变模式。在处理特定的异常时,系统进入信号输入电路主要是把压力变送器、电压互感器、电流互感器的输出信号,经过放大滤波转换成模数转换芯片可以识别的模拟信号,通过模数转换,最终把采集到的多路模拟量信号转换成数字量信号。对应的异常模式下,5种异常模式都有各自额外的寄存器,用于避免在发生异常的时候与用户模式下的程序发生冲突。
图3.2ARM状态下的寄存器组织图表3.1操作模式 3.1.4 ARM微处理器的指令结构ARM微处理器的在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。其中,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%-40%以上的存储空间,同时具备32位代码的所有优点。3.1.5 ARM内核的中断技术(1)中断分类ARM7TDMI具有常规中断(IRQ)、快中断(FIQ)和软件中断(SoftWareInterrupt)三种中方式,见表3-2所示,常规中断和快中断都是硬件中断
arm嵌入式系统设计论文|免费论文中断类型 软件中断是一种由用户设置的同步中断,由程序指令产生,不像硬件中断那样由外部事件触发。软件中断允许运行在用户模式的程序进入监督模式,并运行监督态下的函数。在ARM7TDMI的硬件调试系统中,应用程序可利用软件中断来申请半自主(semihosting)式操作,例如,打开主机中的一个文件、向调试通道发送一个字符等等(这些操作必须依赖主机中C程序库才能运行,因此被称为半自主式的)。利用软件中断机制,可以直观和高效地仿真调试应用程序。另外,软件中断也可用于一般性的程序控制。当中断是为支持数据传输或快速数据通道而设计的,为快速处理快中断。快中断被设为最高中断优先级;在快中断模式增设了7个私有工作寄存器,从而避免了由于主工作寄存器数据的保存和恢复而带来了额外开销;快中断处理程序处于异常向量表的最后位置,因此可紧接异常向量表书写快中断处理程序,而不必进行程序跳转操作,避免了刷新指令流水线和高速缓存。(2)响应中断和中断返回 当中断产生时,ARM7TDMI将执行如下操作:①把当前程序状态寄存器(CPSR)的内容拷贝到相应的备份程序状态寄存器(SPSR),当前工作模式、中断屏蔽位和状态标志被保存下来。②转入相应的模式,并关闭常规中断。如响应快中断,则同时关闭快中断。③把程序计数器(pc)的值减4后,存入相应的连接寄存器(lr)。④将程序计数器指向相应的中断向量。 由中断返回时,ARM7TDMI将完成如下操作:①将备份程序状态寄存器的内容拷贝到当前程序状态寄存器,恢复中断前的状态。②清除相应禁止中断位(如果已设置的话)。③把连接寄存器的值拷贝到程序计数器,继续运行原程序。 返回地址的计算:ARM7TDMI采用流水线结构,当一条指令被执行时,下一条指令正被译码,而第三条指令被从内存中取出。当程序计数器未更新的,pc指向从内存中取出的指令,(pc-4)指向当前指令的一条指令。处理器响应软件中断时,由于软件中断由指令自身产生,程序计数器还没有更新,(pc-4)正好指向当前指令的下一条指令。因此,只要在中断处理程序最后加入MOVS pc,lr把连接寄存器的值赋给程序计数器即可。ARM7TDMI总是在一条指令执行完毕后,才去检查是否有硬件中断信号和中断屏蔽状态。此时,程序计数器已经更新,(pc-4)指向当前指令的下两条指令。因此要先把连接寄存器的内容减去4(指向pc-8)后,再赋给程序计数器。(3)中断处理程序的编写 软件中断处理程序的编写软件中断指令的格式如图3-3所示。低24位立即数为软件中断号。在中断处理程序中,必须首先得到软件中断号,然后根据中断号执行不同代码。以下的中断处理程序,在软件中断号为1时,将端口A的0号引脚置“1”。 图3.3软件中断指令结构STMFD sp!,{r0-r12,lr}//保存各工作寄存器LDR r0,{lr,#-4}//得到该软件中断指令BIC r0,r0,#0xff000000//从中取出中断号ADR r2,SWIJumpTable//r2指向代码入口表LDR pc,[r2,r0,LSL#2]//把r0中的值乘4后加到r2。将程序计数器指向中断号对应的代码入口地址SWIJumpTable//代码入口表DCD SWInum0DCD SWInum1……SWInum0//中断号为0时的处理代码SWInum1//中断号为1时的处理代码MOV r0,#0x80000000//r0指向端口ASTRB r0,#0x01//A口0脚置“1”B EndofSWI//跳转EndofSWILDMFD sp!{r0-r12,pc}//恢复各寄存器,返回原程序 常规中断处理程序的编写为快速执行常规中断处理程序,一般用汇编指令编写。在编写可重入常规中断处理程序(运行时仍可响应常规中断)时,必须先把链接寄存器和程序用到的工作寄存器入栈,然后才能开放中断。各寄存器出栈前,必须先关闭中断。这样可防止因寄存器崩溃而无法返回的情况发生。下文介绍了一个与中控制器相配置的可重入的常规中断处理程序。当若干中断源同时有效时,中断控制器(基址为IntBase)把16个中断源中优先级最高的一个存入中断寄存器(偏移地址为IntLevel)中,并发出硬件中断信号。SUB lr,lr,#4//得至并保存返回地址STMFD sp!,{lr}MRS r14,SPSR//把SPSR和sl2入栈STMFD sp!,{r12,r14}MOV r12,#IntBaseLDR r12,[r12,#IntLevel]//将最高优先级号存入r12MRS r14,CPSR.//开中断BIC r14,r14,#0x80MSR CPSR_c,r14LDR PC,[PC,r12,LSL#2]//将pc指向该优先级号对应的处理代码入口NOP//补位DCD Priority0Handler//代码入口表DCD Priority 1 HandlerDCD Priority 2 Handler……Priority0Handler//0优先级中断处理代码STMFD sp!,{r0-r11}//保存工作寄存器……(略)//具体代码LDMFD sp!,{r0-r11}//恢复工作寄存器MRS r12,CPSR//关中断ORR r12,r12,#0x80MSR CPSR_c,r12LDMFD sp!,{r12,r14}//恢复r12MSR SPSR_csxf,r14//恢复备用程序状态寄存器(SPSR)LDMFD sp!,{pc} //返回原程序Priority 1 Handler//优先级中断处理代码(略) 快中断处理程序的编写为保证高速处理,快中断处理程序必须要用汇编语言编写,而且必须是非重入的。4 嵌入式实时操作系统 μC/OS-Ⅱ 4.1 概述μC/OS-II(Mirco-Controller Operating System Version 2)是一个完整的,可移植、固化、可裁剪的占先式实时多任务内核;是一个具备现代操作系统特点的RTOS,同时它结构清晰、注解详尽,具有良好的可扩展性和可移植性,被广泛地应用于航空业、高端音响、医疗器械、电子乐器、网络设备、工业机器人等各个领域,各种架构的微处理器上。2000年7月,μC/OS-II在一个航空项目中得到了美国联邦航空管理局(FederalAviationAdministration)对用于商用飞机的、符合RTCADO-178B标准的认证[11],这就说明μC/OS-II可以在任何场合中应用,μC/OS-II的特点主要可以概括为以下几个方面。1.有源代码:源代码清晰易读且结构协调,注解详尽,组织有序。2.可移植性:绝大部分μC/OS-II的代码使用移植性很强的ANSIC写的,和处理器硬件相关部分采用汇编写。3.可裁剪:可以只使用μC/OS-II中应用程序需要的那些系统服务。这种可裁剪是靠条件编译实现的,充分利用这个特性,可以有助于缩短代码长度,优化流程控制[30]。4.可剥夺性:μC/OS-II完全是可抢占式实时内核,即总是运行就绪条件下优先级最高的任务。5.多任务:可以管理64个任务,但系统保留了8个任务,应用程序最多可以有56个任务。赋予每个任务的优先级必须是不相同的,这也意味着μC/OS-II不支持时间片轮转调度法(round-robin scheduling),该调度法适用于调度优先级平等的任务。6.可确定性:全部μC/OS-II的函数调用和服务的执行时间具有可确定性,即它们的执行时间是可知的。7.任务栈:每个任务有自己单独的栈,μC/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。8.系统服务:μC/OS-II提供多种系统服务,如邮箱、消息队列、信号量、固定块大小的内存的申请和释放、时间相关函数等。9.中断管理:中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层
arm嵌入式系统设计论文μC/OS-Ⅱ的任务管理 4.2.1μC/OS-Ⅱ的任务管理每个任务在被创建的时候,一个称为任务控制块TCB(task control blocks)的数据结构将被初始化。如下所示为μC/OS-II的任务控制块结构。typedef struct os_tcb{OS_STK*OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN//控制是否允许在外部对任务控制块进行扩充void*OSTCBExtPtr;//指向用户定义的数据(实现对任务控制块扩展)OS_STK*OSTCBStkBottom ;//指向任务堆栈的底部INT32U OSTCBStkSize;//任务堆栈的大小INT16U OSTCBOpt;//存放创建任务时的参数INT16U OSTCBId;//任务的表示ID#endifstruct os_tcb*OSTCBNext;//实现任务控制块双链表struct os_tcb*OSTCBPrev;#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_EN//是否采用消息机制OS_EVENT*OSTCBEventPtr;//指向事件控制块#endif#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN//是否采用消息机制void*OSTCBMsg;//指向从消息队列或邮箱接收的消息#endifINT16U OSTCBDly;//任务的延时时钟滴答数INT8U OSTCBStat;//任务的状态INT8U OSTCBPrio;//任务的优先级//以下四个用于加速任务进入就绪态的过程或进入等待事件发生状态的过程INT8U OSTCBX;//保存优先级的前3位INT8U OSTCBY;//保存优先级的后3位INT8U OSTCBBitX;//任务优先级在就绪表中的横向偏移位置INT8U OSTCBBitY;//任务优先级在就绪表中的纵向偏移位置#if OS_TASK_DEL_EN//宏定义:是否允许删除任务BOOLEAN OSTCBDelReq;//指示任务是否需要删除自己#endif}OS_TCB;与大多数操作系统的进程控制块相似,μC/OS-II的TCB中包含了任务运行和管理的信息,同时μC/OS-II的TCB有如下特点:1.包含受宏定义控制的条件编译,允许用户根据具体应用对TCB进行裁减,节省内存空间。2.具有单独的任务堆栈并对其进行管理。3.包含为任务状态转换而保存的任务信息,提高任务调度效率。μC/OS-II初始化的时候将所有可用的任务控制块通过指针*OSTCBNext和*OSTCBPrev连成一个可用任务双向链表,并将指针*OSTCBFreelist从可用任务双向链表获取一个TCB。μC/OS-II的任务通常如下所示,与普通C函数一样,有函数返回类型,有形式参数变量,但是任务是不会返回的,故返回参数必须定义成void。void YourTask(void*pdata){Do something;waiting;……}μC/OS-II可以管理多达64个任务,每个任务的优先级都必须不一样,因此共有64个优先级,并且从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有56个任务。任务的优先级越高,反映优先级的值则越低。μC/OS-II下每个任务可以有如下五种状态,见图4-1。 4.1任务状态休眠态(dormant):指任务驻留在程序空间中,还没有交给内核管理。把任务交给内核是通过调用OSTaskCreate()或OSTakCreateExt()两个函数实现的,这些调用用于告诉内核,任务的起始地址在哪里,任务建立时用户给任务赋予了什么样的优先级,任务要使用多少栈空间等。就绪态(Ready):当任务一旦建立,这个任务处于就绪态准备运行,就绪态的任务都放在就绪列表中。在任务调度时,指针OSTCBHightdy指向优先级最高的就绪任务,一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。运行态(Running):准备就绪的最高优先级的任务获得CPU的控制权从而处于运行态。调用OSStart()可以启动多任务,OSStart()函数只能在启动时调用一次,任何时候只能有一个任务处于运行态。等待或挂起(Pending):正在运行的任务由于调用延时或等待事件信号量的来临而将自身挂起而处于等待或挂起态,是由OSTimeDly()和OSTimeDlyHMSM()这两函数实现的,一直到函数中定义的延迟时间到。中断态(Interrupt):除非将中断关闭正在运行的任务可以被中断。4.2.2 μC/OS-II中的任务调度当就绪任务的数目多于CPU数目时,它们就要争夺CPU资源。任务调度的功能就是按照一定的原则把CPU动态的分配给某个就绪任务。任务调度工作是通过任务调度程序来完成的,它是操作系统的真正核心。由于任务调度程序负责在就绪任务间转换对处理机的使用,所以对它的调用相当频繁,有时每秒钟要执行很多次。引起任务调度的条件和时机与操作系统的类型有关,也与操作系统内核的具体实现方法有关,通常在下述情况下进行任务重新调度:1.正在执行的任务正常结束执行或因发生某种事件而不能继续进行时,要重新调度一个任务去占用CPU。2.执行中的任务因提出I/O请求而暂停执行时,要重新调度。3.在任务通讯或同步过程中,执行了某种原语操作,需要重新调度。4.在可剥夺式调度中,有一个比当前任务优先级更高的任务进入就绪队列时,为保证其立即占用CPU,要重新调度。5.在时间片轮转法中,每次时间片完成,要重新调度。一旦转入任务调度程序,它将完成下列工作:(1)保护当前正在执行任务的现场,将程序状态寄存器、指令寄存器及所有通用寄存器的内容放到特定单元保存起来。(2)根据一定的算法,如优先级最高算法,从就绪任务队列中选择一个,并把CPU分配给它。(3)恢复被调度到的任务的原来现场,从而使它按上次放弃CPU时的状态继续运行。μC/OS-II是剥夺型实时多任务内核,采用基于优先级的调度,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。μC/OS-II不支持时间片轮转调度(当两个或两个以上的任务有同样优先级,内核允许一个任务运行事先确定的一段时间,叫做时间额度,然后切换给另一个任务,也叫做时间片调度),μC/OS-II中每个任务的优先级都是不一样的,并且是唯一的。μC/OS-II的任务调度包括任务级的调度和中断级的调度,它们调度算法实现是一样的。1.任务级的调度任务级的调度是由函数OSSched()完成的。下面通过具体分析OSSched()的实现来看看μC/OS-II的任务调度的特点。应用程序可以直接调用这个函数。相比之下,Linux内核中进程调度则总是隐藏在别的系统调用中[9]。如图4-2所示,整个任务调度都在临界段区中(见①⑧),首先是在②判断任务调度的时机,在ISR或调度被禁止时不允许进行调度,否则执行③从就绪表中找到最高优先级级的就绪任务,如果它不是当前任务(见④)就需要进行⑥上下文切换,上下文切换由OS_TASK_SW()实现,OS_TASK_SW()会在移植时再详细介绍。如果当前任务就是就绪表中的最高优先级的就绪任务,不进行切换操作则直接返回退出调度函数。2.中断级的调度中断级的调度是由另一个函数OSIntExt()完成的。在调用μC/OS-II的其他服务之前,μC/OS-II首先调用系统初始化函数OSInit()。调用OSInit()后,一些μC/OS-II变量和数据结构之间的关系。图中两个任务的控制块用双向链表链接,OSTCBList指向这个链表的起始处。当系统建立一个任务时,这个任务总是被放在链表的起始处。链表的终点指向空字符NULL。因为这两个任务都处于就绪态,所以就绪表OSRdyTbl[]中的相应位是设为1的。又因为这两个任务的相应位在OSRdyTbl[]的同一行上,即属同一组,故OSRdyGrp只有一位是设为1的。μC/OS-II还初始化了4个空数据缓冲区。每个缓冲区都是单向链表,允许μC/OS-II从缓冲区迅速得到或释放一个单元。μC/OS-II自动安排系统总的任务数,控制块OS_TCB的数目也就自动确定了。多任务的启动是用户通过调用OSStart()实现的。在启动μC/OS-II前用户至少要建立一个应用任务。当调用OSStart()时,OSStart()从任务就绪表中找出优先级最高的任务的任务控制块,然后,OSStart()调用最高优先级就绪任务启动函数OSStartHighRdyO使这个任务运行。μC/OS-II是严格按照优先级进行调度,μC/OS-II总是运行进入就绪态任务中优先级最高的任务,因此必须确定任务优先级最高就绪任务。在Linux中这一过程并不简单,而在μC/OS-II中却很简单,也是μ
arm嵌入式系统设计论文C/OS-II的调度最大特点之一。μC/OS-II通过独特的查表法,实现了快速找到准备就绪的优先级最高任务。我们来分析其相关的数据结构及其细节。 图4.2 μC/OS-II的任务调度每个就绪的任务都放在就绪表中,就绪表有2个变量OSRdyGrp和OSRdyTbl[]。在OSRdyGrp中任务按优先级分组,8个任务为一组,其8比特位表示8组任务中每一组是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdvTbl[]的相应元素的相应位也置为1。μC/OS-II内核有64个优先级0-63,二进制中可以用6位来表示。尽管μC/OS-II可管理最多64个任务,但μC/OS-II保留了先级为0、l、2、3、OSLOWESWPRIO-3、OSLOWESTPRO-2、OS_LOWEST_PRIO和OS_LOWEST_PRIO这8个任务以便将来使用。因此,用户可以有最多56个应用任务。μC/OS-II不允许两个任务具有相同的优先级,必须给每个任务赋以不同的优先级。如图4-3所示,若每组有任务处于就绪态,则相应的比特置1。优先级的高3位“XXX”用来确定是在OSRdyTbl[]数组中的第几个元素;优先级的低3位“YYY”用于确定在OSRdyTbl[]中对应元素的所在位。例如,通过优先级21(二进制表示为010101),根据其高3位可知任务状态在就绪表数组OSRdyTbl[]的OSRdyTbl[2]中,根据其低3位可知任务就绪状态在OSRdyTbl[2]内第三个比特位表示。OSRdyTbl[]和OSRdyGrp用于管理任务是否就绪的状态,例如要置优先级为21(二进制表示为010101)的任务就绪,则根据高3位值2和低3位值5将OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置l,相应的数学表达式为:OSRdyGrp[1]|=0x04;OSRdyTbl[2]|=0x20; 图4.4μC/OS-II缓冲区示意图由以上的计算可知若需将第n位置1,则应与2的n次幂相或。μC/OS-II中,把2的n次幂(n=0-7)的8个值预先存在数组OSMapTbl[]中作掩码使用,如表4-l所示利用OSMapTbl[],通过任务的优先级prio来设置任务在就绪组和就绪表数组中相应状态标志的数学表达式为:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];因为64个优先级可用6位来表示,所以高3位可用prio>>3得到,低3位通过prio&0x07获得。表4.1 OSMapTbl[] 在μC/OS-II的任务调度中就是利用上面介绍的OSRdyGrp和OSRdyTbl[]来找出优先级最高的就绪任务的。优先级值越小优先级就越高,任务组号越小该组任务的优先级越高,优先级0为最高优先级,任务组0为最高优先级任务组。通过OSRdyGrp和OSRdyTbl[]来确定最高优先级的就绪任务的算法。从右到左扫描位图OSRdyGrp,遇到的第一个非0比特位就停止扫描(因为越靠近右边优先级越高),己经找到当前优先级最高的就绪进程所在的任务组。根据任务组号找到对应OSRdyTbl[]元素从右到左扫描遇到的第一个非0比特位就某当前优先级最高的就绪任务。如下的算法分析:INT8U findhighprio(){int n,m,highprio;n=0;do{if(OSRdyGrp& )break;n++;}while(m<8)//得到优先级最高的就绪任务组号m=0;do{if(OSRdyTb1[n]& )break;m++;}while(m<8)//得到进程组最高优先级就绪任务的组内偏移highprio=n*8+m;return highprio;}可知,要找到最高优先级就是要计算出m和n的值(m和n分别为最高就绪优先级任务组号和组内偏移),可以看出,用该算法实现不但复杂,花费更多的计算时间,更重要的是循环次数是不确定的,因此其执行时间是不可预测的,这个不符合实时系统的确定性原则。为了找到进入就绪态的优先级最高任务并不需要扫描整个就绪表,在μC/OS-II采用查表的方法实现。把需要由上面程序计算出的m和n的值预先放到表中,因为OSRdyGrp和OSRdyTbl[i]都为8位,所以共有2的N次幂=256种不同的组合,所以这个数组的大小也是256。这个表为数组OSUnMap[255],OSUnMapTbl[]的定义见文献[10]。现在选出优先级最高优先级的就绪任务只需要以下一小段程序就可以实现了,如下所示:y=OSUnMapTb1[OSRdyGrp] ;x=OSUnMapTb1[OSRdyTb1[y]] ;OSPrioHighRdy=(INT8U)((y<<3)+x) ;OSTCBHighRdy=OSTCBPrioTb1[OSPrioHighRdy] ;μC/OS-II任务调度采用查表法,分别找到就绪的最高优先级任务在OSRdyTbl[]中的组号y和组内偏移x,就找到了就绪的最高优先级任务。只需要两三句C程序非常简单,同时与应用程序中建立的任务数无关。如上面分析,与Linux的调度相比,μC/OS-II的调度相当简洁,效率也高出许多。其中的原因有以下几个方面:(1)如果调度的策略并非严格的按优先级调度,而还要考虑其他的因素,那就不止是简单的找到优先级最高的就绪进程就能解决问题了。嵌入式实时操作系统通常都是严格的按优先级调度,而通用操作系统则一般还有考虑时间片以及累计运行时间的问题,所以通用操作系统自然就比较复杂。(2)如果优先级的使用并非唯一的,因而多个进程可以使用的优先级,那就还有个在具有相同优先级的就绪进程之间怎样调度的问题,这就使得调度的过程复杂化了。μC/OS-II这方面比较特殊,一些商用的RTOS,如PSOS, VXWORKS,QNX等,都允许多个进程具有相同的优先级,所以它们的进程调度也达不到μC/OS-II这样的简单和高效。(3)严格的按照优先级调度,并且每个优先级只允许有一个进程,是μC/OS-II得以实现简单高效的进程调度的关键原因。当然,μC/OS-II为允许的进程数量规定了一个不大的上限,以及前述包括位图在内的种种数据结构和算法也都起了很好的作用。如上节所述,μC/OS-II的调度程序只需3行C程序就完成,因此调度所需的时间非常短而且与任务数量无关。4.3 中断时钟与节拍在μC/OS-II中,中断服务程序一般用汇编语言来写,下面是中断处理程序的一般处理过程的示意代码。void ucosISR(){ l.保存全部CPU寄存器;2.调用OSIntEnter或OSIntNesting直接加1;
arm嵌入式系统设计论文执行用户代码做中断服务;4.调用OSIntExit;5.恢复所有CPU寄存器;6.执行中断返回指令; }如此代码,μC/OS-II中的中断处理与PC的中断处理类似,当发生中断时,应首先保护现场,将CPU寄存器入栈,再执行中断服务程序,然后恢复现场,将CPU寄存器出栈,最后执行中断返回指令实现中断返回。不同的是现场保护后,需要调用OSIntEnter()函数通知内核已经进入了中断服务程序;执行完中断服务后和恢复现场前,应该调用OSIntExit()函数判断是否需要进行任务调度并实现中断级任务调度。调用OSIntEnter()将共享变量OSIntNesting加l,内核通过OSIntNesting的值是否大于0来判断系统是否处于中断状态,大于1表示有中断嵌套。在退出中断服务程序之前,首先应该将OSIntNesting减1;如果中断服务程序使更高优先级的任务就绪且不处于中断嵌套(OSIntNesting为0),还必须进行中断级的任务调度将CPU切换到高优先级的任务,OSIntExit的程序结构如图4-6。这里需要注意的是中断的上下文切换和任务中的不同之处,任务中上下文的切换前面已经介绍,中断的上下文切换采用OSIntCtxSw(),具体实现在移植μC/OS-II会详细介绍。时钟节拍是周期性发生的特殊中断(时钟中断)。操作系统通过时钟中断来确定时间间隔,实现时间延时及确定超时。时钟中断的频率越高,系统的额外负荷越多,通常将频率设置在10-100Hz之间。当时钟中断发生,OSTime值加1,所以OSTime的值是操作系统启动后的时钟滴答数目。 图4.6 OSIintExit的程序流程μC/OS-II的时钟中断服务程序结构与上述的普通中断服务程序一样,其服务程序核心是调用OSTimetick()函数。OSTimetick()函数用来判断延时任务是否延时结束从而将其置于就绪态,其程序结构如图4-7所示。
图4.7 OSTimeTickt()程序流程5 μC/OS-II在S3C44BOX上的移植 5.1μC/OS-II系统移植概述 所谓移植就是使一个实时内核能够在其他微处理器或微控制器上运行。为了提高可移植性,大部分的μC/OS-II代码是用C语言写的,但仍需要汇编语言编写一些与处理器相关的代码,因为μC/OS-II在读写处理器寄存器时只能通过汇编语言来实现。μC/OS-II在设计时就己经充分考虑了可移植性,所以μC/OS-II的移植相对而言来说是比较容易的,图5-1说明了μC/OS-II的体系结构及它与系统硬件之间的关系。应用程序软件μC/OS-II(与处理器无关的代码) 图5.1μC/OS-II硬件与软件体系结构图要使μC/OS-II系统正常运行,处理器必须满足以下要求:1.处理器的C编译器能产生可重入代码。可重入的代码指的是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据。这种代码的重入性是保证完成多任务的基础,除了在C程序中使用局部变量外,还需要C编译器的支持。2.处理器支持中断,并能产生定时中断(通常在10到100HZ)。μC/OS-II是通过处理器产生的定时器中断来实现多任务之间的调度的,在ARM7TDMI的处理器上可以产生定时器中断。3.用C语言就可以打开和关闭中断。在μC/OS-II中,可以通OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()两个宏来控制系统关闭或者打开中断。这需要处理器的支持,在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。4.处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。5.处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈或内存的指令。μC/OS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以寄存器的入栈和出栈是μC/OS-II多任务调度的基础。ARM7TDMI处理器是一种完全满足上述要求的处理器。本文主要工作之一就是研究如何将μC/OS-II移植到Samsung公司的一款基于ARM7TDMI内核的嵌入式处理器—S3C44B0X上。5.2 移植方法5.2.1 编制OS_CPU.H文件OS_CPU.H文件包括了与处理器相关的常量、宏和类型定义。移植时需要在这个文件中用#define设置一个常量(OS_STK_GROWTH)的值,声明10个数据类型,并声明两个宏(OS_ENTER_CRITICAI()和OS_EXIT_CRITICAL())。因为不同的微处理有不同的字长[33],所以μC/OS-II的移植包括了一系列的数据类型定义,为确保可移植性,OS_CPU.H中数据类型定义如下:typedef unsigned char INT8Utypedef char INT8Stypedef unsigned int INT16U//GCC中short为16typedef int INT16Stypedef unsigned long INT32Utypedef long INT32Stypedef float FP32typedef float FP64typedef int BOOLEAN常量OS_STK_GROWTH用来指定堆栈的生长方式,绝大多数微处理器和微控制器的堆栈是从上往下长的,但是某些处理器使用另外一种方式工作。μC/OS-II被设计成两种情况都可以处理,只需要给OS_STK_GROWTH赋不同的值。当OS_STK_GROWTH置0时,表示堆栈从下往上长;当OS_STK_GROWTH置1时,表示堆栈从上往下长,这里OS_STK_GROWTH定义如下:#define OS_STK_GROWTH 1宏OS_ENTER_CRITICA()和OS_EXIT_CRITICAL()用来禁止和允许中断。和所有的实时内核一样,μC/OS-II需要先禁止中断再访问代码的临界区,并在访问完毕后重新允许中断。在ARM平台上有两种办法实现对中断的屏蔽,第一种通过修改状态字屏蔽中断,另一种通过SWI功能来实现,这里采用较为简单的第一种方法来实现。程序状态寄存器CPSR包含条件码标志、中断禁止位和当前处理器模式以及其它状态和控制信息,其中的N(Negative)、Z(Zero)、C(Carry)和V(Overflow)位为条件码标志,经常作为标志位引用,可供大多数指令作为是否执行的检测标志。CPSR的最低8位I、F、T和M[4:0]用作控制位,其中的I、F为中断禁止位,当I位置1禁止IRQ中断,而F位置1则禁止FRQ中断。通过给CPSR相应的位赋值就可以实现开关中断的功能。
arm嵌入式系统设计论文|免费论文编制 OS_CPU_A.S 文件 为了方便移植,大部分的μC/OS-II代码是用C语言写的,但仍需要用C和汇编语言写一些与处理器相关的代码,这是因为μC/OS-II在读写处理器寄存器时只能通过汇编语言来实现,这部分代码都放在了OS_CPU_A.S文件中。如果要实现μC/OS-II移植,一定要编写OS_CPU_A.S文件中四个汇编语言函数OSStartHighRdy()、OSCtxSw()、OSIntCxSw()、OSTickISR()以及ARMEnableInt()和ARMDisableInt()。1.OSStartHighRdy()函数被多任务系统启动函数OSStart()调用,使就绪态的最高优先级的任务开始运行(就绪的最高优先级任务就如同从中断里返回到运行态一样,使得整个系统得以运转。该函数仅仅在多任务启动时被执行一次,用来启动第一个,也就是最高优先级的任务执行,之后多任务的调度和切换就是由下面的函数OSCtrSw()和OSIntCtxSw()来实现)。假设OSTCBHighRdy指向的是优先级最高任务的任务控制块,要想运行最高优先级的任务,用户所要做的是将所有处理器寄存器按顺序从任务堆栈中恢复出来,并执行中断的返回。为了方便起见,堆栈指针总是存储在它的OS_TCB的开头,也就是说要恢复的任务堆栈指针总是存储在OS_TCB的0偏址的内存单元中。OSStartHighRdy必须调用OSTaskSwHook,因为用户正在进行任务切换的部分工作即恢复最高优先级任务的寄存器的内容。而OSTask SwHook可以通过检查OSRunning获知是OSStartHighRdy()在调用它(OSRunning为FALSE)还是正常的任务切换在调用它(OSRunning为TRUE)。函数OSStartHighRdy伪代码如下:void OSStartHighRdy(void){调用OSTaskSwHook();得到最高就绪任务的栈指针并赋给SP;OSRunning=TRUE;通过模拟一次中断返回,用SP从堆栈中恢复任务的寄存器;任务代码地址赋给程序计数器PC,转动任务中执行指令}OSStartHighRdy的主要代码如下:{BL OSTaskSwHook;//调用OSTaskSwHook函数LDR r4,addr_OSTCBCur;//得到当前任务TCB地址LDR r5,addr_OSTCBHighRdy;//得到最高优先级任务TCB地址LDR r5,[r5] ;//获得堆栈指针LDR sp,[r5] ;//转移到新的堆栈中STR r5,[r4] ;//设置新的当前任务TCB地址LDMFD sp!,{r4};MSR SPSR,r4;LDMFD sp!,{r4};//从栈顶获得新的状态MSR CPSR,r4;//CPSR处于SVC32Mode模式LDMFD sp!,{r0-r12,lr,pc};//运行新的任务}2.OSCtxSw()函数是任务级的上下文切换函数,在任务因为被阻塞而主动请求CPU调度时执行,由于此时任务切换是在非异常模式下进行的,因此需要区别与中断级别的任务切换。OSCtxSw()完成的工作为:保存任务的环境变量 (主要是寄存器的值,通过入栈实现),将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回,这样就完成了任务级切换。OSCtxSw()函数的伪代码如下: void OSCtxSw(void){保存处理器寄存器;将当前任务的堆栈指针保存到当前任务的OS_TCB中;调用OSTaskSwHook();需要恢复的任务的控制块赋给当前任务控制块指针OSTCBCur;需要恢复的任务的优先级赋给当前任务优先级指针OSPrioCur;得到需要恢复的任务的堆栈指针SP;将所有处理器寄存器从新任务的堆栈中恢复出来;模拟中断返回;}3.OSIntCtxSw()函数是中断级的任务切换函数,在时钟中断ISR(中断服务例程)中发现有高优先级任务等待的时钟信号到来,需要在中断退出后不返回被中断的任务,而是直接调度就绪的高优先级任务,其目的在于能够尽快让高优先级的任务得到响应,保证系统的实时性能。尽管原理与任务级切换基本上相同,但是由于进入中断时已经保存过了被中断任务的CPU现场,因此不再进行类似的操作,只需要根据函数的嵌套情况做相应的调整。OSIntCtxSw()具体完成的工作包括:调用OSTaskSwHook(),保存当前任务SP,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回。OSIntCtxSw的伪代码如下:void OSCtxSw(void){调用OSTaskSwHook();需要恢复的任务的控制块赋给当前任务控制块指针OSTCBCur;需要恢复的任务的优先级赋给当前任务优先级指针OSPrioCur;得到需要恢复的任务的堆栈指针SP;将所有处理器寄存器从新任务的堆栈中恢复出来;模拟中断返回;}4.OSTickISR()是系统时钟节拍中断服务函数。它是一个周期性中断,为内核提供时钟节拍,频率越高系统负荷越重。其周期的大小决定了内核所能给应用系统提供的最小时间间隔服务,一般只限于毫秒级(跟处理器有关),对于要求更加苛刻的任务需要用户自己建立中断来解决。为OSTickISR()的主要任务是负责处理时钟中断,调用系统实现OSTimeTick函数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。该函数具体内容:保存寄存器,调用OSIntEnter(),调用OSTimeTick(),调用OSIntExit(),恢复寄存器,中断返回。OSTickISR函数的伪代码如下:void OSTickISR(){保存处理器寄存器的值;调用OSIntEnter();OSTimeTick();调用OSIntExit();恢复处理器寄存器的值;中断返回;}5.ARMEnableInt()和ARMDisableInt()分别是退出临界区和进入临界区的宏指令实现。主要用于在进入临界区之前关闭中断,在退出临界区的时候恢复原来的中断状态。它的实现比较简单,可以采用方法1直接开关中断来实现,也可以采用方法2通过保存关闭/恢复中断屏蔽位来实现。5.2.3 编制OS_CPU_C.C文件 μC/OS-II的移植要求用户编写OS_CPU_C.C文件中六个C语言函数,分别为函数OSTaskSwHook()、OSTaskstkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskstHooK()和OSTimeTickHook()。其中,唯一必要的函数是OSTaskstkInit(),其它五个函数必须声明但可以不包含代码。1. OSTaskstkInit():OSTaskstkInit()被OSTaskCreate()、OSTaskCreate Ext()调用来初始化任务的堆栈结构,图5-3显示了OSTaskstkInit()放到正被建立的任务堆栈中的内容,这里假定堆栈是从上往下长的。当用户建立任务时,用户要将任务的地址、Pdata指针、任务的堆栈栈顶指针和任务的优先级传递给OSTaskCreate()和OSTaskCreateExt()。为了正确初始化堆栈结构,OSTaskStkInit()要求刚才得到的前三个参数和一个附加选项,这个选项只能在OSTaskCreateExt()中得到。如果想从其它的函数中调用一个任务,C编译器就会先将调用该任务的函数的返回地址保存到堆栈中,再将pdata参数保存到堆栈或寄存器中。堆栈指针存储的处理器寄存器值Pdata(pdata通过寄存器传递) 图5.3堆栈初始化当处理器发现并开始执行中断时会自动完成此过程。一些处理器会将所有的寄存器存入堆栈,而其他一些处理器只将部分寄存器存入堆栈。一般而言,处理器至少要将程序计数器的值和处理器的状态字存入堆栈。处理器按一定顺序将寄存器存入堆栈,而用户在将寄存器存入堆栈的时候也就必须遵从这一顺序,之后用户需要将剩下的处理器寄存器保存到堆栈中。如果pdata被用户的C编译器保存到寄存器中,用户需要从编译器的文档中找到pdata存储在哪个寄存器中,pdata的内容就会随着这个寄存器的存储被放在堆栈中。一旦用户初始化了堆栈,OSTaskStkInit()就要返回堆栈指针所指的地址,OSTaskCreate()和OSTaskCreateExt()会获得该地址并将它保存到任务控制块中。处理器文档会告诉用户堆栈指针指向下一个堆栈空闲位置,还是指向最后存入数据的堆栈单元位置。2.OSTaskCreateHook:当用OSTaskCreate()和OSTaskCreateExt()建立任务时调用OSTaskCreateHook(),μC/OS-II设置完了自己的内部结构后,会在调用任务调度程序之前调用该函数。3.OSTaskDelHook():任务被删除时调用OSTaskDelHook(),该函数在把任务从μC/OS-II的内部任务链表中解开之前被调用,当OSTaskDelHook()被调用时,它会
arm嵌入式系统设计论文用户界面 μC/GUI的实现 6.1 μC/GUI简介μC/GUI是Micrium公司开发的一个商用通用型嵌入式应用图形软件,具有模块化的特点。它可以用来为任何使用图像LCD的应用程序提供一个高效的、独立于处理器和LCD控制器的图形用户接口。无论是在单任务操作系统还是在多任务操作系统中,μC/GUI都可以工作得很好,μC/GUI具有以下特性。1.具有很强的可移植性,由于μC/GUI采用分层结构,即具有驱动接口层和应用层,而且μC/GUI的代码全部都是用C语言编写的,因此它可以方便地移植到各种CPU下使用。2.μC/GUI对LCD显示器的支持很好,并且有常见的2D图形函数库和窗口管理功能,而且占用RAM和ROM的空间很小。在不同的应用中,μC/GUI需要的资源如表6-1所示。表6.1μC/GUI需要的资源 3.适合应用于嵌入式系统,由于μC/GUI需要的资源比常见的操作系统图形模块要小很多,再加上它提供了源代码,因此很适合用于嵌入式系统中Gul应用的开发。由于μC/GUI提供了源代码,因此可以很容易地将它移植到各个平台下。使用时只要将μC/GUI的软件压缩包解压缩到一个目录下就可以了。μC/GUI的主要目录注释如表6-2所示。表6.2μC/GUI的目录说明 6.2 用μC/GUI开发GUI的方法 由于μC/GUI提供了源代码,在开发应用程序时,用户可以首先将核心文件、LCD驱动文件和需要的字体文件包含在自己的工程里,然后再根据实际的硬件需要,包含内存设备、输入设备、空间和窗口管理部分。具体开发步骤可以分以下几步:1.按照实际需要,定制自己的μC/GUI开发环境,其中包括对上述目录的筛选,或对目录中文件的筛选;2.指定硬件设备的地址,编写接口驱动代码,这里需要修改LCDConf.h文件;3.编译、连接、调试例子程序;4.修改例子程序并测试,增加需要的功能;5.如果准备开发多任务应用,则需要修改GUI_MAXTASK和GUI_OS宏,实现μC/GUI与操作系统的结合;6.编写自己的应用程序。6.3 μC/GUI在系统中的应用由于μC/GUI不支持ARM7处理器S3C44B0X,因此,要想把μC/GUI移植到系统平台上,需要自己完成μC/GUI在系统硬件平台上的各种驱动,具体包括S3C44B0X LCD控制器的正确初始化,画点、画线、填充等LCD驱动函数的编写。1. LCD控制器初始化编程 S3C44B0X中内置的LCD控制器逻辑框图如图6-2所示,该控制器的REGBANK具有18个可编程寄存器,用于配置LCD控制器。系统中LCD面板的连接使用的是8位单行扫描模式,接线图如图6-3所示。S3C44B0X LCD控制器上的正确初始化包括各种控制寄存器的正确配置和显存设置与映射。 图6. 2 S3C44B0X LCD控制器逻辑框图 图6. 3 LCD控制器与KCSO57QV1AJ接线图LCD的初始化源码如下:void LCD_Init_Controler(){int i,j;if((U32)frameBuffer256==0){frameBuffer256=(unsigned int(*)[SCR_XSIZE/4])malloc(SCR_XSIZE*SCR_YSIZE) ;}for(j=0;j<240;j++)for(i=0;i<80;i++){frameBuffer256[i][j]=0x0;//显存清零}rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x3<<10)|(CLKVAL_COLOR<<12) ;//8位单行扫描,WDLY=8clk,WLH=8clkrLCDCON2=(LINEVAL)|(HOZVAL_COLOR<<10)|(IO<<21) ;rLCDSADDR1=(0x3<<27)|(((U32)frameBuffer256>>22)<<21)|((U32)frameBuffer256>>1)&0x1fffff) ;//256色,LCDBANK地址,LCDBASEU地址rLCDSADDR2=M5D((((U32)frameBuffer256+(SCR_XSIZE*LCD_YSIZE))>>1))|(mval<<21) ;rLCDSADDR3=(LCD_XSIZE/2)|(((SCR_XSIZE*LCD_XSIZE)/2)<<9) ;//为了得到更好的显示效果,下面寄存器的值须进行适当调整rREDLUT=0xfdb86420;rGREENLUT=0xfdb86420;rBLUELUT=0xfa50;lwfree.cnrDP4_7=oxba5da65;rDP3_5=oxa5a5f;rDP2_3=oxd6b;rDP5_7=oxeb7b5ed;rDP3_4=ox7dbe;rDP4_5=ox7ebdf;rDP6_7=ox7fdfbfe;rLCDCON1=(1)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12 ;}2.LCD驱动函数编程在LCD的驱动函数中,最底层的驱动函数是画点函数和取点函数即static void SetPixel(int x,int y,LCD_PIXELINDEX color); unsigned int GetPixellndex(int x,int y);在μC/GUI中显示字、图形都与这两个函数有关,它们直接与显存打交道。当μC/GUI的GUI_SUPPORT_MEMDEV设为1,显存可分两级显存,一级显存用专用LCD DMA向LCD传输数据,无需CPU介入;二级显存则是一级显存的副本,当显示动态图像时,先在二级显存将一帧的内容全部刷新,再更新一级显存的内容。主存的更新速度很快,因此可得到较好的显示效果,减少了闪烁和不连贯。画点、取点是对一级显存中的彩色象素点进行定位。画点函数源码如下:static void SetPixel(intx,int y,LCD_PIXELINDEX color){if(x
>((x)%4)*8))|((color)<<((4-1-((x)%4))*8)) ;}取点、画线和填充等函数可依此得到。为了显示出字符和位图,还须参考μC/GUI的LCDMemC.c,写DrawBitLinelBPP、DrawBitLine2BPP和DrawBitLine4BPP函数,并配置GUIConf.h和LCDConf.h中的常数。当在LCD上看到有字符输出时,μC/GUI的LCD移植部分基本成功。由于μC/GUI中还有一些跟时间相关的调用如GUI_X_Delay()等,这些函数需用到系统时间变量OS_TimeMS,该变量可由μC/OS-II操作系统来维护更新。上面只是给出了我们移植内容的关键部分,完成了上面的各个驱动函数,就可以采用μC/GUI的demo程序对所移植的μC/GUI进行测试。
arm嵌入式系统设计论文结 束 语本课题致力于研究μC/OS-II嵌入式实时操作系统在ARM7TDMI上的移植,可用性经过实践得到验证。但是它仅仅是一个内核,只提供了任务管理以及任务间的通信等基本的功能,没有用户接口,以及网络功能等,特别是没有网络功能在互联网发达的今天是不能接受的,因此只有μC/OS-II内核离具体应用还有一定的距离。同时μC/OS-II不是针对特定的硬件,即它与硬件无关的,要实现在特定的硬件上运行还必须设计相应的移植程序。本论文详细分析了嵌入式实时操作内核μC/OS-II,并在此基础上对μC/OS-II的不足之处进行了改进,并为μC/OS-II增加了用户界面μG/GUI,最后把μC/OS-II移植到基于ARM7TDMI的硬件平台上。基于嵌入式实时操作系统μC/OS-II,在ARM上的移植研究所作的工作有: 对嵌入式系统的开发设计过程进行了总结,对传统方法与软硬件相结合方法进行了对比,为嵌入式系统的开发设计提供了借鉴。采用软硬件相结合方法,进行协同设计(Co-design)、协同测试(Co-test)和协同验证(Co-verification),充分考虑了软硬件的关系,并在设计的每个层次上给以测试验证,并发现和解决问题。 在μC/OS-II上实现了用户界面μG/GUI,总结了实现用户界面μG/GUI应用的一些方法。 编写μC/OS-II到ARM7TDMI的移植代码,调试内核及验证移植的正确性,着重对OS_CPU.H,OS_CPU_A.S,OS_CPU_C.C三个移植文件的分析与实现。总结了μC/OS-II移植的关键技术等,给出的移植方法对同类问题也有较好的借鉴作用。 对μC/OS-II的任务管理,优先级算法与中断的具体实现方面进行详细的分析。 对ARM微处理器的应用与S3C44B0X开发板进行了介绍,从成本、性能和功耗三方面对ARM 7TDMI及S3C44B0X开发板进行了分析。本课题因为时间上的原因,只是将嵌入式操作系统μC/OS-II的内核移植到S3C44B0X上,同时在μC/OS-II上实现了用户界面μG/GUI的应用,并没有实现其它的一些功能。还没有体现出μC/OS-II和ARM在具体应用上的优势,比如在TCP/IP上的具体优势。再者,本课题采用的ARM7TDMI处理器,因为其自身处理速度的限制,应用的范围还是有限的。随着ARM11系列的逐渐成熟,ARM的处理速度的再一次提高,性能的逐渐的稳定,将会有大的发展。
参考文献[1] 田泽,嵌入式系统开发与应用。北京航空航天大学出版社,2005:5-7[2] 高超然、徐成等,32位嵌入式开发的发展与动向分析,2004:1-2[3] 陈鑫,嵌入式软件技术的现状与发展动向,软件世界,2001:2[4] 何小平,选择适合ARM的嵌入式操作系统,BMRfech Inc,2003:5[5] 马忠梅,马广云,徐英慧,田译,ARM嵌入式处理器结构与应用基础,北京航空航天大学出版社,2002:4-7[6] Samsung Semi Inc,53C2410X User Manual,2003[7] 梁合庆.当今嵌入式系统综述与新的投资机遇。测控技术,2000(4):1-5[8] 雷红卫、桑楠,嵌入式实时操作系统中断管理技术研究,单片机与嵌入式系统应用,2004(5):15-19[9] DANIEL P.BOVET and MARCO CESATI,深入理解LINUX内核,中国电力出版社,2001.6[10] 毛德操,胡希明.嵌入式系统-采用公开源代码和StrongARM/Xscale处理器.浙江大学出版社,2003.10[11] Jean J.Labrosse著,邵贝贝等译:嵌入式实时操作系统μC/OS-II(第二版)[12] 王田苗,嵌入式系统设计与应用实例开发(第二版).北京:清华大学出版社,2003.10:39-45 [13] 邹思轶.嵌入式Linux设计与应用.北京:清华大学出版社,2002.3:18-325[14] 杜春雷.ARM体系结构与编程.清华大学出版社,2003[15] Kirk Zurell,《C Programing For Embedded Systems》.[16] Jean J.Labrosse,《MicroC/OS-II,The Real-Time Kernel》.[17] Alok patel,《Software Emulation of an Embedded Microprocessor System》,DePartmentof Information Technology and Electrical Engineering,TheUniversity of Queensland.[18] 吕京建,肖海桥,嵌入式处理器分类与现状,http://www.lwfree.cn/[19] 徐宇清,黄彦平,夏耘S3C44B0X的BootLoader技术分析。上海,200093[20] 周立功,ARM微控制器基础与实战.北京航空航天大学出版社,2003:134
致 谢
在本毕业设计研究过程中,我的指导老师山X文老师自始至终都对我严格要求、悉心指导并给予亲切关怀,论文的字里行间凝聚了指导老师大量心血和汗水。在做毕业设计期间,老师渊博的学识、严谨的治学作风,敬业的工作精神、平易近人的宽厚为人给我留下了深刻的印象,使我不仅在学术上受益非浅,还学到了许多作为一名科研工作者所应具备的素质,对我以后的工作、学习都有着不可估量的指导作用,在此谨向尊敬的指导老师致以崇高的敬意和由衷的感谢!同时,也要感谢帮助过我的同学,他们对我的毕设也给予了很大的帮助。正是在老师与同学的共同帮助下,我才能够顺利地完成设计任务。在此,再次向所有给予我关心和帮助的老师及同学表示衷心的感谢!