引言
上次笔记我们讲解了完了如何用汇编语言编写 LED
灯实验,但是实际开发过程中汇编用的很少, 大部分都是 C
语言开发,汇编只是用来完成
C
语言环境的初始化。本章我们就来学习如何用汇 编来完成 C
语言环境的初始化工作,然后从汇编跳转到
C
语言代码里面去。
3.1 C 语言版 LED 灯简介
实际工作中 是很少用到汇编去写嵌入式驱动的,毕竟汇编太难,而且写出来也不好理解,大部分情况下都 是使用 C 语言去编写的。只是在开始部分用汇编来初始化一下
C
语言环境,比如初始化
DDR
、 设置堆栈指针 SP
等等,当这些工作都做完以后就可以进入
C
语言环境,也就是运行
C
语言代码,一般都是进入 main
函数。所以我们有两部分文件要做:
①、汇编文件
汇编文件只是用来完成 C 语言环境搭建。
②、C
语言文件
C 语言文件就是完成我们的业务层代码的,其实就是我们实际例程要完成的功能。
其实 STM32
也是这样的,只是我们在开发
STM32
的时候没有想到这一点,以
STM32F103
为 例,其启动文件 startup_stm32f10x_hd.s
这个汇编文件就是完成
C
语言环境搭建的,当然还有一 些其他的处理,比如中断向量表等等。当 startup_stm32f10x_hd.s
把
C
语言环境初始化完成以后 就会进入 C
语言环境。
3.2 实验程序编写
3.2.1 汇编部分实验程序编写
I.MX6U 的汇编部分代码和
STM32
的启动文件
startup_stm32f10x_hd.s
基本类似的,只是本
实验我们不考虑中断向量表,只考虑初始化
C
环境即可。在前面创建的
start.s
中输入如下代码:
1
.
global _start
/*
全局标号
*/
2
3
/*
4
*
描述:
_start
函数,程序从此函数开始执行,此函数主要功能是设置
C
5
*
运行环境。
6
*/
7
_start
:
8
9
/*
进入
SVC
模式
*/
10
mrs r0
,
cpsr
11
bic r0
,
r0
,
#
0x1f
/*
将
r0
的低
5
位清零,也就是
cpsr
的
M0~M4 */
12
orr r0
,
r0
,
#
0x13
/* r0
或上
0x13,
表示使用
SVC
模式
*/
13
msr cpsr
,
r0
/*
将
r0
的数据写入到
cpsr_c
中
*/
14
15
ldr sp
, =
0X80200000
/*
设置栈指针
*/
16
b main
/* 跳转到
main
函数
*/
第 1 行定义了一个全局标号
_start
。
第 7 行就是标号
_start
开始的地方,相当于是一个
_start
函数,这个
_start
就是第一行代码。
第 10~13 行就是设置处理器进入
SVC
模式,在
6.2
小节的“
Cortex-A
处理器运行模型”中
说过Cortex-A 有九个运行模型,这里我们设置处理器运行在
SVC
模式下。处理器模式的设置是通过修改 CPSR(
程序状态
)
寄存器来完成的,在
6.3.2
小节中我们详细的讲解了
CPSR
寄存器,其中M[4:0](CPSR
的
bit[4:0])
就是设置处理器运行模式的,参考表
6.3.2.2
,如果要将处理器设置为 SVC
模式,那么
M[4:0]
就要等于
0X13
。
11~13
行代码就是先使用指令
MRS
将
CPSR 寄存器的值读取到 R0
中,然后修改
R0
中的值,设置
R0
的
bit[4:0]
为
0X13
,然后再使用指令MSR 将修改后的
R0
重新写入到
CPSR
中。
第 15
行通过
ldr
指令设置
SVC
模式下的
SP
指针
=0X80200000
,因为
I.MX6U-ALPHA
开发板上的DDR3地址范围是0X80000000~0XA0000000(512MB) 或者
0X80000000~0X90000000(256MB)
,不管是
512MB
版本还是
256MB
版本的,其 DDR3 起始地 址都是0X80000000。由于Cortex-A7
的堆栈是向下增长的,所以将
SP
指针设置为
0X80200000
, 因此 SVC
模式的栈大小
0X80200000-0X80000000=0X200000=2MB
,2MB的栈空间已经很大了,如果做裸机开发的话绰绰有余。
第 16
行就是跳转到
main
函数,
main
函数就是
C
语言代码了。
至此汇编部分程序执行完成,就几行代码,用来设置处理器运行到 SVC
模式下、然后初始化SP
指针、最终跳转到
C
文件的
main
函数中。如果有玩过三星的
S3C2440
或者
S5PV210
的话会知道我们在使用 SDRAM
或者
DDR
之前必须先初始化
SDRAM
或者
DDR
。所以
S3C2440或者 S5PV210
的汇编文件里面是一定会有
SDRAM
或者
DDR
初始化代码的。我们上面编写的 start.s 文件中却没有初始化
DDR3
的代码,但是却将
SVC
模式下的
SP
指针设置到了
DDR3
的 地址范围中,这不会出问题吗?肯定不会的,DDR3
肯定是要初始化的,但是不需要在
start.s
文 件中完成。在 9.4.2
小节里面分析
DCD
数据的时候就已经讲过了,
DCD
数据包含了
DDR
配置参数,I.MX6U
内部的
Boot ROM
会读取
DCD
数据中的
DDR
配置参数然后完成
DDR
初始化。