嵌入式学习笔记(9) Makefile文件详解

led.bin: start.o

arm-linux-ld -Ttext 0x0 -o led.elf $^

arm-linux-objcopy -O binary led.elf led.bin

arm-linux-objdump -D led.elf > led_elf.dis

gcc mkv210_image.c -o mkx210

./mkx210 led.bin 210.bin



%.o : %.S

arm-linux-gcc -o $@ $< -c



%.o : %.c

arm-linux-gcc -o $@ $< -c



clean:

rm *.o *.elf *.bin *.dis mkx210 -f

解释:真正项目找的Makefile是把程序的编译和链接过程分开的。(我们平常gcc a.c -o exe这种方式来编译时,实际上把编译和链接过程一步完成了。在内部实际上编译和链接永远是分开独立进行的,编译要使用编译器gcc,链接要使用链接器ld。)

链接器得到的led.elf其实就是我们的可执行程序,(如果在OS下,这个led.elf就可以执行了)但是在嵌入式裸机中,我们需要的是可以烧写的文件(可烧写的文件就叫镜像image),因此我们需要用这个led.elf作为原材料来只做镜像,制作工具就是交叉编译工具链中的arm-linux-objcopy

我们使用arm-linux-objdump工具进行反编译(反汇编),反汇编其实就是把编译后的elf格式的可执行程序给反过来得到对应的汇编程序,得到它的汇编源代码。

  • mkv210_image.c这个程序其实最终不是在开发板上执行,而是在主机Linux中执行的,因此编译mkv210_image.c时用gcc而不是用arm-linux-gcc。mkv210_image.c编译链接后得到可执行文件,这个可执行文件可以将usb启动的可执行的烧录文件(led.bin)加工为SD卡启动的可执行的烧录文件(210.bin)。
  • 当210作为裸机来使用时,所写的程序即相当于BL1(SD卡启动的话包含BL1头文件(16字节),USB启动的话不包含BL1头文件(16字节))。

210带OS启动过程回顾:SoC片上iROM运行已固化的BL0程序,BL0初始化FLASH,从FLASH中读取BL1加载到SoC片上iRAM运行BL1,BL1从FLASH加载BL2到iRAM运行,BL2初始化DRAM,从FLASH加载OS到DRAM运行。

嵌入式学习笔记(9) Makefile文件详解_第1张图片

作为裸机实验:

细节:BL0运行,通过OMpin判断启动通道(USB or SD),如果是SD卡启动默认从板载eMMC卡读取BL1,如果板载eMMC卡BL1的第一个扇区被破坏则从SD通道2的外部SD卡读取BL1。

读取到BL1后会做Checksum(需要校验的内存区域16KB-16Bytes中,所有内存中的内容按照字节为单位来进行相加,最终相加的和极为校验和,mkv210_image.c将校验和放在BL1头文件第3个字(即0xd0020008--0xd002000c)中,BL0也会计算校验和。

通过BL0计算的校验和和BL1头文件中的校验和对比即可得知BL1是否正确),判断BL1是否正确,如果正确则加载BL1到iRAM运行BL1程序(这里的BL1程序指的是16个字节的BL1头文件+我们写的程序+空0)

如果是从USB启动,则读取到BL1程序后不做Checksum,所以不care 16个字节的BL1头文件,所以我们的程序就不需要包含BL1头文件。我们把所写的程序放到iRAM 0xd0020010运行即可。

之所以要使用mkv210_image.c,就是要把我们写的程序加上16个字节的BL1头文件烧录到SD卡来启动。从SD卡启动方式对应BL1程序有16KB(16字节BL1头文件+led.bin+空0);从USB启动方式对应BL1程序只有led.bin。

  更多嵌入式学习笔记、实战项目,点击这里即可免费领取
嵌入式学习笔记(9) Makefile文件详解_第2张图片

你可能感兴趣的:(嵌入式学习笔记,编程,嵌入式,arm开发,学习,笔记,嵌入式硬件,嵌入式实时数据库,51单片机,iot)