1.发动程序流程
嵌入式体系的资源有限,程序一般都是固化在ROM中运转。ROM中程序履行前,需求对体系硬件和软件运转环境进行初始化,这些作业由用汇编言语编写的发动程序完结。
发动程序是嵌入式程序的最初部分,应与使用程序一同固化在ROM中,并首要在体系上运转。它应包括进各模块中或许呈现的一切段类,并合理安排它们的次第。
写好发动程序是设计好嵌入式程序的要害,体系发动程序所履行的操作依赖于正在开发其软件的体系,一般流程如下:
2.具体过程
⑴设置进口指针
发动程序首要有必要界说进口指针,并且整个使用程序只要一个进口指针。
设置中止向量
ARM7要求中止向量表有必要设置在从0地址开端,接连8×4字节的空间,分别是复位、未界说指令过错、软件中止、预取指令过错、数据存取过错、IRQ、FIQ和一个保存的中止向量。
ARM7要求中止向量表有必要设置在从0地址开端,接连8×4字节的空间,分别是复位、未界说指令过错、软件中止、预取指令过错、数据存取过错、IRQ、FIQ和一个保存的中止向量。
假如ROM定坐落0地址,向量表包括一系列指令跳转到中止服务程序,不然向量有必要被动态初始化。能够在发动程序中增加一段代码,使其在运转时将向量表复制到0地址开端的存储器空间。
关于各未用中止,使其指向一个只含回来指令的哑函数,以防止过错中止引起体系的紊乱。
初始化仓库和寄存器
体系仓库初始化取决于用户运用了哪些中止,以及体系需求处理哪些过错类型。一般来说办理者仓库有必要设置,假如运用了IRQ中止,则IRQ仓库也有必要设置。
体系仓库初始化取决于用户运用了哪些中止,以及体系需求处理哪些过错类型。一般来说办理者仓库有必要设置,假如运用了IRQ中止,则IRQ仓库也有必要设置。
假如体系运用了DRAM或其它外设,需求设置相关的寄存器,以确认其改写频率,数据总线宽度等信息。
初始化存储器体系
有些芯片可经过寄存器编程初始化存储器体系,而关于较杂乱体系一般集成有MMU来办理内存空间。
⑸ 如有必要改动处理器形式、状况
假如体系使用程序是运转在用户形式下,可在此处将体系改为用户形式并初始化用户仓库指针。
初始化C言语所需的存储器空间。
为正确运转使用程序,在初始化期间应将体系需求读写的数据和变量从ROM复制到RAM里;一些要求快速呼应的程序,如中止处理程序,也需求在RAM中运转;假如运用FLASH,对FLASH的擦除和写入操作也必定要在RAM里运转。ARM公司软件开发工具包中的链接器供给了散布装载功用,能够完结这一意图。
为正确运转使用程序,在初始化期间应将体系需求读写的数据和变量从ROM复制到RAM里;一些要求快速呼应的程序,如中止处理程序,也需求在RAM中运转;假如运用FLASH,对FLASH的擦除和写入操作也必定要在RAM里运转。ARM公司软件开发工具包中的链接器供给了散布装载功用,能够完结这一意图。
呼叫C程序。
ARM有两种指令集:16位THUMB指令集和32位ARM指令集。运用16位的存储器能够降低成本,在这种状况下,Thumb指令集的全体履行速度比ARM32位指令集快,并且提高了代码密度,所以一般用Thumb编译器将C言语程序编译成16位的代码。处理器一开端总在arm状况,可运用BX指令转化到thumb状况呼叫C程序。要注意的是用C言语编写嵌入式程序时,要防止运用不能被固化到ROM中的库函数。
3.技能难点剖析
⑴.MMU的运用
MMU是存储器办理单元的缩写,是用来办理虚拟内存体系的器材。MMU一般是CPU的一部分,自身有少数存储空间寄存从虚拟地址到物理地址的匹配表。此表称作TLB(转化旁置缓冲区)。一切数据恳求都送往MMU,由MMU决议数据是在RAM内仍是在大容量存储器设备内。假如数据不在存储空间内,MMU将发生页面过错中止。
MMU的两个主要功用是:
将虚地址转化成物理地址。
操控存储器存取答应。MMU关掉时,虚地址直接输出到物理地址总线。
在实践中,运用MMU处理了如下几个问题:
操控存储器存取答应。MMU关掉时,虚地址直接输出到物理地址总线。
在实践中,运用MMU处理了如下几个问题:
①运用DRAM作为大容量存储器时,假如DRAM的队伍对错平方的,会导致该DRAM的物理地址不接连,这将给程序的编写调试形成极大不方便,而恰当装备MMU可将其转化成虚拟地址接连的空间。
②ARM内核的中止向量表要求放在0地址,关于ROM在0地址的状况,无法调试中止服务程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址。
③体系的某些地址段是不答应被拜访的,不然会发生不行意料的结果,为了防止这类过错,能够经过MMU匹配表的设置将这些地址段设为用户不行存取类型。
发动程序中生成的匹配表中包括地址映射,存储页巨细(1M,64K,或4K)以及是否答应存取等信息。
例如:方针板上的16兆DRAM的物理地址区间为0xc000,0000~0xc07f,ffff;0xc100,0000~0xc17f,ffff;16兆ROM的虚拟地址区间为:0x0000,0000~0x00ff,ffff。匹配表装备如下:
能够看到左面是接连的虚拟地址空间,右边是不接连的物理地址空间,并且将DRAM映射到了0地址区间。MMU经过虚拟地址和页面表方位信息,依照转化逻辑取得对应物理地址,输出到地址总线上。
应注意到的是使能MMU后,程序持续运转,可是关于程序员来说程序计数器的指针现已改动,指向了ROM所对应的虚拟地址。
⑵方针文件的散布装载剖析
首要创立一个文本文件,称为散布装载描绘文件。它为使用程序的各部分指定装载区间和履行区间。
举例如下:
FLASH 0x01000000 0x011fffff ;2M FLASH
{
FLASH 0x01000000
{
boot.o(BOOT,+First)
* (+RO)
}
DRAM 0x00000000
{
vector.0(VECTOR,+First)
int_handler.o (+RO)
* (+RW,+ZI)
}
}
在ARM链接器的命令行里参加“-scov description-file–scf”或“-scatterdescription-file”,编译链接后,将发生一个散布装载文件。
链接器一起发生一组符号,给出每个散布描绘文件中命名的区间的长度,装载地址和履行地址。因为链接器和C库都没有将代码从它的装载区间复制到履行区间,或创立一个零初始化区域的功用,所以要由使用程序员使用这组符号发生的信息完结这项作业,这是在呼叫C程序之前有必要完结的,举例如下:
LDR r0, = |Load$$DRAM$$Base|
LDR r1, = |Image$$DRAM$$Base|
CMP r0, r1 ; 查看装载地址和履行地址是否相同
BEQ do_zi_init ; 相同,则不复制该区间,初始化零数据区
MOV r2, r1 ; 不相同,将装载区复制到履行区
LDR r4, = |Image$$DRAM$$length|
ADD r2, r2, r4
BL copy
do_zi_init
LDR r1, = |Image$$DRAM$$ZI$$Base|
MOV r2, r1
LDR r4, = |Image$$DRAM$$ZI$$length|
ADD r2, r2, r4
MOV r3, #0
BL zi_init ; 调用零初始化子程序
4.结束语:
本文介绍的发动程序现已在以CirrusLogic公司的EP7211和Ateml公司的AT91M40400开发的体系上运转并测试经过。往后能够在这一基础上增加串行通讯模块和FLASH操作模块,开发体系监控程序,然后完结使用程序的在线晋级。