1、arm 开发经验一前一段时间做了 arm 的一些开发,主要是编写了 arm 的启动软件和移植了 uCOS-II 到arm7。我做事情喜欢深入简出,及从最简单,最原理的方面先做一个框架,然后在这个框架里面进行补充。我还是一个很喜欢和别人讨论的人,希望有人可以给我提出意见和建议。我的这个心得很初级,都是一些基本的东西。现在拿出来和大家分享 ,希望在我毕业之前能给大家留一些纪念。_由于这些东西发 paper 实在是没有价值,但是我感觉可以作为 arm 开发的入门。由于我的水平和经验有限,错误也是难免的。但是如果不拿出来和大家分享 , 就算有错误我也发现不了,是么?呵呵。我现试试发连载的第一篇,看看有
2、多少价值,如果大家觉得有价值, 我会继续连载的。连载一:前言这个文档是我学习 ARM 编程的总结和心得。阅读这个文档的人应当首先阅读 ADS1.2的帮助文档及相关内容。这个文档不会对编译器及连接器做出详细的说明, 在需要的时候会指出具体内容在相关资料的章节。同时阅读这个文档的人需要了解 ARM 指令集和一些ARM 汇编的基本内容以及 C 和 C+的相关编程内容。同时还需要了解 ARM 的流水线结构及一些基本的编程知识。同时为了方便查阅英文文档,所有的相关术语都使用英文原文第一章 STARTUP1 ARM 的启动一般的嵌入式系统在主程序执行之前都需要执行一些初始化的过程以创造嵌入式程序运行的环境
3、,尤其是一些高级的嵌入式系统,由于核心芯片使用内存映射、内存保护等机制以及编程使用高级语言 C,C+甚至 JAVA 语言,都需要先创建一个适合程序运行的硬件环境, 然后初始化或者配置或者剪裁 run-time library, 这些工作都必须在主程序运行前完成,所以一个startup 程序或者程序组对于一个嵌入式系统来说是非常重要的。要编写 startup 程序,需要对编译器、链接器和汇编器的细节有一定的了解,同时对 ARM 芯片硬件本身的地址分配以及 memory mapping 机制也需要有一些了解。2 ARM 程序的工作过程首先由各种 source file 经过编译产生 object
4、文件,然后 object 文件经过链接生成 Image文件,然后通过 ICE 的方法,根据描述文件的指定下载到目标板上的固态存储器指定地址当中,比如 flash,EEPROM, ROM 等等。在程序执行之前,根据某些描述文件 ,将需要读写数据的部分读出放入动态存储器比如 RAM 当中,然后程序从 ROM 开始执行。或者有时为了提高程序的运行速度,也可以将所有的程序(有一些 root 的部分除外,以后会提及) 通过一个描述文件放入指定的 RAM 当中,然后程序从 RAM 开始执行,但是这样会耗费大量的动态存储器,所以大部分程序会取折中的方法,将需要快速运行的部分和要读写的部分放入 RAM 中(一
5、般读固态存储器的过程和动态存储器的过程是一样的,但是写就不同了 ,所以读写的部分一定要放到 RAM 中),而只读的部分和对速度要求不是那么高的部分放入固态存储器。同时 ARM结构的异常向量表规定放在地址为 0x00000000 开始的地址空间上,而一般的 CPU 为了提高异常相应速度,会将这个向量段 remap 到其他的 RAM 当中,所以在描述文件当中必须精确指定异常向量跳转程序的地址到 remap 的地方。在 application 程序执行前,还需要由一些文件描述 application 程序执行的环境。比如系统工作时钟,总线频率。现在一般嵌入式编程语言为 C,C+等。如果在使用它们的时
6、候使用的 runtime-library,那么在程序执行前还需要为这些库函数初始化 heap。然后 ARM 可能工作在不同的模式,还需要为不同的工作模式设置stack。这样,描述链接地址的文件,以及在 application 运行前所有的初始化程序就是startup 程序组3 STARTUP 分类这样,将 startup 程序所完成的功能分类。一类是链接地址描述 ,一类是各种初始化的程序。根据不同的应用,描述文件和初始化程序的内容以及结构和复杂程度都会不同。但是基本上 ,它们都必须实现以下功能。3.1 描述文件实现功能描述文件可以是链接命令行上简单的几个字符,也可以是一个非常复杂的文件 ,但是它必须完成如下功能:指定程序下载的地址指定程序执行的地址3.2 初始化程序实现的功能初始化程序根据不同的应用,其结构和复杂度也不同,但是它必须完成如下基本功能:异常向量初始化内存环境初始化其他硬件环境初始化