




已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章绪论1.1嵌入式系统1.1.1嵌入式系统简介随着计算机技术和微电子技术的迅速发展,嵌入式系统应用领域越来越广泛。当今,嵌入式系统已成为一个时髦的名词,就像当初的计算机热潮,似乎比当初的计算机热潮涉及的领域更广泛,应用技术人员更多,相关国民经济产值也更庞大。报纸、杂志、网络都把嵌入式系统当作讨论的热门话题。嵌入式系统一般指非PC系统,有计算机功能但又不称之为计算机的设备或器材。它是以应用为中心,软硬件可裁减的,适应应用系统对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。嵌入式系统主要由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等4个部分组成,它是集软硬件于一体的可独立工作的器件。嵌入式系统的软件部分包括操作系统软件(要求实时和多任务操作)和应用程序编程。操作系统控制着应用程序编程与硬件的交互作用,而应用程序控制着系统的运作和行为。嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等Browser。嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、驱动程序、工具集以及应用程序。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。1.1.2 实时多任务操作系统RTOS(Real Time multi-tasking Operation System),即实时多任务操作系统是嵌入式应用软件的基础和开发平台。目前在中国大多数嵌入式软件开发还是基于处理器直接编写,没有采用商品化的RTOS,不能将系统软件和应用软件分开处理。RTOS是一段嵌入在目标代码中的软件,用户的其它应用程序都建立在RTOS之上。不但如此,RTOS还是一个可靠性和可信性很高的实时内核,将CPU时间、中断、I/O、定时器等资源都包装起来,留给用户一个标准的API,并根据各个任务的优先级,合理地在不同任务之间分配CPU时间。 TOS是针对不同处理器优化设计的高效率实时多任务内核,优秀商品化的RTOS可以面对几十个系列的嵌入式处理器MPU、MCU、DSP、SOC等提供类同的API接口,这是RTOS基于设备独立的应用程序开发基础。因此基于RTOS上的C语言程序具有极大的可移植性。据专家测算,优秀RTOS上跨处理器平台的程序移植只需要修改15%的内容。在RTOS基础上可以编写出各种硬件驱动程序、专家库函数、行业库函数、产品库函数,和通用性的应用程序一起,可以作为产品销售,促进行业内的知识产权交流,因此RTOS又是一个软件开发平台。 RTOS是嵌入式系统的软件开发平台。RTOS最关键的部分是实时多任务内核,它的基本功能包括任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理、旗语管理等, 这些管理功能是通过内核服务函数形式交给用户调用的,也就是RTOS的API。 RTOS的引入,解决了嵌入式软件开发标准化的难题。随着嵌入式系统中软件比重不断上升、应用程序越来越大,对开发人员、应用程序接口、程序档案的组织管理成为一个大的课题。引入RTOS相当于引入了一种新的管理模式,对于开发单位和开发人员都是一个提高。 基于RTOS开发出的程序,具有较高的可移植性,实现90%以上设备独立,一些成熟的通用程序可以作为专家库函数产品推向社会。嵌入式软件的函数化、产品化能够促进行业交流以及社会分工专业化,减少重复劳动,提高知识创新的效率。 嵌入式工业的基础是以应用为中心的芯片设计和面向应用的软件开发。实时多任务操作系统(RTOS)进入嵌入式工业的意义不亚于历史上机械工业采用三视图的贡献,对嵌入式软件的标准化和加速知识创新是一个里程碑。 目前,商品化的RTOS可支持从8BIT的8051到32BIT的PowerPC及DSP等几十个系列的嵌入式处理器。提供高质量源代码RTOS的著名公司主要集中在美国。1.1.3嵌入式操作系统的发展状况国外嵌入式操作系统已经从简单走向成熟,主要有Vxwork、QNX、PalmOS、Windows CE、嵌入式Linux等。国内的嵌入式操作系统研究开发有2种类型,一类是基于国外操作系统2次开发完成的,如海信的基于Windows CE的机顶盒系统;另一类是中国自主开发的嵌入式操作系统,如凯思集团公司自主研制开发的嵌入式操作系统Hopen OS(“女娲计划”)等。 Windows CE内核较小,能作为一种嵌入式操作系统应用到工业控制等领域。其优点在于便携性、提供对微处理器的选择以及非强行的电源管理功能。内置的标准通信能力使Windows CE能够访问Internet并收发E_mail或浏览Web。除此之外,Windows CE特有的与Windows类似的用户界面使最终用户易于使用。Windows CE的缺点是速度慢、效率低、价格偏高、开发应用程序相对较难。 3Com公司的Palm OS在掌上电脑和PDA市场上独占其霸主地位,它有开放的操作系统应用程序接口(API),开发商可根据需要自行开发所需的应用程序。 Microwave的OS-9是为微处理器的关键实时任务而设计的操作系统,广泛应用于高科技产品中,包括消费电子产品、工业自动化、无线通讯产品、医疗仪器、数字电视/多媒体设备。它提供了很好的安全性和容错性。与其他的嵌入式系统相比,它的灵活性和可升级性非常突出。Lynx Real-time Systems的LynxOS是一个分布式、嵌入式、可规模扩展的实时操作系统,它遵循POSIX.1a、POSIX.1b和POSIX.1c标准。LynxOS支持线程概念,提供256个全局用户线程优先级;提供一些传统的、非实时系统的服务特征;包括基于调用需求的虚拟内存,一个基于Motif的用户图形界面,与工业标准兼容的网络系统以及应用开发工具。pSOS 。ISI公司已经被WinRiver公司兼并,现在pSOS属于WindRiver公司的产品。这个系统是一个模块化、高性能的实时操作系统,专为嵌入式微处理器设计,提供一个完全多任务环境,在定制的或是商业化的硬件上提供高性能和高可靠性。可以让开发者根据操作系统的功能和内存需求定制成每一个应用所需的系统。开发者可以利用它来实现从简单的单个独立设备到复杂的、网络化的多处理器系统。QNX是由加拿大QSSL公司开发的分布式、实时的、可扩充的操作系统,它部分遵循POSIX相关标准,如:POSIX.1b实时扩展。它提供了一个很小的微内核以及一些可选的配合进程,具有高度的伸缩性,可灵活地剪裁。其内核仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理,其进程在独立的地址空间运行。所有其它OS服务,都实现为协作的用户进程,因此QNX内核非常小巧(QNX4.x大约为12Kb)而且运行速度极快。这个灵活的结构可以使用户根据实际的需求,将系统配置成微小的嵌入式操作系统或是包括几百个处理器的超级虚拟机操作系统。因此,可以广泛地嵌入到智能机器、智能仪器仪表、机顶盒、通讯设备、PDA等应用中去。Hopen OS是凯思集团自主研制开发的嵌入式操作系统,由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。其核心Hopen Kernel一般为10KB左右大小,占用空间小,并具有实时、多任务、多线程的系统特征。在众多的实时操作系统和嵌入式操作系统产品中,WindRiver公司的VxWorks是较为有特色的一种实时操作系统。VxWorks是目前嵌入式系统领域中使用最广泛、市场占有率最高的系统。VxWorks 支持各种工业标准,包括POSIX、ANSI C 和TCP/IP网络协议。同时支持多种处理器,如x86、i960、Sun Sparc、Motorola MC68xxx、MIPS RX000、POWER PC等等。大多数的VxWorks API是专有的。采用GNU的编译和调试器。VxWorks 运行系统的核心是一个高效率的微内核,该微内核支持各种实时功能,包括快速多任务处理、中断支持、抢占式和轮转式调度。目前在全世界装有VxWorks 系统的智能设备数以百万计,其应用范围遍及互联网、电信和数据通信等众多领域。开放源代码的嵌入式Linux操作系统无疑有着很大的优势。嵌入式Linux自身具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并且可以跨越在嵌入式系统开发中仿真工具(ICE)的障碍。内核的完全开放,使得可以自己设计和开发出真正的硬实时系统;对于软实时系统,在Linux中也容易得到实现。强大的网络支持,使得可以利用Linux的网络协议栈将其开发成为嵌入式的TCP/IP网络协议栈。1.1.4嵌入式系统软件的特点嵌入式处理器的应用软件是实现嵌入式系统功能的关键,对嵌入式处理器系统软件和应用软件的要求也和通用计算机有所不同。 1.软件要求固态化存储。为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。 2.软件代码高质量、高可靠性。尽管半导体技术的发展使处理器速度不断提高、片上存储器容量不断增加,但在大多数应用中,存储空间仍然是宝贵的,还存在实时性的要求。为此要求程序编写和编译工具的质量要高,以减少程序二进制代码长度、提高执行速度。 3.系统软件(OS)的高实时性是基本要求。在多任务嵌入式系统中,对重要性各不相同的任务进行统筹兼顾的合理调度是保证每个任务及时执行的关键,单纯通过提高处理器速度是无法完成和没有效率的,这种任务调度只能由优化编写的系统软件来完成,因此系统软件的高实时性是基本要求。 4.多任务操作系统是知识集成的平台和走向工业标准化道路的基础。1.2嵌入式开发概述1.2.1 嵌入式系统开发需要开发工具和环境 通用计算机具有完善的人机接口界面,在上面增加一些开发应用程序和环境即可进行对自身的开发。而嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。 1.2.2 嵌入式系统软件需要RTOS开发平台 通用计算机具有完善的操作系统和应用程序接口(API),是计算机基本组成不可分离的一部分,应用程序的开发以及完成后的软件都在OS平台上面运行,但一般不是实时的。嵌入式系统则不同,应用程序可以没有操作系统直接在芯片上运行;但是为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配RTOS开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量。 1.2.3 嵌入式系统开发人员以应用专家为主 通用计算机的开发人员一般是计算机科学或计算机工程方面的专业人士,而嵌入式系统则是要和各个不同行业的应用相结合的,要求更多的计算机以外的专业知识,其开发人员往往是各个应用领域的专家。因此开发工具的易学、易用、可靠、高效是基本要求。1.2.4嵌入式系统高级编程语言Ada语言是20世纪70年代美国国防部开发并投入使用的功能强大的通用系统开发语言,最初为Ada83。它支持模块化、独立编译、协处理等功能。其可靠性、可维护性、可读性都是相当好的。后来,为了更好地支持OOP(Object-Oriented Programming),对其进行了改进,形成了目前广泛使用的Ada95。使用Ada语言可以大大改善系统的清晰性、可靠性、可维护性等性能指标2,3。它是美国国防部指定的唯一一种可用于军用系统开发的语言。C语言是由Dennis Richie于1972年在AT&Bell实验室研究成功并投入使用的系统编程语言。其设计目标是使C既具有汇编语言的效率,又具有高级语言的易编程性。其最具代表性的应用是UNIX操作系统。从20世纪80年代中期C语言涉足实时系统后,受到了普遍欢迎。目前是使用最广泛的嵌入式系统编程语言。C+是由Bjarne Stroustrup 于1995年在Bell实验室研制成功并投入使用的。C+在支持现代软件工程、OOP、结构化等方面对C进行了卓有成效的改进,但在程序代码容量、执行速度、程序复杂程度等方面比C语言程序性能差一些。Modula-2是由Nicklans Wirth在70年代后期根据Pascal 和Modula开发的系统设计语言。其主要目标是在模块化、系统编程、协同处理等方面对Pascal 进行改进。Modula-2具有很强的类型检查能力和丰富的低级功能支持。因此,可用它设计一个完整的实时程序而不用汇编语言的支持。Modula-3是1988年由DEC(Digital Equipment Company)和ORC(Olivetti Research Center)根据Modula-2开发研制并投入使用的系统开发语言。目标是设计一个功能强大但结构简单的通用编程语言。它在协同处理、OOP、自动垃圾收集以及对C语言和UNIX的支持等方面对Modula-2进行了改进Java是网络语言,而嵌入式系统则在功能、价格、体积、功耗、上市时间等方面有特殊要求。因此Java语言受速度和代码容量的限制,本身并不适合于嵌入式系统的应用。但Sun公司并不愿意放弃这个发展潜力巨大的应用市场,对Java进行改进后发表了J2ME(Java2 Micro Edition)。它是Java API的一个子集,只包含了Java的关键特性,是专门针对对内存具有苛刻要求的嵌入式系统而设计的。J2ME粗略地将应用对象划分为两大类:内存在128KB512KB之间的设备和内存大于512KB的设备,根据不同的类别提供不同的用户接口和软件包。第2章ARM处理器结构和ARM指令集2.1ARM处理器结构ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,该企业设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省,适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。ARM处理器的框架如图2-1所示乘法器指令解码地址自增器nRESETnMREQSEQABORTnIRQnFIQnRWMAS1:0LOCKnCPICPACPBnWAITMCLKnOPCBIGENDISYNCnTRANSnM4:0桶形移位器32 位 ALU写数据 寄存器读数据 寄存器地址寄存器寄存器A31:0ABE及控制 逻辑PC Update解码站指令 解码IncrementerPCABusBBus 图2-1ARM处理器架构2.1.1寄存器和处理器模式1.ARM 有7个基本工作模式:User:非特权模式,大部分任务执行在这种模式。限制你的内存访问并且你不能直接读取硬件设备正常程序执行的模式FIQ:当一个高优先级(fast)中断产生时将会进入这种模式高速数据传输和通道处理IRQ:当一个低优先级(normal)中断产生时将会进入这种模式通常的中断处理Supervisor:当复位或软中断指令执行时将会进入这种模式供操作系统使用的一种保护模式Abort: 当存取异常时将会进入这种模式虚拟存储及存储保护Undef: 当执行未定义指令时会进入这种模式软件仿真硬件协处理器System: 使用和User模式相同寄存器集的特权模式特权级的操作系统任务(2)寄存器组在26位体系下,ARM 处理器有二十七个寄存器,其中一些是在一定条件下使用的,所以一次只能使用十六个。 寄存器 0 到寄存器 7 是通用寄存器并可以用做任何目的。不象 80x86 处理器那样要求特定寄存器被用做栈访问,或者象 6502 那样把数学计算的结果放置到一个累加器中,ARM 处理器在寄存器使用上是高度灵活的。 寄存器 8 到 12 是通用寄存器,但是在切换到 FIQ 模式的时候,使用它们的影子(shadow)寄存器。 寄存器 13 典型的用做 OS 栈指针,但可被用做一个通用寄存器。这是一个操作系统问题,不是一个处理器问题,所以如果你不使用栈,只要你以后恢复它,你可以在你的代码中自由的占用(corrupt)它。每个处理器模式都有这个寄存器的影子寄存器。 寄存器 14 专职持有返回点的地址以便于写子例程。当你执行带连接的分支的时候,把返回地址存储到 R14 中。同样在程序第一次运行的时候,把退出地址保存在 R14 中。R14 的所有实例必须被保存到其他寄存器中(不是实际上有效)或一个栈中。这个寄存器在各个处理器模式下都有影子寄存器。一旦已经保存了连接地址,这个寄存器就可以用做通用寄存器了。 寄存器 15 是程序计数器。它除了持有指示程序当前使用的地址的二十六位数之外,还持有处理器的状态。 为更清晰一些, 提供下列图表: User 模式 SVC 模式 IRQ 模式 FIQ 模式 APCSR0 - R0 - R0 - R0 a1R1 - R1 - R1 - R1 a2R2 - R2 - R2 - R2 a3R3 - R3 - R3 - R3 a4R4 - R4 - R4 - R4 v1R5 - R5 - R5 - R5 v2R6 - R6 - R6 - R6 v3R7 - R7 - R7 - R7 v4R8 - R8 - R8 R8_fiq v5R9 - R9 - R9 R9_fiq v6R10 - R10 - R10 R10_fiq slR11 - R11 - R11 R11_fiq fpR12 - R12 - R12 R12_fiq ipR13 R13_svc R13_irq R13_fiq spR14 R14_svc R14_irq R14_fiq lr- R15 / PC - pc最右侧的列是 APCS 代码使用的名字。APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自 C、 Pascal、也可以是用汇编语言写成的。 APCS 定义了: 对寄存器使用的限制。 使用栈的惯例。 在函数调用之间传递/返回参数。 可以被回溯的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给予的参数)的列表。程序计数器构造如下图2-2: 2731N Z C V Q2867I F T mode1623 815 54024fsxc U n d e f i n e dJ图2-2 程序计数器构造n 条件位:n N = 1-结果为负,0-结果为正或0n Z = 1-结果为0,0-结果不为0n C =1-进位,0-借位n V =1-结果溢出,0结果没溢出n Q 位:n 仅ARM 5TE/J架构支持n 指示增强型DSP指令是否溢出n J 位n 仅ARM 5TE/J架构支持n J = 1: 处理器处于Jazelle状态n 中断禁止位:n I = 1: 禁止 IRQ.n F = 1: 禁止 FIQ.n T Bitn 仅ARM xT架构支持n T = 0: 处理器处于 ARM 状态n T = 1: 处理器处于 Thumb 状态n Mode位(处理器模式位):n 0b10000Usern 0b10001FIQn 0b10010IRQn 0b10011Supervisorn 0b10111Abortn 0b11011Undefinedn 0b11111Systemn 当处理器执行在ARM状态:n 所有指令 32 bits 宽n 所有指令必须 word 对齐n 所以 pc值由bits 31:2决定, bits 1:0 未定义 (所以指令不能halfword / byte对齐).n 当处理器执行在Thumb状态:n 所有指令 16 bits 宽n 所有指令必须 halfword 对齐n 所以 pc值由bits 31:1决定, bits 0 未定义 (所以指令不能 byte对齐).n 当处理器执行在Jazelle状态:n 所有指令 8 bits 宽n 处理器执行 word 存取一次取4条指令2.2ARM指令集2.2.1ARM存贮访问指令ARM存贮访问指令如下表2-1: 表2-1 ARM存贮访问指令助记符说明操作条件码位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘法指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*RsUMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondS2.2.2数据处理指令数据处理指令如下表2-2 表2-2 数据处理指令助记符号说明操作条件码位置MOV Rd,operand2数据转送Rd-operand2MOV condSMVN Rd,operand2数据非转送Rd-(NOT)operand2MVN condSADD Rd,Rn,operand2加法运算指令Rd-Rn+operand2ADD condSSUB Rd,Rn,operand2减法运算指令Rd-Rn-operand2SUB condSRSB Rd,Rn,operand2逆向减法指令Rd-operand2-RnRSB condSADC Rd,Rn,operand2带进位加法Rd-Rn+operand2+carryADC condSRSC Rd,Rn,operand2带进位减法Rd-Rn-perand2-(NOT)CarryRSC condSAND Rd,Rn,operand2带进位逆向减法Rd-Rn&operand2AND condSORR Rd,Rn,operand2逻辑或操作指令Rd-Rn|operand2ORR condSEOR Rd,Rn,operand2逻辑异或操作指令Rd-Rnoperand2EOR condSBIC Rd,Rn,operand2位清除指令Rd-Rn(operand2)BIC condCMP Rd,Rn,operand2比较指令标志N、Z、C、V-Rn-operand2CMP condCMN Rd,Rn,operand2负数比较指令标志N、Z、C、V-Rn+operand2CMN condTST Rd,Rn,operand2位测试指令标志N、Z、C、V-Rn&operand2TST condTEQ Rd,Rn,operand2相等测试指令标志N、Z、C、V-Rnoperand2TEQ cond2.2.3乘法指令乘法指令如下表2-3:表2-3 乘法指令助记符说明操作条件码位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘法指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*RsUMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLALcondSSMLALcondSSMLALcondSSMLALcondS2.2.4 跳转指令跳转指令如下表2-4: 表2-4 跳转指令助记符说明操作条件码位置B label跳转指令PclabelBcondBL label带链接的跳转指令LRPC-4,PClabelBLcondRX Rm带状态切换的跳转指令PClable,切换处理状态BXcond2.2.5杂项指令杂项指令如下表2-5: 表2-5 杂项指令助记符说明操作条件码位置SWI immed_24软中断指令产生软中断,处理器进入管理模式SWIcondMRS Rd,psr读状态寄存器指令Rdpsr,psr为CPSR或SPSRMRScondMRS psr_fields,Rd/#immed_8r写状态寄存器指令Psr_fieldsRd/#immed_8r,psr为CPSR或SPSRMSRcond2.2.6Thumb指令集Thumb指令可以作是ARM指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16位的代码密度。Thumb不是一个完整的体系结构,不能指望处理只执行Thumb指令而不支持ARM指令集。Thumb指令集没有协处理器指令。ARM和Thumb之间切换使用BX 指令。 Thumb指令与ARM指令在实现上差别不大,在此就不再对Thumb指令集进行详细的介绍了。第3章C/OS-的移植3.1移植的要求和准备这一章介绍如何将C/OS-移植到不同的处理器上。所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。为了方便移植,大部分的C/OS-代码是用C语言写的;但仍需要用C和汇编语言写一些与处理器相关的代码,这是因为C/OS-在读写处理器寄存器时只能通过汇编语言来实现。由于C/OS-在设计时就已经充分考虑了可移植性,所以C/OS-的移植相对来说是比较容易的。C/OS-II功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制,现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是,C/OS-II公开所有的源代码,90%的代码使用标准的ANSI C语言书写,程序可读性强、移植性好;同时它可免费获得,即使商业应用也只收取少量的许可费用。因此,对C/OS-II实时操作系统的学习研究、开发、应用具有重要意义。要使C/OS-正常运行,处理器必须满足以下要求: 处理器的C编译器能产生可重入代码。 用C语言就可以打开和关闭中断。 处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。 处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令如果用户理解了处理器和C编译器的技术细节,移植C/OS-的工作实际上是非常简单的。前提是您的处理器和编译器满足了C/OS-的要求,并且已经有了必要工具。移植工作包括以下几个内容: 用#define设置一些常量的值(OS_CPU.H) 声明10个数据类型(OS_CPU.H) 用#define声明三个宏(OS_CPU.H) 用C语言编写六个简单的函数(OS_CPU_C.C) 编写四个汇编语言函数(OS_CPU_A.ASM)3.2移植具体过程3.2.1 C/OS-的软硬件结构体系Samsung S3C44B0X微处理器是三星公司专为手持设备和其它嵌入式应用提供的高性价比的微控制器解决方案。它使用ARM公司的16位/32位RISC结构,内核是ARM7TDMI,工作在66MHz,片上集成了以下部件:8K Cache、外部存储器控制器、LCD控制器、4个DMA通道、2个UART、1个多主I2C总线控制器、1个I2C总线控制器,以及5通道PWM定时器和1个内部定时器、8通道12位ADC等,能够与常用的外围设备实现无缝连接,功能强大。目前,国内应用较为广泛。C/OS-应用程序C/OS-处理器无关代码OS-CORE.C OS-Q.COS-MBOX.C OS-MEN.COS-TASK.C C/OS-.COS-TIME.C C/OS-.HOS-SEM.CC/OS-设置(应用相关)OS-CFG.HINCLUDES.HC/OS-处理器相关代码OS_CPU.H OS_CPU_A.ASMOS_CPU_C.CC/OS-编译器相关定义存储器系统时钟外围设备处 理 器图3-1 C/OS-软硬件体系结构 图3.1说明了C/OS-II的软硬件体系结构。应用程序处于整个系统的顶层,每个任务都可以认为自已独占了CPU,因而可以设计成为一个无限循环。C/OS-II处理器无关的代码提供了C/OS-II的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信及创建、删除任务等。大部分的C/OS-II代码是使用ANSI C语言书写的,因此C/OS-II的可移植性好,然而仍需要使用C和汇编语言写一些处理器相关代码。C/OS-II的移植需要满足以下要求:1.处理器的C编译器可以产生可重入代码;2.可以使用C调用进入和退出临界区代码;3.处理器必须支持硬件中断,并且需要一个定时中断源;4.处理器需要能够容纳一定数据的硬件堆栈;5.处理器需要有能够在CPU寄存器与内核和堆栈交换数据的指令。S3C44B0X处理器完全满足上述要求。3.2.2 实时内核C/OS-II在S3C44B0X上的移植我们使用ARM SDT编译器,移植C/OS-II主要包括以下几个步骤。1.设置OS_CPU.H中与处理器和编译器相关的代码*与编译器相关的数据类型*typedef unsigned char BOOLEAN;typedef unsigned char INT8U; /8位无符号整数typedef signed char INT8S; /8位有符号整数typedef unsigned short INT16U; /16位有符号整数typedef signed short INT16S; /16位无符号整数typedef unsigned long INT32U; /32位无符号整数typedef signed long INT32S; /32位有符号整数typedef float FP32; /单精度浮点数typedef double FP64; /双精度浮点数typedef unsigned int OS_STK; /*堆栈入口宽度为16位与ARM处理器相关的代码:*/#define OS_ENTER_CRITICAL () ARMEnableInt() /开启中断#define OS_STK_GROWTH 1 /堆栈由高地址向低地址增长2.用C语言编写6个操作系统相关的函数(OS_CPU_C.C)void OSTaskStkInit(void(task)(void *pd),void *pdata,void *ptos,INT16U opt) unsigned int *stk;opt =opt; /*因“opt”变量没有用到,防止编译器产生警告*/stk =(unsigned int *)ptos; /*装载堆栈指针*/*为新任务创建上下文*/*-stk=(unsigned int)task; /*lr*/*-stk=(unsigned int)task /*pc*/*-stk=0; /*r12*/*-stk=0; /*r11*/*-stk=0; /*r10*/*-stk=0; /*r9*/*-stk=0; /*r8*/*-stk=0; /*r7*/*-stk=0; /*r6*/*-stk=0; /*r5*/*-stk=0; /*r4*/*-stk=0; /*r3*/*-stk=0; /*r2*/*-stk=0; /*r1*/*-stk=(unsigned int)pdata; /*r0*/*-stk=(SVC32MODE|0x0|); /*cpsr IRQ,*-stk=(SVC32MODE|0x0); /*spsr IRQ,关闭FIQ*/return(void*)stk);后5个函数是钩子函数,可以不加代码:void OSTaskCreateHook(OS_TCB *ptcb)void OSTaksDelHool (OS_TCB *ptcb)void OSTaskSwHook(void)void OSTaskStatHook(void)(3)用汇编语言编写4个与处理器相关的函数(OS_CPU.ASM)OSStartHighRdy() ;运行优先级最高的就绪任务LDR r4,addr_OSTCBCur ;得到当前任务的TCB地址LDR r5,addr_OSTCBHighRdy ;得到高优先级任务的TCB地址LDR r5,addr_OSTCBHighRdy ;得到高优先级任务的TCB地址LDR r5,r5 ;得到堆栈指针LDR sp,r5 ;切换到新的堆栈STR r5,r4 ;设置新的当前任务的TCB地址LDMFD sp!,r4MSR CPSR_cxsf,r4LDMFD sp!,r0-r12,lr,pc ;开始新的任务ENDOSCtxsw() ;任务级的任务切换函数STMFD sp!,lr ;保存PC指针STMFD sp!,lr ;保存lr指针STMFD sp!,r0-r12 ;保存寄存器文件和返回地址MRS r4,CPSRSTMFD sp!,r4 ;保存当前PSRMRS r4,SPSRSTMFD sp!,r4;OSPrioCur=OSPrioHighRdyLDR r4,addr_OSPrioCurLDR r5,addr_OSPrioHighRdyLDRB r6,r5STRB r6,r4;得到当前任务的TCB地址LDR r4,addr_OSTCBCurLDR r5,r4STR sp,r5;保存栈指针在占先任务的TCB上;取得高优先级任务的TCB地址LDR r6,addr_OSTCBHighRdyLDR r6,r6LDR sp,r6;得到新任务的堆栈指针;OSTCBCur=OSTCBHighRdySTR r6,r4;得到当前新任务的TCB地址LDMFD sp!,r4MSR SPSR_cxsf,r4LDMFD sp!,r4MSR SPSR_cxsf,r4LDMFD sp!,r0-r12,lr pcOSIntCtxSw() ;中断级的任务切换函数LDMIA sp!,al-vl,lrSUBS pc,lr,#4SUB lr,lr,#4MOV r12,lrMRS lr,SPSRAND lr,lr,#0XFFFFFE0ORR lr,lr,#0XD3MSR CPSR_CXSF,lrOSTickISR();中断服务函数STMDB sp!,r0-r11,lrMRS r0,CPSRORR r0,r0,#0x80;设置中断禁止标志MSR CPSR_cxsf,r0 ;中断结束LDR r0,I_ISPCLDR r1,=BIT_TIMER0STR r1,r0BL IrqStartBL osTimeTickBL IrqFinishLDR r0,=need_to_swap_contextLDR R2,R0CMP r2,#1LDREQ pc,=_CON_SW完成上述工作后,C/OS-II就可以运行在ARM处理器上了。3.2.3 使用C/OS-II系统应注意的问题1.C/OS-II和Linux等分时操作系统不同,不支持时间片轮转法。它是一个基于优先级的实时操作系统。每一个任务的优先级必须不同(分析它的源码会发现,C/OS-II把任务的优先级当作任务在标识来使用,如果优先级相同,任务将无法区分)。进入就绪态的优先级最高的任务首先得到CPU的使用权,只有等它交出CPU的使用权后,其它任务才可以被执行。所以,它只能就是多任务,不能就是多进程,至少不是我们所熟悉的那种多进程。2.C/OS-II对共享资源提供了保护的机制。C/OS-II是一个支持多任务的操作系统。我们可以把一个完整的程序划分成几个任务,不同的任务执行不同的功能。对于共享资源(比如串口),C/OS-II也提供了很好的解决办法,一般情况下使用的是信号量方法。我们创建一个信号量并对它进行初始化,当一个任务需要使用一个共享资源时,它必须先申请得到这个信号量。在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到信号量,也不能使用该资源。在C/OS-II中称为优先级反转。简单地说,就是高优先级任务必须等待低优先级任务的完成。在上述情况下,在两个任务之间发生优先级后转是无法避免的。所以不在使用C/OS-II时,必须对所开发的系统了解清楚才能选择对于某种共享资源是否使用信号量。3.C/OS-II内存管理不够完善。在分析许多C/OS-II的应用实例中发现,任务栈空间和内存分区的创建采用了定义全局数组的方法,这样实现起来固然简单,但不够灵活有效。编译器会将全局数组作为未初始化的全局变量,放到应用程序映像的数据段。数组的大小是固定的,生成映像后不可能在使用中动态地改变。对于任务栈空间来说,数组定义大了会造成内存浪费;定义小了任务栈溢出,会造成系统崩溃。对于内存分区,在不知道系统初始化后给用户留下了多少自由内存空间的情况下,很难定义内存分区所使用数组的大小。此外,现在C/OS-II只支持固定大小的内存分区,容易造成内存浪费。C/OS-II将来应该被改进以支持可变大小的内存分区。因此,系统初始化后能清楚地掌握自由内存空间的情况是很重要的。所以,应避免使用全局数组分配内存空间,关键是要知道整个应用程序在编译、链接后代码段和数据段的大小,在目标板内存中是如何定位,以及目标板内存的大小。第4章网络转串口驱动的开发4.1Lwip在C/OS-上的移植4.1.1开源TCP/IP协议栈LwIP简介随着嵌入式系统与网络的日益结合,在嵌入式实时操作系统中引入TCP/IP协议栈,以支持嵌入式设备接入网络,成为嵌入式领域重要的研究方向。uC/0S II是近年来发展迅速的一个开放源码实时操作系统,但它只是一个实时的任务调度及通信内核,缺少对外围设备和接口的支持,如没有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025福建龙岩市上杭县文化旅游发展有限公司(上杭古田建设发展有限公司)所属企业招聘拟聘用人选(二)模拟试卷及答案详解(必刷)
- 2025北京市场监管总局直属单位招聘210人模拟试卷及答案详解(必刷)
- 2025辽宁沈阳盛京资产管理集团有限公司所属子公司沈阳国际陆港集团有限责任公司拟聘用人员模拟试卷参考答案详解
- 安全培训效果验证表课件
- Ifebemtinib-tosylate-BI-853520-tosylate-生命科学试剂-MCE
- 装修复原工程现场现场施工协议模板模板协议模板合同7篇
- 2025福建龙岩市上杭县文化旅游发展有限公司(上杭古田建设发展有限公司)所属企业招聘拟聘用人选(二)模拟试卷及答案详解(全优)
- 2025年河北沧州泊头市中医医院招聘专业技术人员29名考前自测高频考点模拟试题附答案详解(典型题)
- 2025贵州罗甸县第一医共体沫阳分院招聘合同制专业技术人员考前自测高频考点模拟试题及一套答案详解
- 线上社群行业技术规范与发展
- 2025至2030年中国局部UV油墨行业投资前景及策略咨询报告
- 公积金补贴协议书
- 2025年中国眼视光行业发展深度分析与未来前景研究报告
- 科研机构安全标准化工作方案
- 2025年中小学心理健康教育考试试题及答案
- 2025-2030中国MLCC粉末行业市场发展趋势与前景展望战略研究报告
- 无人机吊装作业安全管理
- 试用期转正考核表(设计部)
- 2025年江西工业工程职业技术学院单招职业技能测试题库完美版
- 2025年经综396真题试及参考答案
- 2025年电信人工智能学习考试题库(含答案)
评论
0/150
提交评论