嵌入式体系资源有限,程序一般都固化在ROM总运转。ROM中程序履行前,需求对体系硬件和软件运转环境进行初始化,这些作业是用汇编言语编写的发动程序完结。发动程序是嵌入式程序的最初部分,应与应用程序一同固化在ROM中,应首先在体系上运转的发动程序应包括各模块中或许呈现的一切段类,并合理安排他们的次第。
发动程序一般流程如下:
(1) 设置进口指针
(2) 设置中止向量
ARM7要求中止向量有必要设置从0地址开端,接连8*4字节的空间,分别是复位、未定义指令过错、软件中止、预取指令中止、数据存取过错、IRQ、FIQ和一个保存的中止向量
(假如ROM坐落0地址,向量表包括一系列指令跳转到中止服务程序,不然向量有必要被动态初始化。能够在发动程序中增加一段代码,使其在运转时将向量表拷贝到0地址开端的存储空间)
关于各未用的中止,用一个只包括回来指令的哑函数,以防止过错引起体系的紊乱。
(3) 初始化仓库和寄存器
取决于运用了哪些中止,一般体系需求处理哪些过错类型。一般来说办理者仓库有必要设置,假如运用了IRQ中止,则IRQ仓库有必要设置。
假如体系运用了DRAM或许其他的外设,则需求设置相关的寄存器,以确认其改写频率,数据总线宽度等信息
(4) 初始化存储器体系
有些芯片可经过寄存器编程初始化存储器体系,而关于杂乱体系一般集成了MMU来办理内存
(5) 假如有必要改动处理器形式、状况
假如体系应用程序是运转在用户形式下,可在此处将体系改为用户形式并初始化用户的仓库指针。
(6) 初始化C言语所需求的存储器空间
为正确运转应用程序,在初始化期间应将体系需求读写的数据和变量从ROM拷贝到RAM里;一些要求快速呼应的程序,如中止处理程序,也需求在RAM中运转; 假如运用FLASH,对FALSH的檫除和写入也必定要在RAM里运转。ARM公司软件开发工具包中的链接器供给了散布装载的功用,能够完成这一意图。
(7) 呼叫C言语
ARM有两种指令集:16位的Thumb指令集和32位的指令集。运用16位的存储器能够降低成本,在这种状况下,Thumb指令集的全体履行速度要比ARM32位指令团体,并且提高了代码密度,所以一般用Thumb 编译器将C言语 程序编译成16位代码。
处理器在一开端总是处于ARM状况,可运用BX指令转化到Thumb状况呼喊C言语程序,要注意的是用C言语编写的嵌入式程序时,要防止运用不能被固化到ROM的库函数。
技能难点剖析
(1) MMU的运用
MMU 是存储器办理单元的缩写,是用来办理虚拟内存体系的器材。MMU一般是CPU的一部分,自身有少数的存储空间寄存从虚拟地址到物理地址的匹配表。此表称作TLB(转化旁置缓冲区)。一切数据恳求都送往MMU,由MMU决议数据只在RAM中仍是在大容量的存储器设备内。假如数据不在存储空间内,MMU将发生页面过错中止
MMU的两个主要功用是:
将虚拟地址转化为物理地址
操控存储器存取答应。MMU关掉时,虚地址直接输出到物理地址总线。
在实践中,运用MMU处理了以下几个问题:
a. 运用DRAM作为大容量存储器时,假如DRAM队伍对错平方的,会导致该DRAM的物理地址不接连,这将给程序的编写调试形成极大的不方便,而恰当的装备MMU可将其转化成虚拟地址接连的空间
b. ARM内核的中止向量表放在0地址,关于ROM在0地址的状况,无法调用中止服务程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址。
c. 体系的某些地址是不答应被拜访的,不然会发生不行意料的结果,为防止这类过错,能够经过MMU匹配表的设置将这些地址设为用户不能够存取类型;
d. 发动程序中生成的匹配表中包括地址映射,存储页面巨细(1M、64K 或许4K)以及是否答应存取等信息。