mdk编译器起到的boot作用详解

前几天跟人在某个技术交流群里:
  和大家讨论时说了一句话:mdk编译器也会做一部分bootloader的工作,顿时一大群一大堆学友的"声讨和纠正",学友们有些说厂商已经提供了相应的startup文件,就完成了相应bo
otloader的启动,有些说厂商会固化程序在内部芯片中完成那部分startup没有的bootloader的启动,更有一些离谱的说直接硬件做那部分boot数据搬移的工作。同学们啊,就算你们猜你们也要猜的靠谱些啊!!
  当然,这些说法都是错误的,其实在arm-none-liunx-gcc中startup文件中会有相应的data section的ram搬移(本人做过在gcc下的m3、4系列开发),在mdk中startup文件中却没有提供那部分代码,具体为啥我下面会说,不少同学因为只在gui环境下编程或是没有独立思考的能力,养成了一些不好的习惯,这些习惯根深蒂固后会影响个人的判断,这种习惯会根深蒂固的去影响那些人云亦云,意志不坚定的人。:(
  原因很简单,mdk在编译的时候做了一个手脚,在mdk设置栏"option for target XXX/target下"会有flash和ram地址填入,一般来说这个设置是根据具体器件器件而言的,在一般的情况下是不需要修改的,但是对于mdk编译器来说是相当重要的东西,因为在编译时会需要用到这个部分和这部分生成出的scatter文件,其会自动生成数据区搬移的代码,这个问题如果想验证也相当的简单,看反汇编代码就可以了,在这里我贴一点代码给大家看看:

0x08000138 A00A ADR r0,{pc}+4 ; @0x08000164
0x0800013A E8900C00 LDM r0,{r10-r11}
0x0800013E 4482 ADD r10,r10,r0
0x08000140 4483 ADD r11,r11,r0
0x08000142 F1AA0701 SUB r7,r10,#0x01
__scatterload_null:
0x08000146 45DA CMP r10,r11
0x08000148 D101 BNE 0x0800014E
0x0800014A F000F83F BL.W __rt_entry (0x080001CC)
0x0800014E F2AF0E09 ADR.W lr,{pc}-0x07 ; @0x08000147
0x08000152 E8BA000F LDM r10!,{r0-r3}
0x08000156 F0130F01 TST r3,#0x01
0x0800015A BF18 IT NE
0x0800015C 1AFB SUBNE r3,r7,r3
0x0800015E F0430301 ORR r3,r3,#0x01
0x08000162 4718 BX r3
0x08000164 1D60 DCW 0x1D60
0x08000166 0000 DCW 0x0000
0x08000168 1D80 DCW 0x1D80
0x0800016A 0000 DCW 0x0000

__decompress:
0x0800016C 440A ADD r2,r2,r1
0x0800016E F8104B01 LDRB r4,[r0],#0x01
0x08000172 F014050F ANDS r5,r4,#0x0F
0x08000176 BF08 IT EQ
0x08000178 F8105B01 LDRBEQ r5,[r0],#0x01
0x0800017C 0924 LSRS r4,r4,#4
0x0800017E BF08 IT EQ
0x08000180 F8104B01 LDRBEQ r4,[r0],#0x01
0x08000184 1E6D SUBS r5,r5,#1
0x08000186 D005 BEQ 0x08000194
0x08000188 F8103B01 LDRB r3,[r0],#0x01
0x0800018C 1E6D SUBS r5,r5,#1
0x0800018E F8013B01 STRB r3,[r1],#0x01
0x08000192 D1F9 BNE 0x08000188
0x08000194 1E64 SUBS r4,r4,#1
0x08000196 D003 BEQ 0x080001A0
0x08000198 1E64 SUBS r4,r4,#1
0x0800019A F8015B01 STRB r5,[r1],#0x01
0x0800019E D1FB BNE 0x08000198
0x080001A0 4291 CMP r1,r2
0x080001A2 D3E4 BCC 0x0800016E
0x080001A4 4770 BX lr
0x080001A6 0000 MOVS r0,r0
__scatterload_zeroinit:
0x080001A8 2300 MOVS r3,#0x00
0x080001AA 2400 MOVS r4,#0x00
0x080001AC 2500 MOVS r5,#0x00
0x080001AE 2600 MOVS r6,#0x00
0x080001B0 3A10 SUBS r2,r2,#0x10
0x080001B2 BF28 IT CS
0x080001B4 C178 STMCS r1!,{r3-r6}
0x080001B6 D8FB BHI 0x080001B0
0x080001B8 0752 LSLS r2,r2,#29
0x080001BA BF28 IT CS
0x080001BC C130 STMCS r1!,{r4-r5}
0x080001BE BF48 IT MI
0x080001C0 600B STRMI r3,[r1,#0x00]
0x080001C2 4770 BX lr

  会有一段自动生成的代码,这些代码在自己写的代码中是不存在的,其主要作用在于将flash中的data section数据搬移至ram,是由编译器自动生成的!希望之后的学友们不要再犯这种错误了。

 

原文地址:https://www.cnblogs.com/wqs131/p/3932455.html