dA六嵌入式系统初始化与操作系统的移植

上传人:壹****1 文档编号:569532082 上传时间:2024-07-30 格式:PPT 页数:101 大小:1.04MB
返回 下载 相关 举报
dA六嵌入式系统初始化与操作系统的移植_第1页
第1页 / 共101页
dA六嵌入式系统初始化与操作系统的移植_第2页
第2页 / 共101页
dA六嵌入式系统初始化与操作系统的移植_第3页
第3页 / 共101页
dA六嵌入式系统初始化与操作系统的移植_第4页
第4页 / 共101页
dA六嵌入式系统初始化与操作系统的移植_第5页
第5页 / 共101页
点击查看更多>>
资源描述

《dA六嵌入式系统初始化与操作系统的移植》由会员分享,可在线阅读,更多相关《dA六嵌入式系统初始化与操作系统的移植(101页珍藏版)》请在金锄头文库上搜索。

1、1dA六、嵌入式系统初始化与操作系统的移植Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望2本节提要本节提要1 1嵌入式系统的初始化嵌入式系统的初始化2 2 C/OS-的移植的移植3初始化程序的下载执行目标机目标机宿主机宿主机1 1)通过编程器将可执行目标文件烧写到)通过编程器将可执行目标文件烧写到BootROMBootROM(ROMROM、EPROMEPROM、FLASHFLASH)等;)等;2 2)通过串行口和网口下载执行目标文件,)通过串行口和网口下载执行目标文件,要求宿主机系

2、统上有数据传输工具程序、目要求宿主机系统上有数据传输工具程序、目标机装载器、嵌入式监视器或目标机系统上标机装载器、嵌入式监视器或目标机系统上的调试代理。的调试代理。3 3)通过)通过JTAGJTAG或或BDMBDM接口下载;接口下载;4嵌入式系统的初始化过程5嵌入式系统的初始化过程硬件初始化阶段硬件初始化阶段1、复位向量、复位向量 ENTRY b ResetHandler ;for debug b HandlerUndef ;handlerUndef b HandlerSWI ;SWI interrupt handler b HandlerPabort ;handlerPAbort b Han

3、dlerDabort ;handlerDAbort b . ;handlerReserved b HandlerIRQ b HandlerFIQ6嵌入式系统的初始化过程(2)硬件初始化阶段硬件初始化阶段2 2、最小硬件初始化、最小硬件初始化1 1)设置适当的寄存器,使嵌入式处理)设置适当的寄存器,使嵌入式处理器处于一个已知的状态:器处于一个已知的状态:l获得获得CPUCPU的类型;的类型;l获得或设置获得或设置CPUCPU的时钟频率。的时钟频率。2 2)禁止中断和高速缓存)禁止中断和高速缓存3 3)初始化内存控制器、内存芯片和高)初始化内存控制器、内存芯片和高速缓存单元,包括:速缓存单元,包括

4、:l得到内存的开始地址;得到内存的开始地址;l得到内存的大小;得到内存的大小;l如果有要求,则还需要进行主存如果有要求,则还需要进行主存测试;测试;7嵌入式系统的初始化过程(3)硬件初始化阶段硬件初始化阶段3 3、其余硬件初始化、其余硬件初始化1 1)引导代码调用合适的函数对目标机)引导代码调用合适的函数对目标机系统上的全部硬件部件进行初始化,包系统上的全部硬件部件进行初始化,包括:括:l建立执行处理程序建立执行处理程序l初始化中断处理程序初始化中断处理程序l初始化总线接口初始化总线接口l初始化板级外设得到内存的开始初始化板级外设得到内存的开始地址;地址;8嵌入式系统的初始化过程(4)RTOS

5、初始化阶段初始化阶段4 4、RTOSRTOS初始化初始化1 1)RTOSRTOS初始化初始化2 2)RTOSRTOS对象和服务初始化对象和服务初始化l任务任务l信号量信号量l定时器定时器l中断中断l内存管理内存管理3 3)RTOSRTOS任务堆栈初始化任务堆栈初始化4 4)RTOSRTOS扩展部件初始化扩展部件初始化5 5)启动)启动RTOSRTOS9嵌入式系统的初始化过程(5)应用程序初始化阶段应用程序初始化阶段4 4、应用程序初始化、应用程序初始化10ARM系统初始化的一般过程启动(系统上电启动(系统上电/ /复位)复位)从程序入口点从程序入口点初始化时钟等硬件相关寄存器初始化时钟等硬件相

6、关寄存器1 1、设定、设定PLLPLL2 2、关中断、关中断3 3、设置其它寄存器、设置其它寄存器初始化存储器系统初始化存储器系统FlashFlash及及SDRAMSDRAM参数设置参数设置初始化初始化C C所需要的存储器空间所需要的存储器空间调用调用C C入口函数入口函数堆栈初始化堆栈初始化11一、设置程序入口指针l上电复位后直接到程序入口点执行,入口点一般为一个上电复位后直接到程序入口点执行,入口点一般为一个跳转表,跳转到复位处理程序处开始执行跳转表,跳转到复位处理程序处开始执行ARMARM系统的初始系统的初始化;化;l启动程序首先必须定义入口指针,而且整个应用程序只启动程序首先必须定义入

7、口指针,而且整个应用程序只有一个入口指针有一个入口指针例:例:AREA Boot,CODE,READONLYAREA Boot,CODE,READONLY ENTRY /* ENTRY /*设置程序入口指针设置程序入口指针*/*/12二、设置中断向量lARMARM要求中断向量必须设置在从要求中断向量必须设置在从OX00000000OX00000000地址开始,连地址开始,连续续8*48*4字节的地址空间;字节的地址空间;l向量表包含一系列跳转指令,跳转到相应的中断服务程向量表包含一系列跳转指令,跳转到相应的中断服务程序;序;l对各未用中断,使其指向一个含返回指令的哑函数,以对各未用中断,使其指

8、向一个含返回指令的哑函数,以防止错误中断引起系统的混乱;防止错误中断引起系统的混乱;13中断向量表FIQ0x1C外部快速中断IRQ0x18一般外部中断(Reserved)0x14保留Data Abort0x10数据异常Frefetch Abort0x0C预取指异常Software int0x08软件中断Undef0x04未定义指令中断Reset0x00复位中断14中断向量表的程序AREA Boot,CODE,READONLYAREA Boot,CODE,READONLYENTRYENTRYB Reset_handlerB Reset_handlerB Undef_HandlerB Undef_

9、HandlerB SWI_HandlerB SWI_HandlerB PreAbort_HandlerB PreAbort_HandlerB . ;for reserved interrupt,stop hereB . ;for reserved interrupt,stop hereB IRQ_handlerB IRQ_handlerB FIQ_handlerB FIQ_handler15三、初始化时钟和设置相关的寄存器l通过设置时钟控制器来确定通过设置时钟控制器来确定CPUCPU的工作频率,设置中断控的工作频率,设置中断控制寄存器屏蔽中断制寄存器屏蔽中断l设置设置”看门狗看门狗”控制寄存器

10、控制寄存器, ,关闭关闭”看门狗看门狗”l关闭关闭CacheCache16四、初始化存储器系统存储器类型和时序配置存储器类型和时序配置( (参考芯片手册,设置与内存映射相参考芯片手册,设置与内存映射相关的寄存器关的寄存器) )l一个复杂的系统可能存在多种存储器类型的接口,需要根据实际的一个复杂的系统可能存在多种存储器类型的接口,需要根据实际的系统设计对此加以正确配置。对同一种存储器类型来说,也因为访系统设计对此加以正确配置。对同一种存储器类型来说,也因为访问速度的差异,需要不同的时序设置。问速度的差异,需要不同的时序设置。l通常通常Flash Flash 和和SRAM SRAM 同属于静态存储

11、器类型,可以合用同一个存储器同属于静态存储器类型,可以合用同一个存储器端口;端口;l而而DRAM DRAM 因为动态刷新和地址线复用等特性,通常配有专用的存储器因为动态刷新和地址线复用等特性,通常配有专用的存储器端口。端口。l存储器端口的接口时序优化是非常重要的,影响到整个系统的性能。存储器端口的接口时序优化是非常重要的,影响到整个系统的性能。因为一般系统运行的速度瓶颈都存在于存储器访问,所以存储器访因为一般系统运行的速度瓶颈都存在于存储器访问,所以存储器访问时序应尽可能地快;但同时又要考虑由此带来的稳定性问题。只问时序应尽可能地快;但同时又要考虑由此带来的稳定性问题。只有根据具体选定的芯片,

12、进行多次的测试之后,才能确定最佳的时有根据具体选定的芯片,进行多次的测试之后,才能确定最佳的时序配置。序配置。17存储器地址分布l有些系统具有非常灵活的存储器地址分配特性,进行存有些系统具有非常灵活的存储器地址分配特性,进行存储器初始化设计的时候一定要根据应用程序的具体要求储器初始化设计的时候一定要根据应用程序的具体要求来完成地址分配。来完成地址分配。l一种典型的情况是启动一种典型的情况是启动ROM ROM 的地址重映射(的地址重映射(remapremap)。当)。当一个系统上电后程序将自动从一个系统上电后程序将自动从0 0 地址处开始执行,因此地址处开始执行,因此在系统的初始状态,必须保证在

13、在系统的初始状态,必须保证在0 0 地址处存在正确的代地址处存在正确的代码,即要求码,即要求0 0 地址开始处的存储器是非易性的地址开始处的存储器是非易性的ROM ROM 或或Flash Flash 等。但是因为等。但是因为ROM ROM 或或Flash Flash 的访问速度相对较慢,的访问速度相对较慢,每次中断发生后都要从读取每次中断发生后都要从读取ROM ROM 或或Flash Flash 上面的向量表上面的向量表开始,影响了中断响应速度。因此有的系统便提供一种开始,影响了中断响应速度。因此有的系统便提供一种灵活的地址重映射方法,可以把灵活的地址重映射方法,可以把0 0 地址重新指向到地

14、址重新指向到RAM RAM 中去。在这种地址映射的变化过程当中,程序员需要仔中去。在这种地址映射的变化过程当中,程序员需要仔细考虑的是程序的执行流程不能被这种变化所打断。细考虑的是程序的执行流程不能被这种变化所打断。18ROM地址的重映射(remap)0x0200(boot code)0x0100(Reset_handler)B Reset_Handler0x0000Flash(remap)0x0204(boot code)0x0200(Reset_handler)B Reset_Handler0x0000RAM19ROM地址重映射的实现地址重映射的实现mov r8,#RAM_BASE_BOO

15、T/RAM_BASE_BOOT是重映射是重映射前内部前内部RAM区地址区地址 add r9, pc #VectorTale /VectorTale是异常向量表入口是异常向量表入口ldmia r9!, r0-r7 /读读8个异常向量个异常向量 stmia r8!, r0-r7 /保存保存8个异常向量到个异常向量到RAM区区ldmia r9!, r0-r4 /读读5个异常处理程序绝对地址个异常处理程序绝对地址stmia r8!, r0-r4 /保存保存5个异常处理程序绝对地址到个异常处理程序绝对地址到RAM区区 为保证重映射之后提供正确的中断入口地址,在重映射之前就必为保证重映射之后提供正确的中断

16、入口地址,在重映射之前就必须把中断和异常向量表拷贝到内部须把中断和异常向量表拷贝到内部RAMRAM中。其程序实现如下:中。其程序实现如下:20五、初始化堆栈lARMARM处理器有好几种运行状态(模式),各种状态都需要处理器有好几种运行状态(模式),各种状态都需要有自己的堆栈,所以需要分别为这些堆栈分配空间并设有自己的堆栈,所以需要分别为这些堆栈分配空间并设置好各自的堆栈指针置好各自的堆栈指针l每一种状态的堆栈指针寄存器(每一种状态的堆栈指针寄存器(SPSP)都是独立的)都是独立的(System System 和和User User 模式使用相同的模式使用相同的SP SP 寄存器)。因此对寄存器

17、)。因此对程序中需要用到的每一种模式都要给程序中需要用到的每一种模式都要给SP SP 寄存器定义一个寄存器定义一个堆栈地址。方法是改变状态寄存器堆栈地址。方法是改变状态寄存器CPSRCPSR内的状态位,使内的状态位,使处理器切换到不同的状态,然后给处理器切换到不同的状态,然后给SP SP 赋值。(注意不要赋值。(注意不要切换到切换到UserUser模式进行模式进行User User 模式的堆栈设置,因为进入模式的堆栈设置,因为进入User User 模式后就不能再操作模式后就不能再操作CPSR CPSR 回到别的模式了。可能回到别的模式了。可能会对接下去的程序执行造成影响。)会对接下去的程序执

18、行造成影响。)l一般堆栈的大小要根据需要而定,但是要尽可能给堆栈一般堆栈的大小要根据需要而定,但是要尽可能给堆栈分配快速和高带宽的存储器。堆栈性能的提高对系统整分配快速和高带宽的存储器。堆栈性能的提高对系统整体性能的影响是非常明显的。体性能的影响是非常明显的。21堆栈初始化代码示例MRS R0, CPSR ; CPSR - R0BIC R0, R0, #MODEMASK ; 安全起见,屏蔽模式位以外的其它位安全起见,屏蔽模式位以外的其它位ORR R1, R0, #IRQMODE ; 把处理器模式位设置成把处理器模式位设置成IRQ模式模式MSR CPSR_cxsf, R1 ; 转到转到IRQ 模

19、式模式LDR SP, =IRQStack ; 设置设置SP_irqORR R1,R0,#FIQMODEMSR CPSR_cxsf, R1 ; FIQModeLDR SP, =FIQStackORR R1, R0, #SVCMODEMSR CPSR_cxsf, R1 ; SVCModeLDR SP, =SVCStack22六、初始化C环境(1)l在目标文件中,代码、数据放在不同的段中。源文件编在目标文件中,代码、数据放在不同的段中。源文件编译链接生成含译链接生成含.data.data、.text.text段的目标文件,且链接器生段的目标文件,且链接器生成的成的.data.data段是以系统段是以

20、系统RAMRAM为参考地址。为参考地址。l故在系统启动时需要拷贝故在系统启动时需要拷贝ROMROM或或FLASHFLASH中的中的.data.data段到段到RAMRAM,以完成对,以完成对RAMRAM的初始化。在初始化期间应将系统需要读的初始化。在初始化期间应将系统需要读写的数据和变量从写的数据和变量从ROMROM拷贝到拷贝到RAMRAM里运行。里运行。23了解连接器的功能l将许多放在不同文件中的目标码,连接成一个可执行文将许多放在不同文件中的目标码,连接成一个可执行文件;件;l计算及分配位于不同区段(计算及分配位于不同区段(Session)Session)的程序或数据。一的程序或数据。一个

21、程序可分为程序段(个程序可分为程序段(Read-Only,RO)Read-Only,RO)、数据段(、数据段(Read-Read-Write,RW)Write,RW)、零初始化段(、零初始化段(Zero-Initialized,ZI)Zero-Initialized,ZI);l编译器仅将程序转成机器码,不会处理与内存地址有关编译器仅将程序转成机器码,不会处理与内存地址有关的部分,这部分工作由连接器完成;的部分,这部分工作由连接器完成;l连接器产生带定位地址的可执行二进制目标文件。连接器产生带定位地址的可执行二进制目标文件。连接器主要用于处理内存地址分配问题连接器主要用于处理内存地址分配问题24

22、链接器产生的符号表l符号由链接器自动产生,只读段(符号由链接器自动产生,只读段(read-only ROread-only RO)就是)就是代码段,读写段(代码段,读写段(read-write RWread-write RW)是已经初始化的全局)是已经初始化的全局变量,而零初始化段(变量,而零初始化段(zero-initialized section ZIzero-initialized section ZI)中存放未初始化的全局变量;中存放未初始化的全局变量;25初始化应用程序执行环境l映像一开始总是存储在映像一开始总是存储在ROM/Flash ROM/Flash 里面的,其里面的,其RO

23、RO 部分既可部分既可以在以在ROM/FlashROM/Flash里面执行,也可以转移到速度更快的里面执行,也可以转移到速度更快的RAM RAM 中中去;而去;而RW RW 和和ZI ZI 这两部分则必须转移到可写的这两部分则必须转移到可写的RAM RAM 里去进里去进行访问。行访问。l所谓应用程序执行环境的初始化,就是完成必要的从所谓应用程序执行环境的初始化,就是完成必要的从ROM ROM 到到RAM RAM 的数据传输和内容清零。的数据传输和内容清零。26初始化C环境(2)lC C环境初始化,就是利用上述符号初始化环境初始化,就是利用上述符号初始化RWRW和和ZIZI段,以使段,以使后面使

24、用全局变量的后面使用全局变量的C C程序正常运行;程序正常运行;l这里有两个循环,第一个循环把预初始化的数据段这里有两个循环,第一个循环把预初始化的数据段RWRW(位于代码段的后面)复制到(位于代码段的后面)复制到RAMRAM中;另一个循环把未初中;另一个循环把未初始化的数据段始化的数据段ZIZI初始化为初始化为0 0,也就是实现把从,也就是实现把从ROMROM中的中的.data.data段拷贝到段拷贝到RAMRAM,对,对ZIZI段内的数据初始化为段内的数据初始化为0 0,以完成,以完成对对C C环境的实始化;环境的实始化;27初始化C环境(3)28改变处理器模式l除用户模式以外,其他除用户

25、模式以外,其他6 6 种模式都是特权模式。因为在种模式都是特权模式。因为在初始化过程中许多操作需要在特权模式下才能进行(比初始化过程中许多操作需要在特权模式下才能进行(比如如CPSR CPSR 的修改),所以要特别注意不能过早地进入用的修改),所以要特别注意不能过早地进入用户模式。一般地,在初始化过程中会经历以下一些模式户模式。一般地,在初始化过程中会经历以下一些模式变化:变化:29七、呼叫C程序l对对mainmain函数的调用是进入函数的调用是进入C C主程序或主程序或uc/OSuc/OS的入口,通过的入口,通过这个入口就可进入这个入口就可进入C C主程序或主程序或uC/OSuC/OS的启动

26、程序,完成应的启动程序,完成应用程序的执行或用程序的执行或uC/OSuC/OS的启动。的启动。l例例 IMPORT Main IMPORT Main b Main ;C Entry b Main ;C Entry30uC/OS系统的初始化(1)lARM9ARM9系统的初始化系统的初始化1、关关WATCH DOG WATCH DOG 2 2、禁止所有中断、禁止所有中断 3 3、初始化系统时钟、初始化系统时钟 4 4、初始化内存控制寄存器、初始化内存控制寄存器5 5、检查是否从掉电模式唤醒、检查是否从掉电模式唤醒 6 6、点亮所有、点亮所有LED LED 7 7、初始化、初始化UART0UART0

27、8 8、将、将vivivivi所有代码从所有代码从nand flashnand flash复制到复制到SDRAMSDRAM中中 9 9、跳到、跳到initinit程序,然后转到程序,然后转到mainmain函数函数l完成了前面的完成了前面的ARM9ARM9系统硬件初始化系统硬件初始化和运行环境的相关设置后,进入和运行环境的相关设置后,进入MainMain()(), Main() Main()是是uC/OSuC/OS的入口函数,启动对的入口函数,启动对uC/OSuC/OS的初始化。的初始化。31ARM的硬件抽象层uHALlARMARM公司为操作系统的开发提供了一个硬件抽象层公司为操作系统的开发提

28、供了一个硬件抽象层HALHAL,称为称为uHALuHAL;l从结构上看,从结构上看,uHALuHAL是一组库程序,需要说明的是,是一组库程序,需要说明的是,uHALuHAL并不是专门为并不是专门为uC/OSuC/OS准备的,甚至也不是专为操作系统内准备的,甚至也不是专为操作系统内核准备的;核准备的;luHALuHAL只是个针对只是个针对ARMARM核的函数库;核的函数库;luC/OSuC/OS是建立在是建立在uHALuHAL的基础之上的;的基础之上的;32uC/OS系统的初始化(2)33ARMTargetInit()函数结构ARMTargetInit()ARMTargetInit()调调uHA

29、LuHAL打印接口打印系统信息打印接口打印系统信息调用调用uHALuHAL函数禁止所有中断函数禁止所有中断调用调用uHALuHAL函数对中断初始化函数对中断初始化uHALuHAL函数对函数对ARMARM定时器初始化定时器初始化结束结束34uHAL的功能luHALuHAL的作用之一是在操作系统本身进入正常运行之前,为的作用之一是在操作系统本身进入正常运行之前,为系统提供基本的输入输出手段,例如系统提供基本的输入输出手段,例如uHALr_printf()uHALr_printf()等;等;luHALuHAL还要为操作系统的运行准备一个基本的运行环境,具还要为操作系统的运行准备一个基本的运行环境,具

30、体包括下列各种初始化:体包括下列各种初始化:l通过通过uHAL_ResetMMU()uHAL_ResetMMU(),将,将MMUMMU设置在一个确定的初始状设置在一个确定的初始状态;态;l通过通过ARMDisable()ARMDisable()关闭中断;关闭中断;l通过通过uHAL_InitInterrupts()uHAL_InitInterrupts()设置中断向量处理程序;设置中断向量处理程序;l通过通过uHAL_InitTimer()uHAL_InitTimer()对系统使用的定时器进行初始化对系统使用的定时器进行初始化35ARMTargetStart()的分析l创建了任务之后,创建了任

31、务之后,ARMTargetStart()ARMTargetStart()调用调用uHALr_InstallSystemTimeruHALr_InstallSystemTimer()()创建一个系统时钟,为时钟中断做好准备;创建一个系统时钟,为时钟中断做好准备;36C/OS-II BSP编写BSPBSP(板级支持包)是介于底层硬件和操作系统之间的软件层次,它(板级支持包)是介于底层硬件和操作系统之间的软件层次,它完成系统上电后最初的硬件和软件初始化,并对底层硬件进行封完成系统上电后最初的硬件和软件初始化,并对底层硬件进行封装,使得操作系统不再面对具体的操作。装,使得操作系统不再面对具体的操作。B

32、SPBSP的特点:的特点:l硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与硬件之间的接口,所以,作为高层软件与硬件之间的接口,BSPBSP必须为操作系统提供必须为操作系统提供操作和控制具体硬件的方法。操作和控制具体硬件的方法。l操作系统相关性:不同的操作系统具有各自的软件层次结构,因操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。此,不同的操作系统具有特定的硬件接口形式。37BSPBSP的功能的功能l嵌入式系统初始化嵌入式系统初始化 A A、片级初始化、片级初

33、始化 B B、板级初始化、板级初始化 C C、系统级初始化、系统级初始化l硬件相关的设备驱动程序硬件相关的设备驱动程序 38嵌入式系统始化嵌入式系统始化1 1)片级初始化:主要完成微处理器的初始化,)片级初始化:主要完成微处理器的初始化, 包括设置微处理器包括设置微处理器的核心寄存器和控制寄存器,微处理器核心工作模式以及其局部的核心寄存器和控制寄存器,微处理器核心工作模式以及其局部总线模式等。片级初始化把微处理器从上电时的缺省状态逐步设总线模式等。片级初始化把微处理器从上电时的缺省状态逐步设置成为系统所要求的工作状态。这是一个纯硬件的初始化过程置成为系统所要求的工作状态。这是一个纯硬件的初始化

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

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

36、与初始化过程相反,硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底层的过程。尽管层的过程。尽管BSP BSP 中包含硬件相关的设备驱动程序,但是这些中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由设备驱动程序通常不直接由BSPBSP使用,而是在系统初始化过程中由使用,而是在系统初始化过程中由BSP BSP 把它们与操作系统中通用的设备驱动程序关联起来,并在随把它们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作。后的应用中由通用的设备驱动程序调用,实现对硬件设备的

37、操作。2 2)设计与硬件相关的驱动程序是)设计与硬件相关的驱动程序是BSPBSP设计中另一个关键环节设计中另一个关键环节41系统调用通用设备驱动程序与BSP的关系42本节提要本节提要1 1嵌入式系统的初始化嵌入式系统的初始化2 2 C/OS-的移植的移植43操作系统移植的概念l所谓操作系统的移植,是指使一个实时操作系统能够在所谓操作系统的移植,是指使一个实时操作系统能够在某个微处理器平台上运行。某个微处理器平台上运行。l COS-IICOS-II的主要代码都是由标准的的主要代码都是由标准的C C语言写成的,移植语言写成的,移植方便。方便。l移植的主要工作是修改部分与处理器硬件相关的代码。移植的

38、主要工作是修改部分与处理器硬件相关的代码。44移植的层次操作系统的移植大体可以分为两个层次:操作系统的移植大体可以分为两个层次:l跨体系结构的移植跨体系结构的移植l针对特定处理器的移植针对特定处理器的移植45移植COS-II满足的条件 l处理器的处理器的C C编译器能产生可重入代码编译器能产生可重入代码 l在程序中可以打开或者关闭中断在程序中可以打开或者关闭中断 l处理器支持中断,并且能产生定时中断(通常在处理器支持中断,并且能产生定时中断(通常在10100Hz10100Hz之间)之间) l处理器支持能够容纳一定量数据的硬件堆栈处理器支持能够容纳一定量数据的硬件堆栈 l处理器有将堆栈指针和其他

39、处理器有将堆栈指针和其他CPUCPU寄存器存储和读出寄存器存储和读出到堆栈(或者内存)的指令到堆栈(或者内存)的指令 46什么是可重入代码 l可重入的代码指的是一段代码(比如:一个函数)可可重入的代码指的是一段代码(比如:一个函数)可以被多个任务同时调用,而不必担心会破坏数据。以被多个任务同时调用,而不必担心会破坏数据。l也就是说,可重入型函数在任何时候都可以被中断执也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中函数中断的时候被其他的任务重新调用,影响函数中

40、的数据。的数据。 47可重入代码举例程序程序1 1:可重入型函数:可重入型函数void swap(int *x, int *y)void swap(int *x, int *y) int temp;int temp;temp=*x;temp=*x;*x=*y;*x=*y;*y=temp;*y=temp; 48非可重入代码举例程序程序2 2:非可重入型函数:非可重入型函数int temp;int temp;void swap(int *x, int *y)void swap(int *x, int *y) temp=*x;temp=*x;*x=*y;*x=*y;*y=temp;*y=temp;

41、返回49不可重入函数被中断破坏50如何使函数具有可重入性 使使Swap()Swap()函数具有可重入性:函数具有可重入性:l把把TempTemp定义为局部变量;定义为局部变量;l调用调用Swap()Swap()函数之前关中断,调动后再开中断;函数之前关中断,调动后再开中断;l用信号量禁止该函数在使用过程中被再次调用;用信号量禁止该函数在使用过程中被再次调用;51打开/关闭中断 在在 COS-IICOS-II中,可以通过:中,可以通过:OS_ENTER_CRITICAL() OS_ENTER_CRITICAL() OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()宏来控制系

42、统关闭或者打开中断。这需要处理器的支持。宏来控制系统关闭或者打开中断。这需要处理器的支持。在在ARM7TDMIARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。系统的所有中断。 52处理器支持中断并且能产生定时中断 l COS-IICOS-II是通过处理器产生的定时器的中断来实现多是通过处理器产生的定时器的中断来实现多任务之间的调度的。任务之间的调度的。lARM9ARM9的处理器上可以产生定时器中断。的处理器上可以产生定时器中断。53处理器支持硬件堆栈 l COS-IICOS-II进行任务调度的时候,会把当前任务的进行任

43、务调度的时候,会把当前任务的CPUCPU寄存寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是寄存器的入栈和出栈是 COS-IICOS-II多任务调度的基础。多任务调度的基础。 lARM9ARM9处理器中有专门的指令处理堆栈,可以灵活的使用堆处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。栈。54移植对开发工具的要求 l移植移植 COS-IICOS-II需要一个标准的需要一个标准的C C交叉编译器;交叉编译器;l由于移植

44、时需要对由于移植时需要对CPUCPU的寄存器进行操作,所以需要的寄存器进行操作,所以需要C C交交叉编译器能够支持汇编语言程序;叉编译器能够支持汇编语言程序;l嵌入式嵌入式C C编译器一般都包括汇编器、链接器和定位器。链编译器一般都包括汇编器、链接器和定位器。链接器是用来将不同的模块(编译或汇编过的文件)链接接器是用来将不同的模块(编译或汇编过的文件)链接成目标文件;定位器则允许将代码和数据放置在目标处成目标文件;定位器则允许将代码和数据放置在目标处理器的指定内存空间中;理器的指定内存空间中;55移植uCOS-II要点(1)开关中断的方式。推荐使用开关中断的方式。推荐使用method3meth

45、od3 #if OS_CRITICAL_METHOD = 3#if OS_CRITICAL_METHOD = 3OS_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_O

46、N(); 57ARM的中断模式l设备的中断在设备的中断在ARMARM中被映射到了两个异常中中被映射到了两个异常中FIQFIQ和和IRQIRQl通过控制通过控制CPSRCPSR中的对应数据位,可以开启或者关闭中中的对应数据位,可以开启或者关闭中断断为了方便和统一为了方便和统一uCOS-IIuCOS-II系统中断的处理,只使用了系统中断的处理,只使用了IRQIRQ模式的中断。模式的中断。58移植uCOS-II要点(2)系统中断的处理l所有中断的调用都需要经过系统的接管。中断处理函数所有中断的调用都需要经过系统的接管。中断处理函数调用前后需要通知系统。例如:调用前后需要通知系统。例如:OSIntEn

47、ter();yourInterruptFun();OSIntExit();59OSIntExit的意义的意义60ARM的工作模式lARMARM处理器有处理器有7 7种操作模式种操作模式: :l用户模式用户模式(usr)(usr) - - 正常的程序执行模式正常的程序执行模式l快速中断模式快速中断模式(fiq)(fiq) - - 支持高速数据传输或通道处理支持高速数据传输或通道处理l中断模式中断模式( (irq)irq) - - 用于通用中断处理用于通用中断处理l管理员模式管理员模式(svc)(svc) - - 操作系统的保护模式操作系统的保护模式. .l中止模式中止模式(abt)(abt) -

48、 - 支持虚拟内存和支持虚拟内存和/ /或内存保护等异常或内存保护等异常l系统模式系统模式(sys)(sys) - - 支持操作系统的特殊用户模式支持操作系统的特殊用户模式( (运行操作系统任务)运行操作系统任务)l未定义模式未定义模式(und)(und) - - 支持硬件协处理器的软件仿真支持硬件协处理器的软件仿真 l除了用户模式外,其他模式均可视为特权模式除了用户模式外,其他模式均可视为特权模式61ARM的寄存器(1)l3737个寄存器个寄存器u31 31 个通用个通用3232位寄存器,包括程序计数器位寄存器,包括程序计数器PCPCu6 6 个状态寄存器个状态寄存器u1515个通用寄存器个

49、通用寄存器 (R0 to R14), (R0 to R14), 以及以及2 2个状态寄存器和程序计数器个状态寄存器和程序计数器(PCPC)在任何时候都中可见的)在任何时候都中可见的l可见的寄存器取决于处理器的模式,不同的模式映射了不同的工可见的寄存器取决于处理器的模式,不同的模式映射了不同的工作寄存器作寄存器62ARM寄存器的组织注注:表明用户或系统模式使用的正常寄存器已经被异常表明用户或系统模式使用的正常寄存器已经被异常模式指定的另一个寄存器取代模式指定的另一个寄存器取代63ARM的寄存器(2)lR0 R0 到到 R15 R15 可以直接访问可以直接访问lR0 R0 到到 R14 R14 是

50、通用寄存器是通用寄存器lR13: R13: 堆栈指针堆栈指针 (sp) (sp) (通常通常) )u每种处理器模式都有单独的堆栈lR14: R14: 链接寄存器链接寄存器 (lr) (lr)lR15R15:程序计数器:程序计数器 (PC)(PC)lCPSR CPSR 当前程序状态寄存器,包括代码标志状态和当前模式位当前程序状态寄存器,包括代码标志状态和当前模式位l5 5个个SPSR-(SPSR-(程序状态保存寄存器程序状态保存寄存器) ) 当异常发生时保存当异常发生时保存CPSRCPSR状态状态64uCOS-II在ARM上的任务切换l任务级的任务切换任务级的任务切换l中断级的任务切换中断级的任

51、务切换65中断处理过程66OSIntExit()void OSIntExit (void) OS_ENTER_CRITICAL(); (1) if (-OSIntNesting | OSLockNesting) = 0) (2) OSIntExitY = OSUnMapTblOSRdyGrp; (3) OSPrioHighRdy = (INT8U)(OSIntExitY OSTCBStkPtr = Stack pointer; 调用用户定义的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢复的任务

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

53、r4, addr_OSPrioCurLDR r5, addr_OSPrioHighRdyLDRBr6, r5STRBr6, r4 90OS_TASK_SW():任务级的任务切换函数(2); 得到当前任务得到当前任务TCB地址地址LDRr4, addr_OSTCBCurLDRr5, r4STRsp, r5; 保存保存sp到被占先的任务的到被占先的任务的 TCB中中; 得到最高优先级任务得到最高优先级任务TCB地址地址LDRr6, addr_OSTCBHighRdyLDRr6, r6LDRsp, r6; 得到新任务堆栈指针得到新任务堆栈指针; OSTCBCur = OSTCBHighRdySTRr

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

55、存到当前任务的OS_TCB中: OSTCBCur-OSTCBStkPtr = 堆栈指针; 调用用户定义的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢复的任务的堆栈指针: 堆栈指针 = OSTCBHighRdy-OSTCBStkPtr; 将所有处理器寄存器从新任务的堆栈中恢复出来; 执行中断返回指令;93OSIntCtxSW ();中断级的任务切换函数(1)OSIntCtxSwLDRsp, =IRQStack;IRQ_STACK Sub r7,sp,#4mrs r1, SPSR ; 得到暂停的得

56、到暂停的 PSRorr r1, r1, #0xC0 ; 关闭关闭 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 ; 保存保存 LRsub lr, r7 ,#52 ; 保存保存 FIQ 堆栈堆栈 ptr in LR (转到转到 nuke r7)ldmfd lr!, r0-r12 ;

57、 从从FIQ堆栈中得到保存的寄存器堆栈中得到保存的寄存器STMFDsp!, r0-r12 ;在任务堆栈中保存寄存器在任务堆栈中保存寄存器 94OSIntCtxSW ();中断级的任务切换函数(2);在任务堆栈上保存当前任务的在任务堆栈上保存当前任务的PSR 和和 PSRMRS r4, CPSRbic r4, r4, #0xC0 ; 使中断位处于使能态使中断位处于使能态STMFDsp!, r4; 保存任务当前保存任务当前 PSRMRS r4, SPSRSTMFDsp!, r4; SPSR ; OSPrioCur = OSPrioHighRdy / 改变当前任务到新任务改变当前任务到新任务LDRr

58、4, addr_OSPrioCurLDRr5, addr_OSPrioHighRdyLDRBr6, r5STRB r6, r4; 得到被占先的任务得到被占先的任务TCBLDRr4, addr_OSTCBCurLDRr5, r4STRsp, r5; 保存保存sp 到被占先的任务的到被占先的任务的 TCB中中95OSIntCtxSW ();中断级的任务切换函数(3); 得到新任务得到新任务 TCB 地址地址LDR r6, addr_OSTCBHighRdyLDR r6, r6LDR sp, r6; 得到新任务堆栈指针得到新任务堆栈指针; OSTCBCur = OSTCBHighRdySTR r6,

59、 r4 ; 设置新的当前任务的设置新的当前任务的TCB地址地址LDMFDsp!, r4MSR SPSR, r4LDMFDsp!, r4BIC r4, r4, #0xC0 ; 必须通过允许中断退出必须通过允许中断退出MSR CPSR, r4LDMFDsp!, r0-r12, lr, pc ;启动新任务;启动新任务96时钟节拍中断服务函数: OSTickISR() OSTickISR()l多任务操作系统的任务调度是基于时钟节拍中断的,多任务操作系统的任务调度是基于时钟节拍中断的, uC/OS-II需需要处理器提供一个定时中断来产生节拍,借以来实现时间的延时要处理器提供一个定时中断来产生节拍,借以来

60、实现时间的延时和期满功能和期满功能;l在平台初始化函数在平台初始化函数ARMTargetInit()中,调用中,调用uHALr_InitTimers()函数初始化定时器相关寄存器;函数初始化定时器相关寄存器;l通过调用通过调用uHALr_InstallSystemTimer(void)设置定时器的设置定时器的IRQ中中断,从而启动时钟节拍;断,从而启动时钟节拍;l必须在开始多任务调度之后再允许时钟节拍中断,即在必须在开始多任务调度之后再允许时钟节拍中断,即在OSStart()函数调用过后,函数调用过后,uC/OS-II第一个任务运行中启动时钟节拍中断。第一个任务运行中启动时钟节拍中断。97测试

61、uCOS-II(1)/*任务定义任务定义*/OS_STK SYS_Task_StackSTACKSIZE= 0, ; /system task刷新任务堆刷新任务堆栈栈#define SYS_Task_Prio1void SYS_Task(void *Id);OS_STK Task1_StackSTACKSIZE=0, ; void Task1(void *Id);#define Task1_Prio 12OS_STK Task2_StackSTACKSIZE= 0, ; void Task2(void *Id); #define Task2_Prio 1398测试uCOS-II(2)int M

62、ain(int argc, char *argv)ARMTargetInit(); / do target (uHAL based ARM system) OSInit(); OSTaskCreate(SYS_Task, (void *)0, (OS_STK *)&SYS_Task_StackSTACKSIZE-1, SYS_Task_Prio);OSTaskCreate(Task2, (void *)0, (OS_STK *)&Task2_StackSTACKSIZE-1, Task2_Prio);OSTaskCreate(Task1, (void *)0, (OS_STK *)&Task1

63、_StackSTACKSIZE-1, Task1_Prio );OSStart(); / start the game / never reached /return 0;/应用程序的基本框架,包括初始化、多任务的创建和多任务的启动。应用程序的基本框架,包括初始化、多任务的创建和多任务的启动。99测试uCOS-II(3)void Task1(void *Id) for(;)Uart_Printf(run task1n);OSTimeDly(1000);void Task2(void *Id)for (;)Uart_Printf(run task2n);OSTimeDly(2000);void

64、SYS_Task(void *Id)uHALr_InstallSystemTimer();Uart_Printf(start system task.n);for (;)OSTimeDly(10000);100移植要点移植要点l定义函数定义函数OS_ENTER_CRITICALOS_ENTER_CRITICAL和和OS_ENTER_CRITICALOS_ENTER_CRITICAL。l定义函数定义函数OS_TASK_SWOS_TASK_SW执行任务切换。执行任务切换。 l定义函数定义函数OSCtxSwOSCtxSw实现任务级上下文切换,用纯汇编实现。实现任务级上下文切换,用纯汇编实现。 l定义函数定义函数OSIntCtxSwOSIntCtxSw实现中断级任务切换,用纯汇编实现。实现中断级任务切换,用纯汇编实现。 l定义函数定义函数OSTickISROSTickISR。 l定义定义OSTaskStkInitOSTaskStkInit来初始化任务的堆栈。来初始化任务的堆栈。 101谢谢 谢谢 各各 位位

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号