本博文记录【I.mx6ull】之-----代码的编译过程
文章目录
1. I.mx6ull 启动分析
比如,裸机的例程是在SD卡中,板子上电后:
I.MX6U
的内部boot rom
将可执行文件拷贝到 链接地址处- 链接地址可以是
I.MX6U
内部的128KB
的RAM
0X900000~0X91FFFF
- 链接地址也可以是
I.MX6U
外部的512MB
的DDR
中0X80000000 - 0X80000000
- 链接地址可以是
2. 汇编语言驱动开发板代码编译过程
2.1 将汇编语言依次编译为 .bin 文件的过程
用汇编语言编写 led.s
文件,用于循环点亮 LED
灯,代码的编译过程如下。
首先,I.mx6ull
是 ARM
系列芯片,需要用交叉编译器在 Ubuntu
上编译出可以在 ARM
开发板上执行的文件,交叉编译器 arm-linux-gnueabihf-gcc
led.s → led.o → led.elf → led.bin
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis
1️⃣ : 将 led.s 编译为 led.o 文件
- -c 表示编译但是不链接,
- -g 表示生成调试信息
- -o 表示指定编译产生的文件名字
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
2️⃣ : 将 led.o 文件链接到某个地址,生成 led.elf文件
- -Ttext 就是指定链接地址
- “-o”选项指定链接生成的 elf 文件名
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
3️⃣ : 将led.elf文件转化为 led.bin 文件
- “-O”选项指定以什么格式输出,
- “ binary”表示以二进制格式输出,
- “-S”表示不要复制源文件中的重定位信息和符号信息,
- “-g”表示不复制源文件中的调试
信息。
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
4️⃣ :补充,反汇编,
“-D”选项表示反汇编所有的段
arm-linux-gnueabihf-objdump -D led.elf > led.dis
2.2 Makefile 文件的必要性
由于以上步骤每次修改完代码都执行一遍很麻烦,因此将几个命令行放入 Makefile
文件中,每次修改完之后,值执行make
命令即可
led.bin:led.s
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:
rm -rf *.o led.bin led.elf led.dis
注意:关于 Makefile 语法请参考: 【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.71 第3.3 和 3.4 小节
- 文件解释为 led.bin 文件生成 led.s 文件依赖于以下4个命令
- arm-linux-gnueabihf-gcc 为命令行,必须以 TAB 开头(要设置TAB为4个制表符)
3 .C语言驱动开发板底层过程
- 汇编文件:完成各种初始化,即跳转到C语言之前的环境搭建
- C语言文件:实际的逻辑功能
先运行汇编语言,从汇编语言跳转到C语言。
4. MCU 与 DDR 的几个问题
1️⃣:为什么MCU
要外接DDR
?
鉴于高性能MCU设计的集成度,以及芯片的体积问题, 一般的单片机自带的RAM都比较小,比如 I.MX6U
只有 128KB
的 OCRAM
。 只有这么一点内存空间,运行Linux
系统是肯定不够的,所以MCU
一般会外接一颗RAM
芯片。本博文记录I.MX6U-ALPHA
开发板上的这片 DDR3
的驱动过程。
2️⃣:DDR是什么,通俗的讲?
DDR 是一种 RAM,可以直接和CPU通信,读写速度很快,但是内容掉电丢失,因此容量不容易做得很大。如256MB/512MB
的 DDR3
就是 RAM
,而 512MB
NAND Flash
或 8GB EMMC
就是 ROM
。
3️⃣ :常用的单片机扩展 ram?
大多数 STM32单片机都使用 SRAM ,如 F103、F407等,都是MCU+外扩一个 512KB
或者 1MB
的SRAM
。因为单独的STM32F103/F407
内部 RAM
比较小 ,在做一些形如带有UI界面的工程师,内存会不够用
SRAM 突出的特点就是无需刷新,读写速度快!但是价格高。 常作为 SOC
内部的 RAM
或者 Cache
高速缓存 使用
SDRAM 需要动态刷新保持数据不丢失,成本比 SRAM 低,适合用来做 内存条