嵌入式Linux裸机开发笔记3(IMX6ULL)—C语言实现LED实验(1)

引言

        上次笔记我们讲解了完了如何用汇编语言编写 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 初始化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值