当前位置:   article > 正文

STM32中的链接器脚本文件(.ld文件)与启动文件(.s文件)的相关知识整理_mcu .ld文件的作用

mcu .ld文件的作用

目录

一、链接器脚本文件.ld文件的作用

二、.ld文件相关内容整理

三、启动文件.s文件的作用


一、链接器脚本文件.ld文件的作用

  1. 设置堆空间大小、栈空间大小、然后根据应用的请求设置栈的位置
  2. 如果使用了外部内存,则设置内存块的区域和大小

个人理解:ld文件主要是当GCC最后链接STM32程序时候,为应用程序划分好对应的内存地址与大小,并将对应的数据、函数入口等信息存放到对应段中。

二、.ld文件相关内容整理

  1. /* Entry Point */
  2. ENTRY(Reset_Handler)
  3. //1、设置了用户ram的最高地址
  4. /* Highest address of the user mode stack */
  5. _estack = 0x20020000; /* end of RAM */
  6. //2、设置用户栈空间以及堆空间的大小
  7. /* Generate a link error if heap and stack don't fit into RAM */
  8. _Min_Heap_Size = 0x4000; /* required amount of heap */
  9. _Min_Stack_Size = 0x1000; /* required amount of stack */
  10. //3、指定了RAM与ROM的起始地址,以及大小
  11. /* Specify the memory areas */
  12. MEMORY
  13. {
  14. RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
  15. CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
  16. FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
  17. }
  18. //4、将相关内容放到对应段中
  19. /* Define output sections */
  20. SECTIONS
  21. {
  22. //中断向量表放在.isr_vector段中
  23. /* The startup code goes first into FLASH */
  24. .isr_vector :
  25. {
  26. . = ALIGN(4);
  27. KEEP(*(.isr_vector)) /* Startup code */
  28. . = ALIGN(4);
  29. } >FLASH
  30. //程序代码和其他部分数据存放在.text段中
  31. /* The program code and other data goes into FLASH */
  32. .text :
  33. {
  34. . = ALIGN(4);
  35. *(.text) /* .text sections (code) */
  36. *(.text*) /* .text* sections (code) */
  37. *(.glue_7) /* glue arm to thumb code */
  38. *(.glue_7t) /* glue thumb to arm code */
  39. *(.eh_frame)
  40. KEEP (*(.init))
  41. KEEP (*(.fini))
  42. . = ALIGN(4);
  43. _etext = .; /* define a global symbols at end of code */
  44. } >FLASH
  45. //.rodata 存放常量(只读数据)
  46. /* Constant data goes into FLASH */
  47. .rodata :
  48. {
  49. . = ALIGN(4);
  50. *(.rodata) /* .rodata sections (constants, strings, etc.) */
  51. *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
  52. . = ALIGN(4);
  53. } >FLASH
  54. .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
  55. .ARM : {
  56. __exidx_start = .;
  57. *(.ARM.exidx*)
  58. __exidx_end = .;
  59. } >FLASH
  60. //.preinit_array 和 .init_array 保存程序或共享对象加载时的初始化函数指针
  61. .preinit_array :
  62. {
  63. PROVIDE_HIDDEN (__preinit_array_start = .);
  64. KEEP (*(.preinit_array*))
  65. PROVIDE_HIDDEN (__preinit_array_end = .);
  66. } >FLASH
  67. .init_array :
  68. {
  69. PROVIDE_HIDDEN (__init_array_start = .);
  70. KEEP (*(SORT(.init_array.*)))
  71. KEEP (*(.init_array*))
  72. PROVIDE_HIDDEN (__init_array_end = .);
  73. } >FLASH
  74. //.fini_array 保存程序或共享对象退出时的退出函数地址
  75. .fini_array :
  76. {
  77. PROVIDE_HIDDEN (__fini_array_start = .);
  78. KEEP (*(SORT(.fini_array.*)))
  79. KEEP (*(.fini_array*))
  80. PROVIDE_HIDDEN (__fini_array_end = .);
  81. } >FLASH
  82. /* used by the startup to initialize data */
  83. _sidata = LOADADDR(.data);
  84. //.data 存放了经过初始化的全局变量和静态变量
  85. /* Initialized data sections goes into RAM, load LMA copy after code */
  86. .data :
  87. {
  88. . = ALIGN(4);
  89. _sdata = .; /* create a global symbol at data start */
  90. *(.data) /* .data sections */
  91. *(.data*) /* .data* sections */
  92. . = ALIGN(4);
  93. _edata = .; /* define a global symbol at data end */
  94. } >RAM AT> FLASH
  95. _siccmram = LOADADDR(.ccmram);
  96. /* CCM-RAM section
  97. *
  98. * IMPORTANT NOTE!
  99. * If initialized variables will be placed in this section,
  100. * the startup code needs to be modified to copy the init-values.
  101. */
  102. //.ccmram 是STM32中只允许内核访问的空间,可以将一些内核放在这里使用
  103. .ccmram :
  104. {
  105. . = ALIGN(4);
  106. _sccmram = .; /* create a global symbol at ccmram start */
  107. *(.ccmram)
  108. *(.ccmram*)
  109. . = ALIGN(4);
  110. _eccmram = .; /* create a global symbol at ccmram end */
  111. } >CCMRAM AT> FLASH
  112. //.bss 保存了那些用到但未被初始化的数据
  113. /* Uninitialized data section */
  114. . = ALIGN(4);
  115. .bss :
  116. {
  117. /* This is used by the startup in order to initialize the .bss secion */
  118. _sbss = .; /* define a global symbol at bss start */
  119. __bss_start__ = _sbss;
  120. *(.bss)
  121. *(.bss*)
  122. *(COMMON)
  123. . = ALIGN(4);
  124. _ebss = .; /* define a global symbol at bss end */
  125. __bss_end__ = _ebss;
  126. } >RAM
  127. //._user_heap_stack 用户的堆栈段
  128. /* User_heap_stack section, used to check that there is enough RAM left */
  129. ._user_heap_stack :
  130. {
  131. . = ALIGN(4);
  132. PROVIDE ( end = . );
  133. PROVIDE ( _end = . );
  134. . = . + _Min_Heap_Size;
  135. . = . + _Min_Stack_Size;
  136. . = ALIGN(4);
  137. } >RAM
  138. /* Remove information from the standard libraries */
  139. /DISCARD/ :
  140. {
  141. libc.a ( * )
  142. libm.a ( * )
  143. libgcc.a ( * )
  144. }
  145. .ARM.attributes 0 : { *(.ARM.attributes) }
  146. }

三、启动文件.s文件的作用

  1. 设置堆栈指针SP
  2. 将程序计数器指针PC 指向 Reset_Handler
  3. 设置中断向量表的对应中断地址
  4. 设置程序入口函数为main

个人理解:在进入main函数前所进行的操作,主要是初始化SP与PC指针,以及中断向量表。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/413543
推荐阅读
相关标签
  

闽ICP备14008679号