dA六、嵌入式系统初始化与操作系统的移植ppt课件_第1页
dA六、嵌入式系统初始化与操作系统的移植ppt课件_第2页
dA六、嵌入式系统初始化与操作系统的移植ppt课件_第3页
dA六、嵌入式系统初始化与操作系统的移植ppt课件_第4页
dA六、嵌入式系统初始化与操作系统的移植ppt课件_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

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

文档简介

1、1嵌入式系统设计与实例开发嵌入式系统设计与实例开发基于基于32位微处置器与实时位微处置器与实时操作系统操作系统第六讲系统初始化分析与第六讲系统初始化分析与C/OS-移植移植2本节提要本节提要嵌入式系统的初始化嵌入式系统的初始化 C/OS-的移植的移植3初始化程序的下载执行MPUBOOT ROMRAM下载工具串口JTAG网口目的机目的机宿主机宿主机1 1经过编程器将可执行目的文件烧写到经过编程器将可执行目的文件烧写到BootROMBootROMROMROM、EPROMEPROM、FLASHFLASH等;等;2 2经过串行口和网口下载执行目的文件,经过串行口和网口下载执行目的文件,要求宿主机系统上

2、有数据传输工具程序、目要求宿主机系统上有数据传输工具程序、目的机装载器、嵌入式监视器或目的机系统上的机装载器、嵌入式监视器或目的机系统上的调试代理。的调试代理。3 3经过经过JTAGJTAG或或BDMBDM接口下载;接口下载;4嵌入式系统的初始化过程复位向量最小硬件初始化其余硬件初始化RTOS初始化RTOS部件初始化启动RTOS启动应用程序1234567硬件初始化RTOS初始化软件初始化最小启动代码BSPRTOS应用程序5嵌入式系统的初始化过程复位向量最小硬件初始化其余硬件初始化123最小启动代码BSP硬件初始化阶段硬件初始化阶段1、复位向量、复位向量 ENTRY b ResetHandler

3、 ;for debug b HandlerUndef ;handlerUndef b HandlerSWI ;SWI interrupt handler b HandlerPabort ;handlerPAbort b HandlerDabort ;handlerDAbort b . ;handlerReserved b HandlerIRQ b HandlerFIQ6嵌入式系统的初始化过程2复位向量最小硬件初始化其余硬件初始化123最小启动代码BSP硬件初始化阶段硬件初始化阶段2 2、最小硬件初始化、最小硬件初始化1 1设置适当的存放器,使嵌入式处置设置适当的存放器,使嵌入式处置器处于一个知

4、的形状:器处于一个知的形状:获得获得CPUCPU的类型;的类型;获得或设置获得或设置CPUCPU的时钟频率。的时钟频率。2 2制止中断和高速缓存制止中断和高速缓存3 3初始化内存控制器、内存芯片和高初始化内存控制器、内存芯片和高速缓存单元,包括:速缓存单元,包括:得到内存的开场地址;得到内存的开场地址;得到内存的大小;得到内存的大小;假设有要求,那么还需求进展主存测试;假设有要求,那么还需求进展主存测试;7嵌入式系统的初始化过程3复位向量最小硬件初始化其余硬件初始化123最小启动代码BSP硬件初始化阶段硬件初始化阶段3 3、其他硬件初始化、其他硬件初始化1 1引导代码调用适宜的函数对目的机引导

5、代码调用适宜的函数对目的机系统上的全部硬件部件进展初始化,包系统上的全部硬件部件进展初始化,包括:括:建立执行处置程序建立执行处置程序初始化中断处置程序初始化中断处置程序初始化总线接口初始化总线接口初始化板级外设得到内存的开场地址;初始化板级外设得到内存的开场地址;8嵌入式系统的初始化过程4RTOS初始化阶段初始化阶段4 4、RTOSRTOS初始化初始化1 1RTOSRTOS初始化初始化2 2RTOSRTOS对象和效力初始化对象和效力初始化义务义务信号量信号量定时器定时器中断中断内存管理内存管理3 3RTOSRTOS义务堆栈初始化义务堆栈初始化4 4RTOSRTOS扩展部件初始化扩展部件初始化

6、5 5启动启动RTOSRTOSRTOS初始化RTOS部件初始化启动RTOS456RTOS初始化RTOS9嵌入式系统的初始化过程5运用程序初始化阶段运用程序初始化阶段4 4、运用程序初始化、运用程序初始化启动应用程序7软件初始化应用程序10ARM系统初始化的普经过程启动系统上电启动系统上电/ /复位复位从程序入口点从程序入口点初始化时钟等硬件相关存放器初始化时钟等硬件相关存放器1 1、设定、设定PLLPLL2 2、关中断、关中断3 3、设置其它存放器、设置其它存放器初始化存储器系统初始化存储器系统FlashFlash及及SDRAMSDRAM参数设置参数设置初始化初始化C C所需求的存储器空间所需

7、求的存储器空间调用调用C C入口函数入口函数堆栈初始化堆栈初始化11一、设置程序入口指针l上电复位后直接到程序入口点执行,入口点普通为一个跳转表,跳转到复位处置程序处开场执行ARM系统的初始化;l启动程序首先必需定义入口指针,而且整个运用程序只需一个入口指针l例:AREA Boot,CODE,READONLYl ENTRY /*设置程序入口指针*/12二、设置中断向量lARM要求中断向量必需设置在从OX00000000地址开场,延续8*4字节的地址空间;l向量表包含一系列跳转指令,跳转到相应的中断效力程序;l对各未用中断,使其指向一个含前往指令的哑函数,以防止错误中断引起系统的混乱;13中断向

8、量表FIQ0 x1C外部快速中断IRQ0 x18普通外部中断(Reserved)0 x14保管Data Abort0 x10数据异常Frefetch Abort0 x0C预取指异常Software int0 x08软件中断Undef0 x04未定义指令中断Reset0 x00复位中断14中断向量表的程序AREA Boot,CODE,READONLYAREA Boot,CODE,READONLYENTRYENTRYB Reset_handlerB Reset_handlerB Undef_HandlerB Undef_HandlerB SWI_HandlerB SWI_HandlerB PreA

9、bort_HandlerB PreAbort_HandlerB . ;for reserved interrupt,stop hereB . ;for reserved interrupt,stop hereB IRQ_handlerB IRQ_handlerB FIQ_handlerB FIQ_handler15三、初始化时钟和设置相关的存放器l经过设置时钟控制器来确定CPU的任务频率,设置中断控制存放器屏蔽中断l设置看门狗控制存放器,封锁看门狗l封锁Cache16四、初始化存储器系统存储器类型和时序配置(参考芯片手册,设置与内存映射相关的存放器)一个复杂的系统能够存在多种存储器类型的接口,

10、需求根据实践的系统设计对此加以正确配置。对同一种存储器类型来说,也由于访问速度的差别,需求不同的时序设置。通常Flash 和SRAM 同属于静态存储器类型,可以合用同一个存储器端口;而DRAM 由于动态刷新和地址线复用等特性,通常配有公用的存储器端口。存储器端口的接口时序优化是非常重要的,影响到整个系统的性能。由于普通系统运转的速度瓶颈都存在于存储器访问,所以存储器访问时序应尽能够地快;但同时又要思索由此带来的稳定性问题。只需根据详细选定的芯片,进展多次的测试之后,才干确定最正确的时序配置。17存储器地址分布l有些系统具有非常灵敏的存储器地址分配特性,进展存储器初始化设计的时候一定要根据运用程

11、序的详细要求来完成地址分配。l一种典型的情况是启动ROM 的地址重映射remap。当一个系统上电后程序将自动从0 地址处开场执行,因此在系统的初始形状,必需保证在0 地址处存在正确的代码,即要求0 地址开场处的存储器是非易性的ROM 或Flash 等。但是由于ROM 或Flash 的访问速度相对较慢,每次中断发生后都要从读取ROM 或Flash 上面的向量表开场,影响了中断呼应速度。因此有的系统便提供一种灵敏的地址重映射方法,可以把0 地址重新指向到RAM 中去。在这种地址映射的变化过程当中,程序员需求仔细思索的是程序的执行流程不能被这种变化所打断。18ROM地址的重映射(remap)0 x0

12、200boot code)0 x0100(Reset_handler)B Reset_Handler0 x0000Flash(remap)0 x0204boot code)0 x0200(Reset_handler)B Reset_Handler0 x0000RAM19ROM地址重映射的实现地址重映射的实现mov r8,#RAM_BASE_BOOT/RAM_BASE_BOOT是重映射是重映射前内部前内部RAM区地址区地址 add r9, pc #VectorTale /VectorTale是异常向量表入口是异常向量表入口ldmia r9!, r0-r7 /读读8个异常向量个异常向量 stmia

13、 r8!, r0-r7 /保管保管8个异常向量到个异常向量到RAM区区ldmia r9!, r0-r4 /读读5个异常处置程序绝对地址个异常处置程序绝对地址stmia r8!, r0-r4 /保管保管5个异常处置程序绝对地址到个异常处置程序绝对地址到RAM区区 为保证重映射之后提供正确的中断入口地址,在重映射之前就必为保证重映射之后提供正确的中断入口地址,在重映射之前就必需把中断和异常向量表拷贝到内部需把中断和异常向量表拷贝到内部RAMRAM中。其程序实现如下:中。其程序实现如下:20五、初始化堆栈lARM处置器有好几种运转形状方式,各种形状都需求有本人的堆栈,所以需求分别为这些堆栈分配空间并

14、设置好各自的堆栈指针l每一种形状的堆栈指针存放器SP都是独立的System 和User 方式运用一样的SP 存放器。因此对程序中需求用到的每一种方式都要给SP 存放器定义一个堆栈地址。方法是改动形状存放器CPSR内的形状位,使处置器切换到不同的形状,然后给SP 赋值。留意不要切换到User方式进展User 方式的堆栈设置,由于进入User 方式后就不能再操作CPSR 回到别的方式了。能够会对接下去的程序执行呵斥影响。l普通堆栈的大小要根据需求而定,但是要尽能够给堆栈分配快速和高带宽的存储器。堆栈性能的提高对系统整体性能的影响是非常明显的。21堆栈初始化代码例如MRS R0, CPSR ; CP

15、SR - R0BIC R0, R0, #MODEMASK ; 平安起见,屏蔽方式位以外的其它位平安起见,屏蔽方式位以外的其它位ORR R1, R0, #IRQMODE ; 把处置器方式位设置成把处置器方式位设置成IRQ方式方式MSR CPSR_cxsf, R1 ; 转到转到IRQ 方式方式LDR SP, =IRQStack ; 设置设置SP_irqORR R1,R0,#FIQMODEMSR CPSR_cxsf, R1 ; FIQModeLDR SP, =FIQStackORR R1, R0, #SVCMODEMSR CPSR_cxsf, R1 ; SVCModeLDR SP, =SVCStac

16、k22六、初始化C环境1l在目的文件中,代码、数据放在不同的段中。源文件编译链接生成含.data、.text段的目的文件,且链接器生成的.data段是以系统RAM为参考地址。l故在系统启动时需求拷贝ROM或FLASH中的.data段到RAM,以完成对RAM的初始化。在初始化期间应将系统需求读写的数据和变量从ROM拷贝到RAM里运转。23了解衔接器的功能l将许多放在不同文件中的目的码,衔接成一个可执行文件;l计算及分配位于不同区段Session)的程序或数据。一个程序可分为程序段Read-Only,RO)、数据段Read-Write,RW)、零初始化段Zero-Initialized,ZI);l

17、编译器仅将程序转成机器码,不会处置与内存地址有关的部分,这部分任务由衔接器完成;l衔接器产生带定位地址的可执行二进制目的文件。l衔接器主要用于处置内存地址分配问题24链接器产生的符号表l符号由链接器自动产生,只读段read-only RO就是代码段,读写段read-write RW是曾经初始化的全局变量,而零初始化段zero-initialized section ZI中存放未初始化的全局变量;25初始化运用程序执行环境l映像一开场总是存储在映像一开场总是存储在ROM/Flash ROM/Flash 里面的,其里面的,其RO RO 部分既可部分既可以在以在ROM/FlashROM/Flash里

18、面执行,也可以转移到速度更快的里面执行,也可以转移到速度更快的RAM RAM 中中去;而去;而RW RW 和和ZI ZI 这两部分那么必需转移到可写的这两部分那么必需转移到可写的RAM RAM 里去里去进展访问。进展访问。l所谓运用程序执行环境的初始化,就是完成必要的从所谓运用程序执行环境的初始化,就是完成必要的从ROM ROM 到到RAM RAM 的数据传输和内容清零。的数据传输和内容清零。26初始化C环境2lC环境初始化,就是利用上述符号初始化RW和ZI段,以使后面运用全局变量的C程序正常运转;l这里有两个循环,第一个循环把预初始化的数据段RW位于代码段的后面复制到RAM中;另一个循环把未

19、初始化的数据段ZI初始化为0,也就是实现把从ROM中的.data段拷贝到RAM,对ZI段内的数据初始化为0,以完成对C环境的实始化;27初始化C环境328改动处置器方式l除用户方式以外,其他除用户方式以外,其他6 6 种方式都是特权方式。由于在种方式都是特权方式。由于在初始化过程中许多操作需求在特权方式下才干进展比初始化过程中许多操作需求在特权方式下才干进展比如如CPSR CPSR 的修正,所以要特别留意不能过早地进入用的修正,所以要特别留意不能过早地进入用户方式。普通地,在初始化过程中会阅历以下一些方式户方式。普通地,在初始化过程中会阅历以下一些方式变化:变化:29七、呼叫C程序l对main

20、函数的调用是进入C主程序或uc/OS的入口,经过这个入口就可进入C主程序或uC/OS的启动程序,完成运用程序的执行或uC/OS的启动。l例l IMPORT Mainl b Main ;C Entry30uC/OS系统的初始化1lARM9系统的初始化l1、关WATCH DOG l2、制止一切中断 l3、初始化系统时钟 l4、初始化内存控制存放器l5、检查能否从掉电方式唤醒 l6、点亮一切LED l7、初始化UART0l8、将vivi一切代码从nand flash复制到SDRAM中 l9、跳到init程序,然后转到main函数l完成了前面的ARM9系统硬件初始化和运转环境的相关设置后,进入Main

21、(), Main()是uC/OS的入口函数,启动对uC/OS的初始化。31ARM的硬件笼统层uHALlARM公司为操作系统的开发提供了一个硬件笼统层HAL,称为uHAL;l从构造上看,uHAL是一组库程序,需求阐明的是,uHAL并不是专门为uC/OS预备的,甚至也不是专为操作系统内核预备的;luHAL只是个针对ARM核的函数库;luC/OS是建立在uHAL的根底之上的;32uC/OS系统的初始化233ARMTargetInit()函数构造ARMTargetInit()ARMTargetInit()调调uHALuHAL打印接口打印系统信息打印接口打印系统信息调用调用uHALuHAL函数制止一切中

22、断函数制止一切中断调用调用uHALuHAL函数对中断初始化函数对中断初始化uHALuHAL函数对函数对ARMARM定时器初始化定时器初始化终了终了34uHAL的功能luHAL的作用之一是在操作系统本身进入正常运转之前,为系统提供根本的输入输出手段,例如uHALr_printf()等;luHAL还要为操作系统的运转预备一个根本的运转环境,详细包括以下各种初始化:l经过uHAL_ResetMMU(),将MMU设置在一个确定的初始形状;l经过ARMDisable()封锁中断;l经过uHAL_InitInterrupts()设置中断向量处置程序;l经过uHAL_InitTimer()对系统运用的定时器

23、进展初始化35ARMTargetStart()的分析l创建了义务之后,ARMTargetStart()调用uHALr_InstallSystemTimer()创建一个系统时钟,为时钟中断做好预备;36C/OS-II BSP编写编写BSPBSP板级支持包是介于底层硬件和操作系统之间的软件层次,它板级支持包是介于底层硬件和操作系统之间的软件层次,它完成系统上电后最初的硬件和软件初始化,并对底层硬件进展封完成系统上电后最初的硬件和软件初始化,并对底层硬件进展封装,使得操作系统不再面对详细的操作。装,使得操作系统不再面对详细的操作。BSPBSP的特点:的特点:硬件相关性:由于嵌入式实时系统的硬件环境具

24、有运用相关性,所硬件相关性:由于嵌入式实时系统的硬件环境具有运用相关性,所以,作为高层软件与硬件之间的接口,以,作为高层软件与硬件之间的接口,BSPBSP必需为操作系统提供操必需为操作系统提供操作和控制详细硬件的方法。作和控制详细硬件的方法。操作系统相关性:不同的操作系统具有各自的软件层次构造,因此操作系统相关性:不同的操作系统具有各自的软件层次构造,因此,不同的操作系统具有特定的硬件接口方式。,不同的操作系统具有特定的硬件接口方式。37BSPBSP的功能的功能l嵌入式系统初始化嵌入式系统初始化l A A、片级初始化、片级初始化l B B、板级初始化、板级初始化l C C、系统级初始化、系统级

25、初始化l硬件相关的设备驱动程序硬件相关的设备驱动程序 38嵌入式系统始化嵌入式系统始化1 1片级初始化:主要完成微处置器的初始化,片级初始化:主要完成微处置器的初始化, 包括设置微处置器包括设置微处置器的中心存放器和控制存放器,微处置器中心任务方式以及其部分的中心存放器和控制存放器,微处置器中心任务方式以及其部分总线方式等。片级初始化把微处置器从上电时的缺省形状逐渐设总线方式等。片级初始化把微处置器从上电时的缺省形状逐渐设置成为系统所要求的任务形状。这是一个纯硬件的初始化过程置成为系统所要求的任务形状。这是一个纯硬件的初始化过程2 2板级初始化:完成微处置器以外的其他硬件设备的初始化。除此板级

26、初始化:完成微处置器以外的其他硬件设备的初始化。除此之外,还要设置某些软件的数据构造和参数,为随后的系统级初之外,还要设置某些软件的数据构造和参数,为随后的系统级初始化和运用程序的运转建立硬件和软件环境。这是一个同时包含始化和运用程序的运转建立硬件和软件环境。这是一个同时包含软硬件两部分在内的初始化过程。软硬件两部分在内的初始化过程。3 3系统级初始化:这是一个以软件初始化为主的过程,系统级初始化:这是一个以软件初始化为主的过程, 主要进展主要进展操作系统初始化。操作系统初始化。BSPBSP将控制转交给操作系统,将控制转交给操作系统, 由操作系统进展由操作系统进展余下的初始化操作。包括加载和初

27、始化与硬件无关的设备驱动程余下的初始化操作。包括加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,比如网序,建立系统内存区,加载并初始化其他系统软件模块,比如网络系统、文件系统等;最后,操作系统创建运用程序环境并将控络系统、文件系统等;最后,操作系统创建运用程序环境并将控制转交给运用程序的入口制转交给运用程序的入口39嵌入式系统初始化过程及BSP功能40完成硬件相关的设备驱动1 1BSPBSP另一个主要功能是硬件相关的设备驱动。与初始化过程相反另一个主要功能是硬件相关的设备驱动。与初始化过程相反,硬件相关的设备驱动程序的初始化和运用通常是一个从高层究,硬件相关

28、的设备驱动程序的初始化和运用通常是一个从高层究竟层的过程。虽然竟层的过程。虽然BSP BSP 中包含硬件相关的设备驱动程序,但是这中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由些设备驱动程序通常不直接由BSPBSP运用,而是在系统初始化过程中运用,而是在系统初始化过程中由由BSP BSP 把它们与操作系统中通用的设备驱动程序关联起来,并在把它们与操作系统中通用的设备驱动程序关联起来,并在随后的运用中由通用的设备驱动程序调用,实现对硬件设备的操随后的运用中由通用的设备驱动程序调用,实现对硬件设备的操作。作。2 2设计与硬件相关的驱动程序是设计与硬件相关的驱动程序是BSPBSP设计

29、中另一个关键环节设计中另一个关键环节41系统调用通用设备驱动程序与BSP的关系42本节提要本节提要嵌入式系统的初始化嵌入式系统的初始化 C/OS-的移植的移植43操作系统移植的概念l所谓操作系统的移植,是指使一个实时操作系统可以在所谓操作系统的移植,是指使一个实时操作系统可以在某个微处置器平台上运转。某个微处置器平台上运转。lCOS-IICOS-II的主要代码都是由规范的的主要代码都是由规范的C C言语写成的,移植言语写成的,移植方便。方便。l移植的主要任务是修正部分与处置器硬件相关的代码。移植的主要任务是修正部分与处置器硬件相关的代码。44移植的层次操作系统的移植大体可以分为两个层次:操作系

30、统的移植大体可以分为两个层次:跨体系构造的移植跨体系构造的移植针对特定处置器的移植针对特定处置器的移植45移植COS-II满足的条件 l处置器的处置器的C C编译器能产生可重入代码编译器能产生可重入代码 l在程序中可以翻开或者封锁中断在程序中可以翻开或者封锁中断 l处置器支持中断,并且能产生定时中断通常在处置器支持中断,并且能产生定时中断通常在10100Hz10100Hz之间之间 l处置器支持可以包容一定量数据的硬件堆栈处置器支持可以包容一定量数据的硬件堆栈 l处置器有将堆栈指针和其他处置器有将堆栈指针和其他CPUCPU存放器存储和读出存放器存储和读出到堆栈或者内存的指令到堆栈或者内存的指令

31、46什么是可重入代码 l可重入的代码指的是一段代码比如:一个函数可可重入的代码指的是一段代码比如:一个函数可以被多个义务同时调用,而不用担忧会破坏数据。以被多个义务同时调用,而不用担忧会破坏数据。l也就是说,可重入型函数在任何时候都可以被中断执也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运转,而不会由于在行,过一段时间以后又可以继续运转,而不会由于在函数中断的时候被其他的义务重新调用,影响函数中函数中断的时候被其他的义务重新调用,影响函数中的数据。的数据。 47可重入代码举例程序程序1 1:可重入型函数:可重入型函数void swap(int void swap(

32、int * *x, int x, int * *y)y) int temp;int temp;temp=temp=* *x;x;* *x=x=* *y;y;* *y=temp;y=temp; 48非可重入代码举例程序程序2 2:非可重入型函数:非可重入型函数int temp;int temp;void swap(int void swap(int * *x, int x, int * *y)y) temp=temp=* *x;x;* *x=x=* *y;y;* *y=temp;y=temp; 前往49不可重入函数被中断破坏50如何使函数具有可重入性 使使Swap()Swap()函数具有可重入性

33、:函数具有可重入性:把把TempTemp定义为部分变量;定义为部分变量;调用调用Swap()Swap()函数之前关中断,调动后再开中断;函数之前关中断,调动后再开中断;用信号量制止该函数在运用过程中被再次调用;用信号量制止该函数在运用过程中被再次调用;51翻开/封锁中断 在在COS-IICOS-II中,可以经过:中,可以经过:OS_ENTER_CRITICAL() OS_ENTER_CRITICAL() OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统封锁或者翻开中断。这需求处置器的支持。宏来控制系统封锁或者翻开中断。这需求处置器的支持。在在ARM7TDMI

34、ARM7TDMI的处置器上,可以设置相应的存放器来封锁或者翻开的处置器上,可以设置相应的存放器来封锁或者翻开系统的一切中断。系统的一切中断。 52处置器支持中断并且能产生定时中断 l COS-IICOS-II是经过处置器产生的定时器的中断来实现多是经过处置器产生的定时器的中断来实现多义务之间的调度的。义务之间的调度的。lARM9ARM9的处置器上可以产生定时器中断。的处置器上可以产生定时器中断。53处置器支持硬件堆栈 l COS-IICOS-II进展义务调度的时候,会把当前义务的进展义务调度的时候,会把当前义务的CPUCPU存放存放器存放到此义务的堆栈中,然后,再从另一个义务的堆器存放到此义务

35、的堆栈中,然后,再从另一个义务的堆栈中恢复原来的任务存放器,继续运转另一个义务。所栈中恢复原来的任务存放器,继续运转另一个义务。所以,存放器的入栈和出栈是以,存放器的入栈和出栈是 COS-IICOS-II多义务调度的根底。多义务调度的根底。 lARM9ARM9处置器中有专门的指令处置堆栈,可以灵敏的运用处置器中有专门的指令处置堆栈,可以灵敏的运用堆栈。堆栈。54移植对开发工具的要求 l移植移植 COS-IICOS-II需求一个规范的需求一个规范的C C交叉编译器;交叉编译器;l由于移植时需求对由于移植时需求对CPUCPU的存放器进展操作,所以需求的存放器进展操作,所以需求C C交交叉编译器可以

36、支持汇编言语程序;叉编译器可以支持汇编言语程序;l嵌入式嵌入式C C编译器普通都包括汇编器、链接器和定位器。链编译器普通都包括汇编器、链接器和定位器。链接器是用来将不同的模块编译或汇编过的文件链接接器是用来将不同的模块编译或汇编过的文件链接成目的文件;定位器那么允许将代码和数据放置在目的成目的文件;定位器那么允许将代码和数据放置在目的处置器的指定内存空间中;处置器的指定内存空间中;55移植uCOS-II要点(1)开关中断的方式。引荐运用开关中断的方式。引荐运用method3method3 #if OS_CRITICAL_METHOD = 3#if OS_CRITICAL_METHOD = 3O

37、S_CPU_SR cpu_sr;OS_CPU_SR cpu_sr;#endif#endif OS_ENTER_CRITICAL(); OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL(); OS_EXIT_CRITICAL(); 56运用method3方式的开关中断#define OS_ENTER_CRITICAL() cpu_sr = INTS_OFF(); #define OS_EXIT_CRITICAL() if(cpu_sr = 0) INTS_ON(); 57ARM的中断方式l设备的中断在设备的中断在ARMARM中被映射到了两个异常中中被映射到了两个异常中F

38、IQFIQ和和IRQIRQl经过控制经过控制CPSRCPSR中的对应数据位,可以开启或者封锁中中的对应数据位,可以开启或者封锁中断断l为了方便和一致为了方便和一致uCOS-IIuCOS-II系统中断的处置,只运用了系统中断的处置,只运用了IRQIRQ方式的中断。方式的中断。58移植uCOS-II要点(2)系统中断的处置l一切中断的调用都需求经过系统的接纳。中断处置函数一切中断的调用都需求经过系统的接纳。中断处置函数调用前后需求通知系统。例如:调用前后需求通知系统。例如:lOSIntEnter();lyourInterruptFun();lOSIntExit();59OSIntExit的意义的意

39、义60ARM的任务方式lARMARM处置器有处置器有7 7种操作方式种操作方式: :l用户方式用户方式(usr)(usr)l - - 正常的程序执行方式正常的程序执行方式l快速中断方式快速中断方式(fiq) (fiq) - - 支持高速数据传输或通道处置支持高速数据传输或通道处置l中断方式中断方式(irq) (irq) - - 用于通用中断处置用于通用中断处置l管理员方式管理员方式(svc) (svc) - - 操作系统的维护方式操作系统的维护方式. .l中止方式中止方式(abt) (abt) - - 支持虚拟内存和支持虚拟内存和/ /或内存维护等异常或内存维护等异常l系统方式系统方式(sys

40、) (sys) - - 支持操作系统的特殊用户方式支持操作系统的特殊用户方式( (运转操作系统义务运转操作系统义务l未定义方式未定义方式(und) (und) - - 支持硬件协处置器的软件仿真支持硬件协处置器的软件仿真 l除了用户方式外,其他方式均可视为特权方式除了用户方式外,其他方式均可视为特权方式61ARM的存放器1l3737个存放器个存放器l31 31 个通用个通用3232位存放器,包括程序计数器位存放器,包括程序计数器PCPCl6 6 个形状存放器个形状存放器l1515个通用存放器个通用存放器 (R0 to R14), (R0 to R14), 以及以及2 2个形状存放器和程序计数器

41、个形状存放器和程序计数器PCPC在任何时候都中可见的在任何时候都中可见的l可见的存放器取决于处置器的方式,不同的方式映射了不同的任可见的存放器取决于处置器的方式,不同的方式映射了不同的任务存放器务存放器62ARM存放器的组织注注:阐明用户或系统方式运用的正常存放器曾经被异常阐明用户或系统方式运用的正常存放器曾经被异常方式指定的另一个存放器取代方式指定的另一个存放器取代63ARM的存放器2lR0 R0 到到 R15 R15 可以直接访问可以直接访问lR0 R0 到到 R14 R14 是通用存放器是通用存放器lR13: R13: 堆栈指针堆栈指针 (sp) ( (sp) (通常通常) )l每种处置

42、器方式都有单独的堆栈每种处置器方式都有单独的堆栈lR14: R14: 链接存放器链接存放器 (lr) (lr)lR15R15:程序计数器:程序计数器 (PC) (PC)lCPSR CPSR 当前程序形状存放器,包括代码标志形状和当前方式位当前程序形状存放器,包括代码标志形状和当前方式位l5 5个个SPSR-(SPSR-(程序形状保管存放器程序形状保管存放器) ) 当异常发生时保管当异常发生时保管CPSRCPSR形状形状64uCOS-II在ARM上的义务切换l义务级的义务切换l中断级的义务切换65中断处置过程66OSIntExit()void OSIntExit (void) OS_ENTER_

43、CRITICAL(); (1) if (-OSIntNesting | OSLockNesting) = 0) (2) OSIntExitY = OSUnMapTblOSRdyGrp; (3) OSPrioHighRdy = (INT8U)(OSIntExitY OSTCBStkPtr = Stack pointer; 调用用户定义的调用用户定义的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢复的任务的堆栈指针得到需要恢复的任务的堆栈指针: Stack pointer = OSTCBHighRd

44、y-OSTCBStkPtr; 将所有处理器寄存器从新任务的堆栈中恢复出来将所有处理器寄存器从新任务的堆栈中恢复出来; 执行中断返回指令执行中断返回指令;89OS_TASK_SW ():义务级的义务切换函数1OS_TASK_SWSTMFD sp!, pc ; 保管保管 pcSTMFD sp!, lr; 保管保管 lrSTMFD sp!, r0-r12; 保管存放器保管存放器MRS r4, CPSRSTMFD sp!, r4; 保管当前的保管当前的PSRMRS r4, SPSRSTMFD sp!, r4; 保管保管SPSR; OSPrioCur = OSPrioHighRdyLDR r4, add

45、r_OSPrioCurLDR r5, addr_OSPrioHighRdyLDRBr6, r5STRBr6, r490OS_TASK_SW():义务级的义务切换函数2; 得到当前义务得到当前义务TCB地址地址LDRr4, addr_OSTCBCurLDRr5, r4STRsp, r5; 保管保管sp到被占先的义务的到被占先的义务的 TCB中中; 得到最高优先级义务得到最高优先级义务TCB地址地址LDRr6, addr_OSTCBHighRdyLDRr6, r6LDRsp, r6; 得到新义务堆栈指针得到新义务堆栈指针; OSTCBCur = OSTCBHighRdySTRr6, r4; 设置新

46、的当前义务的设置新的当前义务的TCB地址地址 ;重新义务的堆栈中恢复处置器存放器重新义务的堆栈中恢复处置器存放器 LDMFDsp!, r4MSRSPSR, r4LDMFDsp!, r4MSRCPSR, r4 ; 前往到新义务的上下文前往到新义务的上下文LDMFDsp!, r0-r12, lr, pc91中断级的义务切换中断级的义务切换92中断级的义务切换函数原型: OSIntCtxSw()void OSIntCtxSw(void) 调整堆栈指针去掉在调用:调整堆栈指针去掉在调用: OSIntExit(), OSIntCtxSw()过程中压入堆栈的多余内容过程中压入堆栈的多余内容; 将当前任务堆

47、栈指针保存到当前任务的将当前任务堆栈指针保存到当前任务的OS_TCB中中: OSTCBCur-OSTCBStkPtr = 堆栈指针堆栈指针; 调用用户定义的调用用户定义的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢复的任务的堆栈指针得到需要恢复的任务的堆栈指针: 堆栈指针堆栈指针 = OSTCBHighRdy-OSTCBStkPtr; 将所有处理器寄存器从新任务的堆栈中恢复出来将所有处理器寄存器从新任务的堆栈中恢复出来; 执行中断返回指令执行中断返回指令;93OSIntCtxSW ();中断级

48、的义务切换函数1OSIntCtxSwLDRsp, =IRQStack;IRQ_STACK Sub r7,sp,#4mrs r1, SPSR ; 得到暂停的得到暂停的 PSRorr r1, r1, #0 xC0 ; 封锁封锁 IRQ, FIQ.msr CPSR_cxsf, r1 ; 转换方式转换方式 (应该是应该是 SVC_MODE)ldr r0, r7 ; 从从IRQ堆栈中得到堆栈中得到IRQs LR (义务义务 PC) sub r0, r0, #4 ; 当前当前PC地址是地址是(saved_LR - 4)STMFDsp!, r0 ; 保管义务保管义务 PCSTMFDsp!, lr ; 保管保

49、管 LRsub lr, r7 ,#52 ; 保管保管 FIQ 堆栈堆栈 ptr in LR (转到转到 nuke r7)ldmfd lr!, r0-r12 ; 从从FIQ堆栈中得到保管的存放器堆栈中得到保管的存放器STMFDsp!, r0-r12 ;在义务堆栈中保管存放器在义务堆栈中保管存放器 94OSIntCtxSW ();中断级的义务切换函数2;在义务堆栈上保管当前义务的在义务堆栈上保管当前义务的PSR 和和 PSRMRS r4, CPSRbic r4, r4, #0 xC0 ; 使中断位处于使能态使中断位处于使能态STMFDsp!, r4; 保管义务当前保管义务当前 PSRMRS r4,

50、 SPSRSTMFDsp!, r4; SPSR ; OSPrioCur = OSPrioHighRdy / 改动当前义务到新义务改动当前义务到新义务LDRr4, addr_OSPrioCurLDRr5, addr_OSPrioHighRdyLDRBr6, r5STRB r6, r4; 得到被占先的义务得到被占先的义务TCBLDRr4, addr_OSTCBCurLDRr5, r4STRsp, r5; 保管保管sp 到被占先的义务的到被占先的义务的 TCB中中95OSIntCtxSW ();中断级的义务切换函数3; 得到新义务得到新义务 TCB 地址地址LDR r6, addr_OSTCBHig

51、hRdyLDR r6, r6LDR sp, r6; 得到新义务堆栈指针得到新义务堆栈指针; OSTCBCur = OSTCBHighRdySTR r6, r4 ; 设置新的当前义务的设置新的当前义务的TCB地址地址LDMFDsp!, r4MSR SPSR, r4LDMFDsp!, r4BIC r4, r4, #0 xC0 ; 必需经过允许中断退出必需经过允许中断退出MSR CPSR, r4LDMFDsp!, r0-r12, lr, pc ;启动新义务;启动新义务96时钟节拍中断效力函数: OSTickISR()l多义务操作系统的义务调度是基于时钟节拍中断的,多义务操作系统的义务调度是基于时钟节拍中断的

温馨提示

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

最新文档

评论

0/150

提交评论