今天在做汇编led驱动的时候的一些记录总结.
实验流程:
.global _start
_start:
/* enable all clock need to write the register CCGR0-CCGR6 to 0xffffffff */
ldr r0, =0x020C4068 /* register CCGR0 */
ldr r1, =0xffffffff
str r1, [r0] /* write the oxfffffffff to the CCGR0 */
ldr r0, =0x020c406c /* register CCGR1 */
str r1, [r0]
ldr r0, =0x020c4070 /* register CCGR2 */
str r1, [r0]
ldr r0, =0x020c4074 /* register CCGR3 */
str r1, [r0]
ldr r0, =0x020c4078 /* register CCGR4 */
str r1, [r0]
ldr r0, =0x020c407c /* register CCGR5 */
str r1, [r0]
ldr r0, =0x020c4080 /* register CCGR6 */
str r1, [r0]
/* multiplex the IO , make the IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 5 */
ldr r0, =0x020e0068 /* address */
ldr r1, =0x05
str r1, [r0]
/* config Properties , config the Rigerster SW_PAD_GPIO1_IO03_BASE */
ldr r0, =0x020e02f4
ldr r1, =0x10b0
str r1, [r0]
/* set the GPIO1_IO03 -> OUTPUT mode Register GPIO1_GDIR */
ldr r0, =0x0209c004
ldr r1, =0x0000008
str r1, [r0]
/* open led0 , set the register GPIO1_DR to low */
ldr r0, =0x0209c000
ldr r1, =0
str r1,[r0]
/* loop */
loop:
b loop
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 led.s 编译完成以后的文件名字为 led.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
上述命令中,“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。
arm-linux-gnueabihf-objdump -D led.elf > led.dis
上述代码中的“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件
led.dis 里面是汇编代码,而且还可以看到内存分配情况。
leds.bin:leds.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
chmod 777 imxdownload
./imxdownload led.bin /dev/sdd
简单记录一下,唐怡佳继续加油叭!