1、ARM开发教程之ARM体系嵌入式系统BSP程序设计介绍:ARM企业在32位RISCCPU开发领域不停取得突破,其结构已经从V3发展到V6。BSP(Board Support Package)板级支持包介于主板硬件和操作系统之间,其功效和PC机上BIOS相类似,关键完成硬件初始化并切换到对应操作系统。BSP是相对于操作系统而言,不一样操作系统对应于不一样定义形式BSP,比如VxWorksBSP和LinuxBSP相对于某一CPU来说,尽管实现功效一样,可是写法和接口定义是完全不一样。另外,仔细研究所用芯片资料也十分关键,比如尽管ARM在内核上兼容,但每家芯片全部有自己特色。所以这就要求BSP程序员
2、对硬件、软件和操作系统全部要有一定了解。本文介绍基于ARM体系嵌入式应用系统初始化部分BSP程序设计。本文引用源码全部是基于HMS320C7202芯片设计,并已成功运行。1 ARM开发教程之初始化过程尽管多种嵌入式应用系统结构及功效差异很大,但其系统初始化部分完成操作有很大一部分是相同。嵌入式系统开启步骤图1所表示。1.1 设置入口指针开启程序首先必需定义指针,而且整个应用程序只有一个入口指针。通常地,程序在编译链接时将异常中止向量表链接在0地址处,而且作为整个程序入口点。入口点代码以下:ENTRY(_start) ;开始1.2 ARM开发教程之设置异常中止向量表ARM要求中止向量表必需放置在
3、从0开始、连续84字节空间内。各异常中止向量地址和中止算是优先级如表1: 中止向量地址异常中止类型异常中止模式优先级(6最低)0x0复位特权模式(SVC)10x4未定义中止未定义指令中止模式(Undef)60x8软件中止(SWI)特权模式(SVC)60x0c指令预取中止中止模式50x10数据访问中止中止模式20x14保留未使用未使用0x18外部中止请求(IRQ)外部中止(IRQ)模式40x1c快速中止请求(FIQ)快速中止(FIQ)模式3 表1 各异常中止中止向量地址和中止处理优先级中止向量地址 异常中止类型 异常中止模式 优先级(6最低)0x0 复位 特权模式(SVC) 10x4 未定义中止
4、 未定义指令中止模式(Undef) 60x8 软件中止(SWI) 特权模式(SVC) 60x0c 指令预取中止 中止模式 50x10 数据访问中止 中止模式 20x14 保留 未使用 未使用0x18 外部中止请求(IRQ) 外部中止(IRQ)模式 40x1c 快速中止请求(FIQ) 快速中止(FIQ)模式 3每当一个中止发生后,ARM处理器便强制把程序计数器(PC)指针置为向量表中对应中止类型地址值。因为每个中止向量仅占据放置1条ARM指令空间,所以通常放置1条跳转指令或向程序计数器(PC)寄存器赋值数据访问指令,使程序跳转到对应异常中止处理程序实施。假如异常中止处理程序起始地址小于32MB,
5、使用B跳转指令;假如跳转范围大于32MB,使用LDR指令。另外,对于各未用中止,可使其指向一个只含返回指令哑函数,以预防错误中止引发系统混乱。1.3 初始化存放系统初始化存放系统编程对象是系统存放器控制器,一个系统可能存在多个存放器类型接口,不一样存放系统设计不尽相同。Flash和SRAM同属于静态存放器类型,能够适用一个存放器端口;而DRAM因为有动态刷新和地址线复用等特征,通常配有专用存放器端口。其中,SDRAM必需在初始化阶段进行设置,因为大部分程序代码和数据全部要在SDRAM中运行。在HMS30C7202中,和SDRAM配置相关寄存器有4个:配置寄存器、刷新定时寄存器、写缓冲写回寄存器
6、和等候驱动寄存器,需要依据实际系统设计对此分别加以正确配置。SDRAM初始化过程以下:加电延迟10ms(各具体SDRAM器件延时时间可能不一样)设置配置寄存器参数延时写刷新定时寄存器,设置刷新周期延时使能自动刷新延时设置模式寄存器(在SDRAM内部)。1.4 ARM开发教程之存放器地址分布重映射(remap)和MMU系统一上电,程序将自动从0地址处开始实施。所以,必需确保在0地址处存在正确代码,即要求0地址开始入是非易失性ROM或Flash等。不过因为ROM或Flash访问速度相对较慢,每次中止响应发生后,全部要从读取ROM或Flash上面向量表开始,影响了中止响应速度。通常程序实施后将SDR
7、AM映射为地址0,并把系统程序加载到SDRAM中运行,其具体步骤能够采取以下方案:(1)上电后,从0地址ROM开始往下实施;(2)依据映射前地址,对SDRAM进行必需代码和数据拷贝;(3)拷贝完成后,进行重映射操作;(4)因为RAM在重映射前准备好了内容,使得PC指针能继续在RAM里取得正确指令。在这种地址映射改变过程中,程序员需要仔细考虑是:程序实施步骤不能被这种改变所打断,注意确保程序步骤在重映射前后承接关系。存放器地址分配是很灵活,能够将I/O操作映射成内存操作,也能够经过映射对一些不可访问地址空间进行保护等。进行存放器初始化设计时,一定要依据应用程序具体要求来完成地址分配。对地址管理经
8、过MMU即存放器管理单元实现。在ARM系统中,MMU经过页式虚拟存放管理,将虚拟空间和物理空间分别分成一个个固定大小页,并建立二者之间映射关系,从而实现虚拟地址到物理地址转换。MMU还可完成存放器访问权限控制和虚拟存放器空间缓冲特征设置。以下是实现MMU部分代码:for=(i=1;i0x1000;i+)pagetablei=(i20)|MMU_SECDESC; /建立页表,每页大小为1MB,页表偏移序号是物理地址高12位;for(addr=SDRAM_BASE;addr20=addr|MMU_SECDESE|MMU_CACHEABLE|MMU_BUFFERABLE;/将SDRAM_BASE至(
9、SDRAM_BASE+SDRAM_SIZE/2)空间设置为不可CACHE和不可BUFFERfor(addr=SDRAM_BASE+SDRAM_SIZE/2;addr20=(addr+0x1000000)|MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE;/将这段空间地址映射关系设置为VA(虚拟地址)=PA(物理地址)+0x1000000pagetable0=(0x42f00000)|MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE;/将SDRAM虚拟地址0x42f00000映射到0处15 ARM开发教程之初始化各模式下堆栈指针因为
10、ARM处理器有7种实施状态,每一个状态堆栈指针寄存器(SP)全部是独立(System和User三项式使用相同SP寄存器)。所以,对程序中需要用到每一个模式全部要给SP寄存器定义一个堆栈地址。方法是改变状态寄存器(CPSR)内状态位,使处理器切换到不一样状态,然后给SP赋值。这里列出代码定义了三种模式SP指针,其中,I_Bit表示IRQ中止严禁位;F_Bit表示FIQ中止严禁位:;Set up SVC stack to be 4K on top of zero-init dataLDR r1,=installStackADDsp,r1,#2048;Set up IRQ and FIQ stack
11、sMOV r0,#(Mode_IRQ32|I_Bit)MSRcpsr,r0MOV r0,r0ADDsp,r1,#2048*2MOV r0,#(Mode_FIQ32|I_Bit |F_Bit)MSR cpsr,r0MOV r0,r0ADDsp,r1,#2048*3通常堆栈大小要依据需要而定,不过要尽可能给堆栈分配快速和高带宽存放器。堆栈性能提升对系统性能影响是很显著。16 ARM开发教程之初始化有特殊要求端口、设备有些关键I/O部件必需在使能IRQ和FIQ之前进行初始化。因为假如在使能IRQ和FIQ之前没有进行初始化,能够产生假异常中止信号。程序中初始化了HMS30C7202串口1用来调试程序和
12、其它设备通信。串口1是一个通用全双工异步接收/发送器(UART),它支持16C550大部分功效。UART有接收缓冲/发送保持寄存器、波特率除数锁存器、中止许可寄存器等9个寄存器。对串口1初始化关键是对各寄存器设置,其实现代码以下所表示:_outb(ser_base+0x30,1);_outw(0x8002301c,0xffff9f9f) ;GPIO PORT A EnableRegister_outw(0x800230A4,0x6060) ;GPIO PORT A MultiFunction elect-Registerserial_outb(SERIAL_LCR,0x80);serial_o
13、utb(SERIAL_LCR,0x80);serial_outb(SERIAL_DLL,baud_datacur_baud);serial_outb(SERIAL_DLM,0x0);serial_outb(SERIAL_LCR,0x03);seial_outb(SERIAL_FCR,0x01);serial_outb(SERIAL_IER,0x00);serial_outb(SERIAL_MCR,0x03);1.7 切换处理器模式,开中止最终转换到应用程序运行所需最终模式,通常是User模式。不要过早切换到User模式进行User模式堆栈设备。因为进入User模式后就不能再操作CPRS回到别模
14、式了,可能会对接下去程序实施造成影响。这时才使能异常中止,经过清除CPRS寄存器中中止严禁位实现。假如过早地开中止,在系统初始化之前就触发了有效中止,会造成系统死机。18 呼叫主应用程序当全部系统初始化工作完成后,就需要把程序步骤转入主应用程序。2 ARM开发教程之技术难点分析21 多个语言混合编程ARM有两种汇编指令集:16位THUMB指令集和32位ARM指令集。使用16位寄存器能够降低成本,而且16位THUMB指令集整体实施速度比ARM 32位指令集快,提升了代码密度。为了满足ARM子程序和Thumb子程序相互调用,必需确保编写代码遵照ATPCS。ATPCS要求了子程序调用基础规则。ARM
15、系统结构也支持C、C+和汇编语言混合编程。汇编语言和C/C+语言混合编程,在一个追求效率程序中比较常见。很多人认为像BSP这么底层程序应该用纯汇编语言编写,其实不然。用汇编语言编写程序可读性不高,而且不宜维护,不便于向其它类型CPU移植,而这些方面却是C语言程序优势。BSP能否用纯C语言去写呢?也不行。因为一些操作是用C实现不了。比如操作特殊寄存器指令、CP15寄存器指令、中止使能及堆栈地址设定等。在汇编和C/C+之间函数调用时,也要遵照ATPCS定义,还要注意是用C语言编写嵌入式程序时,要避免使用不能被固化到ROM中库函数。混合编程情况下程序编译及链接后输出代码和没有混合编程时是不一样。所以
16、当多个源文件假如使用了不一样设置进行编译,相互之间调用可能产生兼容性问题,对此一定要加以仔细考虑。编译时,要告诉编译器和链接器足够信息,首先,让编译器能够使用正确指令码进行编译;其次,在不一样状态之间发生函数调用时,链接器将插入一段链接代码(veneers)来实现实状况态转换。22 MMU实现过程页表是实现MMU关键手段。页表存放在内存中,从虚拟地址到物理地址变换过程其实就是查询页表过程。大小为1MB存放块通常被称为段,图2说明了怎样查表进行段式寻址全过程:32位虚拟地址可分为12位一级页表序号和20位段内地址偏移。12位一级页表序号和CP15寄存器C2中18位变换表基址合并成一级描述符地址查表找出对应一级描述符;然后,段对应物理基地址和段内地址偏移量合并成为真正存放器存取地址即物理地址,读出对应数据。本文介绍BSP程序已经在以HMS30C7202为主芯片开发系统上运行并测试经过,而且成功地引导了Linux内核,文中引用代码能够直接使用。以后能够在此基础上添加命令行解释程序,在引导操作系统前进行存存放器读写等,扩展开发系统功效。起源:中国IT试验室 责编:coco千锋3G学院:千锋嵌入式学院: