本博文记录【I.mx6ull】之-----代码的编译过程
比如,裸机的例程是在SD卡中,板子上电后:
I.MX6U
的内部 boot rom
将可执行文件拷贝到 链接地址处
I.MX6U
内部的 128KB
的 RAM
0X900000~0X91FFFF
I.MX6U
外部的512MB
的DDR
中 0X80000000 - 0X80000000
用汇编语言编写 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 文件
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
2️⃣ : 将 led.o 文件链接到某个地址,生成 led.elf文件
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
3️⃣ : 将led.elf文件转化为 led.bin 文件
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
4️⃣ :补充,反汇编,
“-D”选项表示反汇编所有的段
arm-linux-gnueabihf-objdump -D led.elf > led.dis
由于以上步骤每次修改完代码都执行一遍很麻烦,因此将几个命令行放入 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 小节
先运行汇编语言,从汇编语言跳转到C语言。
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 低,适合用来做 内存条