标签:io 文件 for 数据 ar art 问题 cti 代码
前几天跟人在某个技术交流群里:
  和大家讨论时说了一句话: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,是由编译器自动生成的!希望之后的学友们不要再犯这种错误了。
 
标签:io 文件 for 数据 ar art 问题 cti 代码
原文地址:http://www.cnblogs.com/wqs131/p/3932455.html