OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2788|回复: 3

stm32启动代码没有scatterload_cpy,scatterload_rt2函数的问题

[复制链接]

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2019-5-24
在线时间
21 小时
发表于 2020-4-18 09:51:41 | 显示全部楼层 |阅读模式
5金钱
https://blog.csdn.net/wheat_in_winner/article/details/53583462这篇博文中出现的__scatterload_rt2函数,__scatterload_cpy函数,__scatterload_zeroinit函数,在我mdk5的中的反汇编中只有__scatterload和__rt_entry。是编译器或者编译器版本不一样?懂的大牛麻烦指点下,谢谢!以下是我项目中的启动汇编进Main之前的代码段。
  1. 0x08000130 F000F802  BL.W     __scatterload (0x08000138)
  2. 0x08000134 F000F84A  BL.W     __rt_entry (0x080001CC)
  3. 0x08000138 A00A      ADR      r0,{pc}+0x2C  ; @0x08000164
  4. 0x0800013A E8900C00  LDM      r0,{r10-r11}
  5. 0x0800013E 4482      ADD      r10,r10,r0
  6. 0x08000140 4483      ADD      r11,r11,r0
  7. 0x08000142 F1AA0701  SUB      r7,r10,#0x01
  8. 0x08000146 45DA      CMP      r10,r11
  9. 0x08000148 D101      BNE      0x0800014E
  10. 0x0800014A F000F83F  BL.W     __rt_entry (0x080001CC)
  11. 0x0800014E F2AF0E09  ADR.W    lr,{pc}-0x07  ; @0x08000147
  12. 0x08000152 E8BA000F  LDM      r10!,{r0-r3}
  13. 0x08000156 F0130F01  TST      r3,#0x01
  14. 0x0800015A BF18      IT       NE
  15. 0x0800015C 1AFB      SUBNE    r3,r7,r3
  16. 0x0800015E F0430301  ORR      r3,r3,#0x01
  17. 0x08000162 4718      BX       r3
  18. 0x08000164 02D4      DCW      0x02D4
  19. 0x08000166 0000      DCW      0x0000
  20. 0x08000168 02F4      DCW      0x02F4
  21. 0x0800016A 0000      DCW      0x0000
  22. 0x0800016C 440A      ADD      r2,r2,r1
  23. 0x0800016E F8104B01  LDRB     r4,[r0],#0x01
  24. 0x08000172 F014050F  ANDS     r5,r4,#0x0F
  25. 0x08000176 BF08      IT       EQ
  26. 0x08000178 F8105B01  LDRBEQ   r5,[r0],#0x01
  27. 0x0800017C 0924      LSRS     r4,r4,#4
  28. 0x0800017E BF08      IT       EQ
  29. 0x08000180 F8104B01  LDRBEQ   r4,[r0],#0x01
  30. 0x08000184 1E6D      SUBS     r5,r5,#1
  31. 0x08000186 D005      BEQ      0x08000194
  32. 0x08000188 F8103B01  LDRB     r3,[r0],#0x01
  33. 0x0800018C 1E6D      SUBS     r5,r5,#1
  34. 0x0800018E F8013B01  STRB     r3,[r1],#0x01
  35. 0x08000192 D1F9      BNE      0x08000188
  36. 0x08000194 1E64      SUBS     r4,r4,#1
  37. 0x08000196 D003      BEQ      0x080001A0
  38. 0x08000198 1E64      SUBS     r4,r4,#1
  39. 0x0800019A F8015B01  STRB     r5,[r1],#0x01
  40. 0x0800019E D1FB      BNE      0x08000198
  41. 0x080001A0 4291      CMP      r1,r2
  42. 0x080001A2 D3E4      BCC      0x0800016E
  43. 0x080001A4 4770      BX       lr
  44. 0x080001A6 0000      MOVS     r0,r0
  45. 0x080001A8 2300      MOVS     r3,#0x00
  46. 0x080001AA 2400      MOVS     r4,#0x00
  47. 0x080001AC 2500      MOVS     r5,#0x00
  48. 0x080001AE 2600      MOVS     r6,#0x00
  49. 0x080001B0 3A10      SUBS     r2,r2,#0x10
  50. 0x080001B2 BF28      IT       CS
  51. 0x080001B4 C178      STMCS    r1!,{r3-r6}
  52. 0x080001B6 D8FB      BHI      0x080001B0
  53. 0x080001B8 0752      LSLS     r2,r2,#29
  54. 0x080001BA BF28      IT       CS
  55. 0x080001BC C130      STMCS    r1!,{r4-r5}
  56. 0x080001BE BF48      IT       MI
  57. 0x080001C0 600B      STRMI    r3,[r1,#0x00]
  58. 0x080001C2 4770      BX       lr
  59.                  __rt_lib_init:
  60. 0x080001C4 B51F      PUSH     {r0-r4,lr}
  61.                  __rt_lib_init_alloca_1:
  62. 0x080001C6 BD1F      POP      {r0-r4,pc}
  63.                  __rt_lib_shutdown:
  64. 0x080001C8 B510      PUSH     {r4,lr}
  65.                  __rt_lib_shutdown_cpp_1:
  66. 0x080001CA BD10      POP      {r4,pc}
  67.                  __rt_entry:
  68. 0x080001CC F000F831  BL.W     __user_setup_stackheap (0x08000232)
  69. 0x080001D0 4611      MOV      r1,r2
  70.                  __rt_entry_li:
  71. 0x080001D2 F7FFFFF7  BL.W     __rt_lib_init (0x080001C4)
  72.                  __rt_entry_main:
  73. 0x080001D6 F000F90B  BL.W     main (0x080003F0)
  74. 0x080001DA F000F84F  BL.W     exit (0x0800027C)
  75.                  __rt_exit:
  76. 0x080001DE B403      PUSH     {r0-r1}
  77.                  __rt_exit_ls:
  78. 0x080001E0 F7FFFFF2  BL.W     __rt_lib_shutdown (0x080001C8)
  79.                  __rt_exit_exit:
  80. 0x080001E4 BC03      POP      {r0-r1}
  81. 0x080001E6 F000F857  BL.W     _sys_exit (0x08000298)
  82. 0x080001EA 0000      MOVS     r0,r0
  83.    151:                 LDR     R0, =SystemInit
  84. 0x080001EC 4809      LDR      r0,[pc,#36]  ; @0x08000214
  85.    152:                 BLX     R0               
  86. 0x080001EE 4780      BLX      r0
  87.    153:                 LDR     R0, =__main
  88. 0x080001F0 4809      LDR      r0,[pc,#36]  ; @0x08000218
复制代码



最佳答案

查看完整内容[请看2#楼]

这个东西属于arm编译器的私货,如果你有兴趣,可以了解一个叫做CRT的概念,以GNU的glibc为例子,glibc负责main函数之前的初始化工作。main之前会调用一个叫 _start 的函数,对程序段进行初始化,比如用0填充.bss段什么的(arm对应的是ZI段)。具体的代码可以看看crt0.o/crt1.o中的代码,希望对你有帮助
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2017-9-16
在线时间
80 小时
发表于 2020-4-18 09:51:42 | 显示全部楼层
这个东西属于arm编译器的私货,如果你有兴趣,可以了解一个叫做CRT的概念,以GNU的glibc为例子,glibc负责main函数之前的初始化工作。main之前会调用一个叫 _start 的函数,对程序段进行初始化,比如用0填充.bss段什么的(arm对应的是ZI段)。具体的代码可以看看crt0.o/crt1.o中的代码,希望对你有帮助
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-4-18 10:53:37 | 显示全部楼层
这种细节你可以不用深究,跟编译器的机制有关,你看到函数知道是干什么的就好了,不用问为什么没有。而且这些分散加载和全局变量初始化是跟程序变量定义及使用息息相关的,你的变量跟他的不一样自然就有不同的变量初始化行为。
回复

使用道具 举报

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2019-5-24
在线时间
21 小时
 楼主| 发表于 2020-4-18 11:15:59 | 显示全部楼层
0x00000000 发表于 2020-4-18 10:53
这种细节你可以不用深究,跟编译器的机制有关,你看到函数知道是干什么的就好了,不用问为什么没有。而且这 ...

我跟他的代码和定义的变量不同这个是肯定的,我说的意思是只要是按照这个工程模板来定义的,为什么连__scatterload_rt2函数,__scatterload_cpy函数,__scatterload_zeroinit这些函数都不会出现?我的代码中,RO-datat,RW-data,Zi-data都是有定义的,按照运行域和加载域的关系也应该存在这几个函数段的。深究这些的目的是为了代码出现问的时候,更好更快的找到问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 14:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表