【Linux-点灯烧录-SD卡/USB烧写】

发布于:2024-05-06 ⋅ 阅读:(23) ⋅ 点赞:(0)

1. 烧写方式

  这里推荐两种,一种就是SD卡烧写,一种就是USB烧写;

2. 烧写之代码编译

  由于是在LInux环境下写的.s汇编文件,因此要编译成ARM环境下的二进制文件,这里就要用到交叉编译器:arm-linux-gnueabihf,一般整体思路就是,led.s->led.o->led.elf->led.bin,先把led.s文件编译成led.o文件,再由led.o文件链接成led.elf文件,二然后再把led.elf文件转换成二进制led.bin文件,如果进行调试要把.elf文件反汇编一下:下面简要介绍一下这些步骤的命令:

2.1 led.s->led.o

  1. arm-linux-gnueabihf-gcc -g -c led.s -o led.o :这条指令是在使用 arm-linux-gnueabihf-gcc 编译器进行编译操作。具体解释如下:
  • -g:表示生成调试信息,以便在调试时使用。
  • -c:表示只进行预处理、编译和汇编,生成目标文件(.o 文件)。
  • led.s:是要编译的源文件的名称。
  • -o led.o:指定输出的目标文件的名称为 led.o

2.2 led.o->led.elf

  1. arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf :该指令的作用是将目标文件 led.o 链接成可执行文件 led.elf,并指定了代码段的起始地址。
  • arm-linux-gnueabihf-ld:这是链接器程序。
  • -Ttext 0x87800000:指定代码段的起始地址为 0x87800000
  • led.o:这是要链接的目标文件。
  • -o led.elf:指定输出的链接结果文件名为 led.elf

2.3 led.elf->led.bin

  1. arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin :是一个格式转换指令,用于将 led.elf 文件转换为二进制格式的 led.bin 文件,通过执行这个指令,可以将 led.elf 文件转换为可在目标设备上运行的二进制文件 led.bin
  • -O binary:指定输出格式为二进制。
  • -S:表示不复制源文件中的重定位信息和符号信息。
  • -g:表示不复制源文件中的调试信息。

2.4 反汇编:led.elf->led.dis

  1. arm-linux-gnueabihf-objdump -D led.elf > led.dis :使用 arm-linux-gnueabihf-objdump 工具对 led.elf 文件进行反汇编操作。
  • -D选项表示反汇编所有的段
  • > led.dis:将反汇编的结果输出到文件 led.dis 中。

3. 烧写之烧录到SD卡上:

  这里要用到烧录软件:这个软件是在Linux环境下运行的,因此要给其开启权限:

3.1 开启烧录软件权限:

  • chmod 777 imxdownload:即可读可写可执行

3.2 确定SD卡的格式:FAT32

  如果存储卡的SD卡的容量比较大的话,要进行手动的格式话,这里必须采用FAT32的格式,怎么更改格式可以参考这个视频,非常简单:链接,如不改的话挂载不到Ubuntu的系统上;

3.3 烧录到SD卡上

  • ./iimxdownload led.bin /dev/sdb :即把二进制的文件led.bin烧录到sdb设备上,其中sdb设备就是我们挂载的SD卡,因此要确定SD卡挂载在了那个上面,叫什么名称;

3.4 SD卡插到板子上并SD卡启动

  结果如下:
在这里插入图片描述

4. Makefiel的文件编写:

  还是老规矩,把一个led.s的文件变成一个可以烧录的可执行文件,如果每次都进行手动的操作这是一件非常繁琐的事情,因此可以使用make工具进行一件编译,就是把我们手动编译的过程用代码的形式描述下来,具体如下,注意make语法中不要使用空格,要使用tap的按键;具体如下:

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