【I.mx6ull】之-----代码的编译过程

本博文记录【I.mx6ull】之-----代码的编译过程

文章目录

  • 1. I.mx6ull 启动分析
  • 2. 汇编语言驱动开发板代码编译过程
    • 2.1 将汇编语言依次编译为 .bin 文件的过程
    • 2.2 Makefile 文件的必要性
  • 3 .C语言驱动开发板底层过程
  • 4. MCU 与 DDR 的几个问题

1. I.mx6ull 启动分析

比如,裸机的例程是在SD卡中,板子上电后:

  • I.MX6U 的内部 boot rom 将可执行文件拷贝到 链接地址处
    • 链接地址可以是 I.MX6U内部的 128KBRAM 0X900000~0X91FFFF
    • 链接地址也可以是 I.MX6U外部的512MBDDR0X80000000 - 0X80000000

2. 汇编语言驱动开发板代码编译过程

2.1 将汇编语言依次编译为 .bin 文件的过程

用汇编语言编写 led.s 文件,用于循环点亮 LED 灯,代码的编译过程如下。

首先,I.mx6ullARM 系列芯片,需要用交叉编译器在 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 只有 128KBOCRAM。 只有这么一点内存空间,运行Linux系统是肯定不够的,所以MCU一般会外接一颗RAM芯片。本博文记录I.MX6U-ALPHA 开发板上的这片 DDR3 的驱动过程。

2️⃣:DDR是什么,通俗的讲?

DDR 是一种 RAM,可以直接和CPU通信,读写速度很快,但是内容掉电丢失,因此容量不容易做得很大。如256MB/512MBDDR3 就是 RAM,而 512MB NAND Flash8GB EMMC 就是 ROM

3️⃣ :常用的单片机扩展 ram?

大多数 STM32单片机都使用 SRAM ,如 F103、F407等,都是MCU+外扩一个 512KB 或者 1MBSRAM。因为单独的STM32F103/F407 内部 RAM 比较小 ,在做一些形如带有UI界面的工程师,内存会不够用

SRAM 突出的特点就是无需刷新,读写速度快!但是价格高。 常作为 SOC 内部的 RAM 或者 Cache 高速缓存 使用

SDRAM 需要动态刷新保持数据不丢失,成本比 SRAM 低,适合用来做 内存条

你可能感兴趣的:(STM系列,嵌入式C,单片机,c语言)