您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

基于ARM体系的嵌入式体系BSP的步伐计划

发布日期:2011-04-23


    ARM公司在32位RISC的CPU开辟范畴不绝获取突破,其布局已经从V3生长到V6。 

    BSP(Board Support Package)板级支持包介于主板硬件和操纵体系之间,其成果与PC机上的BIOS相雷同,重要完成硬件初始化并切换到相应的操纵体系。BSP是相对付操纵体系而言的,差别的操纵体系映射于差别定义情势的BSP,比方VxWorks的BSP和Linux的BSP相对付某一CPU来说,只管实现的成果一样,但是写法和接口定义是完全差别的。别的,细致研究所用的芯片数据也非常紧张,比方只管ARM在内核上兼容,但每家芯片都有本身的特色。以是这就请求BSP步伐员对硬件、软件和操纵体系都要有肯定的相识。 

    本文先容基于ARM体系的嵌入式应用体系初始化部分BSP的步伐计划。本文引用的源码全部是基于HMS320C7202芯片计划,并已告成运行。

  1 初始化进程 

    只管种种嵌入式应用体系的布局及成果差别很大,但其体系初始化部分完成的操纵有很大一部分是相似的。嵌入式体系的启动流程如图1所示。 

    1.1 设置入口指针 

    启动步伐起首必须定义指针,并且整个应用步伐只有一个入口指针。一样平常地,步伐在编译链接时将非常停止向量表链接在0地点处,并且作为整个步伐入口点。入口点代码如下: 

    ENTRY(_start) ;开始 

    1.2 设置非常停止向量表 

    ARM请求停止向量表必须安排在从0开始、连续8×4字节的空间内。各别常停止向量地点以及停止的算是优先级如表1:

停止向量地点 非常停止范例 非常停止模式 优先级(6最低)
0x0 复位 特权模式(SVC) 1
0x4 未定义停止 未定义指令中断模式(Undef) 6
0x8 软件停止(SWI) 特权模式(SVC) 6
0x0c 指令预取中断 中断模式 5
0x10 数据访问中断 中断模式 2
0x14 保存 未利用 未利用
0x18 外部停止恳求(IRQ) 外部停止(IRQ)模式 4
0x1c 快速停止恳求(FIQ) 快速停止(FIQ)模式 3

                                               表1 各别常停止的停止向量地点以及停止的处理惩罚优先级 

    停止向量地点 非常停止范例 非常停止模式 优先级(6最低) 
    0x0 复位 特权模式(SVC) 1 
    0x4 未定义停止 未定义指令中断模式(Undef) 6 
    0x8 软件停止(SWI) 特权模式(SVC) 6 
    0x0c 指令预取中断 中断模式 5 
    0x10 数据访问中断 中断模式 2 
    0x14 保存 未利用 未利用 
    0x18 外部停止恳求(IRQ) 外部停止(IRQ)模式 4 
    0x1c 快速停止恳求(FIQ) 快速停止(FIQ)模式 3 

    每当一此停止产生后,ARM处理惩罚器便逼迫把步伐计数器(PC)指针置为向量表中映射停止范例的地点值。由于每此停止向量仅占据安排1条ARM指令的空间,以是通常安排1条跳转指令或向步伐计数器(PC)寄存器赋值的数据访问指令,使步伐跳转到相应的非常停止处理惩罚步伐实行。要是非常停止处理惩罚步伐肇始地点小于32MB,利用B跳转指令;要是跳转范畴大于32MB,利用LDR指令。 

    别的,对付各未用停止,可使其指向一个只含返回指令的哑函数,以防备错误停止引起体系的紊乱。 

    1.3 初始化存储体系 

    初始化存储体系的编程东西是体系的存储器控制器,一个体系大概存在多种存储器范例的接口,差别的存储体系的计划不尽雷同。Flash和SRAM同属于静态存储器范例,可以实用一个存储器端口;而DRAM由于有动态革新和地点线复用等特性,通常配有专用的存储器端口。此中,SDRAM必须在初始化阶段举行设置,由于大部分的步伐代码和数据都要在SDRAM中运行。 

    在HMS30C7202中,与SDRAM配置有关的寄存器有4个:配置寄存器、革新定时寄存器、写缓冲写回寄存器和等待驱动寄存器,必要根据实际的体系计划对此分别加以精确配置。 

    SDRAM的初始化进程如下:加电→耽误10ms(各详细SDRAM器件延时时间大概差别)→设置配置寄存器参数→延时→写革新定时寄存器,设置革新周期→延时→使能主动革新→延时→设置模式寄存器(位于SDRAM内部)。 

    1.4 存储器地点散布重映射(remap)和MMU 

    系同一上电,步伐将主动从0地点处开始实行。因此,必须包管在0地点处存在精确的代码,即请求0地点开始入黑白易失性的ROM或Flash等。但是由于ROM或Flash的访问速率相对较慢,每次停止相应产生后,都要从读取ROM或Flash上面的向量表开始,影响了停止相应速率。一样平常步伐实行后将SDRAM映射为地点0,并把体系步伐加载到SDRAM中运行,其详细步调可以采取以下的方案: 

    (1)上电后,从0地点的ROM开始往下实行; 

    (2)根据映射前的地点,对SDRAM举行须要的代码和数据拷贝; 

    (3)拷贝完成后,举行重映射操纵; 

    (4)由于RAM在重映射前准备好了内容,使得PC指针能连续在RAM里获取精确的指令。 

    在这种地点映射的变革进程中,步伐员必要细致思量的是:步伐的实行流程不克不及被这种变革所打断,细致包管步伐流程在重映射前后的承接干系。 

    存储器的地点分派是很机动的,可以将I/O操纵映射成内存操纵,也可以通过映射对某些不可访问的地点空间举行掩护等。举行存储器初始化计划时,肯定要根据应用步伐的详细请求来完成地点分派。对地点办理通过MMU即存储器办理单位实现。 

    在ARM体系中,MMU通过页式假造存储办理,将假造空间和物理空间分别分成一个个牢固大小的页,并创建两者之间的映射干系,从而实现假造地点到物理地点的转换。MMU还可完成存储器访问权限的控制和假造存储器空间缓冲特性的设置。 

    以下是实现MMU的部分代码: 

    for=(i=1;i<0x1000;i++){pagetable[i]=(i<<20)|MMU_SECDESC;} //创建页表,每页大小为1MB,页表偏移序号是物理地点的高12位; 

    for(addr=SDRAM_BASE;addr<(SDRAM_BASE+SDRAM_SIZE/2);addr+=SIZE_1M) 

    pagetable[addr>>20]=addr|MMU_SECDESE|MMU_CACHEABLE|MMU_BUFFERABLE; 

    //将SDRAM_BASE至(SDRAM_BASE+SDRAM_SIZE/2)空间的设置为不可CACHE和不可BUFFER的for   
(addr=SDRAM_BASE+SDRAM_SIZE/2;addr<    (SDRAM_BASE+SDRAM_SIZE);addr+=SIZE_1M)

    pagetable[addr>>20]=(addr+0x1000000)|MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE; 

    //将这段空间的地点映射干系设置为VA(假造地点)=PA(物理地点)+0x1000000pagetable[0]=(0x42f00000)|MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE; 

    //将SDRAM的假造地点0x42f00000映射到0处 

    1.5 初始化各模式下的堆栈指针 

    由于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 data 

    LDR r1,=installStack 

    ADDsp,r1,#2048 

    @;Set up IRQ and FIQ stacks 

    MOV r0,#(Mode_IRQ32|I_Bit) 

    MSRcpsr,r0 

    MOV r0,r0 

    ADDsp,r1,#2048*2 

    MOV r0,#(Mode_FIQ32|I_Bit |F_Bit) 

    MSR cpsr,r0 

    MOV r0,r0 

    ADDsp,r1,#2048*3 

    一样平常堆栈的大小要根据必要而定,但是要尽大概给堆栈分派快速和高带宽的存储器。堆栈性能的进步对体系性能的影响黑白常明显的。 

    1.6 初始化有特别请求的端口、配置 

    有些关键的I/O部件必须在使能IRQ和FIQ之前举行初始化。由于要是在使能IRQ和FIQ之前没有举行初始化,可以孕育产生假的非常停止信号。步伐中初始化了HMS30C7202的串口1用来调试步伐与别的配置通讯。串口1是一个通用全双工异步吸取/发送器(UART),它支持16C550的大部分成果。UART有吸取缓冲/发送保持寄存器、波特率除数锁存器、停止容许寄存器等9个寄存器。对串口1的初始化重要是对各寄存器的设置,着实当代码如下所示: 

    _outb(ser_base+0x30,1); 
    
    _outw(0x8002301c,0xffff9f9f) ;GPIO PORT A Enable 

    Register 

    _outw(0x800230A4,0x6060) ;GPIO PORT A MultiFunction elect-Register 

    serial_outb(SERIAL_LCR,0x80); 

    serial_outb(SERIAL_LCR,0x80); 

    serial_outb(SERIAL_DLL,baud_data[cur_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回到别的模式了,大概会对接下去的步伐实行导致影响。 

    这时才使能非常停止,通过打扫CPRS寄存器中的停止克制位实现。要是过早地开停止,在体系初始化之前就触发了有效停止,会导致体系的去世机。 

    1.8 呼唤主应用步伐 

    当全部的体系初始化事变完成后,就必要把步伐流程转入主应用步伐。

    2 技能难点阐发

    2.1 多种语言的殽杂编程

    ARM有两种汇编指令集:16位THUMB指令集和32位ARM指令集。利用16位的寄存器可以低落本钱,并且16位THUMB指令集团体实行速率比ARM 32位指令集快,进步了代码密度。为了餍足ARM子步伐和Thumb子步伐相互调用,必须包管编写的代码依照ATPCS。ATPCS规定了子步伐调用的根本规矩。 

    ARM体系布局也支持C、C++以及汇编语言的殽杂编程。汇编语言和C/C++语言的殽杂编程,在一个寻求服从的步伐中比较常见。很多人以为像BSP如许底层的步伐应该用纯汇编语言编写,着实不然。用汇编语言编写的步伐可读性不高,并且不宜维护,不便于向别的范例的CPU移植,而这些方面倒是C语言步伐的上风。BSP可否用纯C语言去写呢?也不可。由于某些操纵是用C实现不了的。比方操纵特别寄存器的指令、CP15寄存器的指令、停止使能及堆栈地点的设置等。在汇编和C/C++之间的函数调用时,也要依照ATPCS的定义,还要细致的是用C语言编写嵌入式步伐时,要克制利用不克不及被固化到ROM中的库函数。 

    殽杂编程环境下的步伐编译及链接后的输出代码与没有殽杂编程时是差别的。以是当多个源文件要是利用了差别的设置举行编译,相互之间的调用大概孕育产生兼容性题目,对此肯定要加以细致思量。编译时,要报告编译器和链接器充足的信息,一方面,让编译器可以或许利用精确的指令码举行编译;另一方面,在差别的状态之间产生函数调用时,链接器将插入一段链接代码(veneers)来实近况态转换。 

    2.2 MMU的实现进程 

    页表是实现MMU的紧张本领。页表存放在内存中,从假造地点到物理地点的更改进程着实便是查问页表的进程。大小为1MB的存储块通常被称为段,图2阐明白怎样查表举行段式寻址的全进程:32位的假造地点可分为12位的一级页表序号和20位的段要地本地点偏移。12位的一级页表序号和CP15寄存器的C2中的18位更改表基址归并成一级形貌符地点查表找出相应的一级形貌符;然后,段映射的物理基地点与段要地本地点偏移量归并成为真正的存储器存取地点即物理地点,读出相应数据。 

    本文先容的BSP步伐已经在以HMS30C7202为主芯片的开辟体系上运行并测试通过,并且告成地引导了Linux内核,文中引用代码可以直接利用。以后可以在此底子上添加下令行表明步伐,在引导操纵体系前举行存存储器的读写等,扩展开辟体系的成果。