教材:嵌入式系统及应用,罗蕾、李允、陈丽蓉等,电子工业出版社
ARM 程序设计
- 由于 C 语言便于理解,有大量的支持库,所以它是当前 ARM 程序设计所使用的主要编程语言
- 对硬件系统的初始化、CPU 状态设定、中断使能、主频设定以及 RAM 控制参数初始化等 C 程序力所不能及的底层操作,还是要由汇编语言程序来完成
- ARM 程序通常是 C/C++ 语言和汇编语言的混合程序
ARM 工程
- 一个ARM工程应由多个文件组成,其中包括
- 扩展名为 .S 的汇编语言源文件
- 扩展名为 .C 的C语言源文件
- 扩展名为 .CPP 的C++源文件
- 扩展名为 .H 的头文件等
- 各种源文件之间的关系
- ARM 编译器生成的文件
- 各种源文件先由编译器和汇编器将它们分别编译或汇编成汇编语言文件及目标文件
- 链接器负责将所有目标文件连接成一个文件并确定各指令的确定地址,从而形成最终可执行文件
- 链接器的功能
- 生成与地址相关的代码,把所有文件连接成一个可执行文件
- 根据程序员所指定的选项,为程序分配地址空间
- 给出链接信息,以说明链接过程和结果
ARM 程序框架
- 通常汇编语言部分完成系统硬件的初始化;高级语言部分完成用户的应用
- 执行时,首先执行初始化部分,然后再跳转到 C/C++部分
初始化程序部分
- 完成初始化任务的汇编语言程序中需要在特权模式下做一些诸如修改 CPSR 等特权操作
- 初始化过程经理经历的模式变化
- 这部分代码也称为启动代码
初始化部分与主应用程序部分的衔接
当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序
最简单的方法是,在汇编语言程序末尾使用跳转指令 B 或 BL 直接从启动代码转移到 C/C++ 程序入口,如
BL main
符号
main
是C文件中定义的函数名,故在汇编文件中需要用 IMPORT 加以声明目标符号也不一定是
main
,可以是用户定义的其他符号衔接的汇编程序
IMPORT main ;声明外部引用符号 AREA Init, CODE, READONLY ;代码段 ENTRY ;程序入口 LDR R0, = 0X3FF0000 ;初始化寄存器 LDR R1, = 0XE7FFFF80 STR R1, [R0] LDR SP, = 0X3EE1000 ;初始化用户堆栈段 BL main ;跳转main处的C/C++代码 END ;汇编结束
衔接的C程序
void main() { .... }
ARM 开发环境提供的程序框架
- 为方便工程开发,ARM 公司的开发环境 ARM ADS 为用户提供了一个可以选用的应用程序框架
- 该框架把为用户程序做准备工作的程序分成了启动代码和应用程序初始化两部分
- 用于硬件初始化的汇编语言部分叫做启动代码
- 用于应用程序初始化的 C 部分叫做初始化部分
_main()
主要完成库函数的初始化,且该函数中声明了用户函数名为main
,故用户程序的函数名必须为main