程序设计
点灯流程
- 使能指定 GPIO 的时钟
- 设置 IO 的复用功能
- 配置 GPIO 输出功能、上拉、速度等等
- 设置 GPIO 输出高电平或低电平
点灯汇编代码
代码中的地址参考《i.MX 6ULL Applications Processor Reference Manual》
1 | .global _start @ global symbol |
程序编译
编译
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字。
链接
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里命名为 led.elf。
格式转换
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
烧录要用到bin文件,上述命令中,“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。
反汇编
arm-linux-gnueabihf-objdump -D led.elf > led.dis
有时候需要查看其汇编代码来调试代码,因此就需要进行反汇编,一般可以将 elf 文件反汇编,上述代码中的“-D”选项表示反汇编所有的段。
Makefile脚本
1 | led.bin:led.s |
注意:每一个命令行必须以 注意:每一个命令行必须以[Tab]字符开始,不能是空格开始,[Tab] 字符告诉 make 此行是一个命令行,make 按照命令完成相应的动作。这也是书写按照命令完成相应的动作,这也是书写 Makefile 中容易产生,而且比较隐蔽的错误。报错信息:Makefile:2: *** 遗漏分隔符 (null)。 停止。
反汇编
1 | Disassembly of section .text: |
和我写的汇编代码都是一一对应的,只是把直接数放在了代码段的最后,ldr通过pc+offset来取。
从反汇编来看还把ldr一些短的直接数改成了mov指令。