**汇编版**led灯实验02(I.MX6ULL):编译过程详解

我们直接在 Ubuntu 下使用 VSCode 编译的代码
代码文件leds.s在上篇文章中,点这里

整体流程

  1. arm-linux-gnueabihf-gcc 编译文件
  2. arm-linux-gnueabihf-ld 链接文件
  3. arm-linux-gnueabihf-objcopy 格式转换
  4. arm-linux-gnueabihf-objdump 反汇编(这里可有可无,但是以后很有用)

先不多说,上代码:

arm-linux-gnueabihf-gcc -g -c leds.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

这里的4行代码分别对应了4步
下面说一下作用是什么:

  1. arm-linux-gnueabihf-gcc 编译文件
    我们是要编译出在 ARM 开发板上运行的可执行文件,所以要使用交叉编译器 arm-linux-gnueabihf-gcc 来编译。因此本试验就一个 leds.s 源文件,所以编译比较简单。先将 led.s 编译为对应的.o 文件。
    上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息, GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 leds.s 编译完成以后的文件名字为 led.o。执行上述令以后就会编译生成一个 led.o 文件
  2. arm-linux-gnueabihf-ld 链接文件
    我们现在需要做的就是确定一下本试验最终的可执行文件其运行起始地址,也就是链接地址。这里我们要区分“存储地址”和“运行地址”这两个概念,“存储地址”就是可执行文件存储在哪里,可执行文件的存储地址可以随意选择。“运行地址”就是代码运行的时候所处的地址,这个我们在链接的时候就已经确定好了,代码要运行,那就必须处于运行地址处,否则代码肯定运行出错。比如 I.MX6U 支持 SD 卡、 EMMC、 NAND 启动,因此代码可以存储到 SD 卡、 EMMC 或者 NAND 中,但是要运行的话就必须将代码从 SD 卡、 EMMC 或者NAND 中拷贝到其运行地址(链接地址)处,“存储地址”和“运行地址”可以一样。
    上电以后 I.MX6U 的内部 boot rom 程序会将
    可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM 中
    (0X900000~0X91FFFF),也可以在外部的 DDR 中。本教程所有裸机例程的链接地址都在 DDR中,链接起始地址为 0X87800000。 I.MX6U-ALPHA 开发板的 DDR 容量有两种: 512MB 和256MB,起始地址都为 0X80000000,只不过 512MB 的终止地址为0X9FFFFFFF,而 256MB 容量的终止地址为 0X8FFFFFFF。之所以选择0X87800000 这个地址是因为后面要讲的 Uboot 其链接地址就是 0X87800000,这样我们统一使用 0X87800000 这个链接地址
  3. arm-linux-gnueabihf-objcopy 格式转换
    arm-linux-gnueabihf-objcopy 更像一个格式转换工具,我们需要用它将 led.elf 文件转换为led.bin 文件
    上述命令中,“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息
  4. arm-linux-gnueabihf-objdump 反汇编(这里可有可无,但是以后很有用)
    大多数情况下我们都是用 C 语言写试验例程的,有时候需要查看其汇编代码来调试代码,因此就需要进行反汇编,一般可以将 elf 文件反汇编
    上述代码中的“-D”选项表示反汇编所有的段

创建 Makefile 文件

每次都要重新写太麻烦了。。写个makefile吧

leds.bin : leds.s
	arm-linux-gnueabihf-gcc -g -c leds.s -o leds.o
	arm-linux-gnueabihf-ld -Ttext 0x87800000 leds.o -o leds.elf
	arm-linux-gnueabihf-objcopy -O binary -S -g leds.elf leds.bin
	arm-linux-gnueabihf-objdump -D leds.elf > leds.dis

clean:
	rm -rf *.o leds.elf leds.bin leds.dis

代码烧写

我们需要使用一个工具叫做:imxdownload ,他是用来自动为bin文件添加头部信息的工具。
将 imxdownload 拷贝到工程根目录下,和bin文件同一个目录
然后一次执行:

chmod 777 imxdownload			// 这里修改一下软件权限
/imxdownload led.bin /dev/sda	// 这里将你要使用的sd卡插入到电脑上,选择sd卡的目录

找到sd卡目录的 方法:

ls /dev/sd*

反复拔插,看看变化的那个就是sd卡(不要有数字的,那个是分区信息)

你可能感兴趣的:(嵌入式相关)