linker.cmake 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. function(stm32_set_linker_script TARGET SCRIPT)
  2. target_link_options(${TARGET} PRIVATE -T "${SCRIPT}")
  3. endfunction()
  4. function(stm32_generate_linker_script TARGET)
  5. stm32_get_chip(${TARGET} FAMILY DEVICE)
  6. get_target_property(FLASH_ORIGIN ${TARGET} STM32_FLASH_ORIGIN)
  7. get_target_property(RAM_ORIGIN ${TARGET} STM32_RAM_ORIGIN)
  8. get_target_property(CCRAM_ORIGIN ${TARGET} STM32_CCRAM_ORIGIN)
  9. get_target_property(FLASH_SIZE ${TARGET} STM32_FLASH_SIZE)
  10. get_target_property(RAM_SIZE ${TARGET} STM32_RAM_SIZE)
  11. get_target_property(CCRAM_SIZE ${TARGET} STM32_CCRAM_SIZE)
  12. get_target_property(STACK_SIZE ${TARGET} STM32_STACK_SIZE)
  13. get_target_property(HEAP_SIZE ${TARGET} STM32_HEAP_SIZE)
  14. if(NOT FLASH_ORIGIN)
  15. set(FLASH_ORIGIN 0x8000000)
  16. endif()
  17. if(NOT RAM_ORIGIN)
  18. set(RAM_ORIGIN 0x20000000)
  19. endif()
  20. if(NOT CCRAM_ORIGIN)
  21. set(CCRAM_ORIGIN 0x10000000)
  22. endif()
  23. if(${FAMILY} STREQUAL "F4")
  24. stm32f4_memory_size(${DEVICE} DEF_FLASH DEF_RAM DEF_CCRAM)
  25. endif()
  26. if(NOT FLASH_SIZE)
  27. set(FLASH_SIZE ${DEF_FLASH})
  28. endif()
  29. if(NOT RAM_SIZE)
  30. set(RAM_SIZE ${DEF_RAM})
  31. endif()
  32. if(NOT CCRAM_SIZE)
  33. set(CCRAM_SIZE ${DEF_CCRAM})
  34. endif()
  35. if(NOT STACK_SIZE)
  36. set(STACK_SIZE 0x400)
  37. endif()
  38. if(NOT HEAP_SIZE)
  39. set(HEAP_SIZE 0x200)
  40. endif()
  41. if((NOT CCRAM_SIZE) OR (CCRAM_SIZE STREQUAL "0K"))
  42. set(CCRAM_DEFINITION "")
  43. set(CCRAM_SECTION "")
  44. else()
  45. set(CCRAM_DEFINITION " CCMRAM (rw) : ORIGIN = ${CCRAM_ORIGIN}, LENGTH = ${CCRAM_SIZE}\n")
  46. set(CCRAM_SECTION "
  47. _siccmram = LOADADDR(.ccmram);\n\
  48. .ccmram :\n\
  49. {\n\
  50. . = ALIGN(4);\n\
  51. _sccmram = .;\n\
  52. *(.ccmram)\n\
  53. *(.ccmram*)\n\
  54. . = ALIGN(4);\n\
  55. _eccmram = .;\n\
  56. } >CCMRAM AT> FLASH\n\
  57. ")
  58. endif()
  59. set(SCRIPT_TEXT
  60. "ENTRY(Reset_Handler)\n\
  61. \n\
  62. _estack = ${RAM_ORIGIN} + ${RAM_SIZE};\n\
  63. _Min_Heap_Size = ${HEAP_SIZE};\n\
  64. _Min_Stack_Size = ${STACK_SIZE};\n\
  65. \n\
  66. MEMORY\n\
  67. {\n\
  68. FLASH (rx) : ORIGIN = ${FLASH_ORIGIN}, LENGTH = ${FLASH_SIZE}\n\
  69. RAM (xrw) : ORIGIN = ${RAM_ORIGIN}, LENGTH = ${RAM_SIZE}\n\
  70. ${CCRAM_DEFINITION}\n\
  71. }\n\
  72. \n\
  73. SECTIONS\n\
  74. {\n\
  75. .isr_vector :\n\
  76. {\n\
  77. . = ALIGN(4);\n\
  78. KEEP(*(.isr_vector))\n\
  79. . = ALIGN(4);\n\
  80. } >FLASH\n\
  81. \n\
  82. .text :\n\
  83. {\n\
  84. . = ALIGN(4);\n\
  85. *(.text)\n\
  86. *(.text*)\n\
  87. *(.glue_7)\n\
  88. *(.glue_7t)\n\
  89. *(.eh_frame)\n\
  90. \n\
  91. KEEP (*(.init))\n\
  92. KEEP (*(.fini))\n\
  93. \n\
  94. . = ALIGN(4);\n\
  95. _etext = .;\n\
  96. } >FLASH\n\
  97. \n\
  98. .rodata :\n\
  99. {\n\
  100. . = ALIGN(4);\n\
  101. *(.rodata)\n\
  102. *(.rodata*)\n\
  103. . = ALIGN(4);\n\
  104. } >FLASH\n\
  105. \n\
  106. .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n\
  107. .ARM : {\n\
  108. __exidx_start = .;\n\
  109. *(.ARM.exidx*)\n\
  110. __exidx_end = .;\n\
  111. } >FLASH\n\
  112. \n\
  113. .preinit_array :\n\
  114. {\n\
  115. PROVIDE_HIDDEN (__preinit_array_start = .);\n\
  116. KEEP (*(.preinit_array*))\n\
  117. PROVIDE_HIDDEN (__preinit_array_end = .);\n\
  118. } >FLASH\n\
  119. .init_array :\n\
  120. {\n\
  121. PROVIDE_HIDDEN (__init_array_start = .);\n\
  122. KEEP (*(SORT(.init_array.*)))\n\
  123. KEEP (*(.init_array*))\n\
  124. PROVIDE_HIDDEN (__init_array_end = .);\n\
  125. } >FLASH\n\
  126. .fini_array :\n\
  127. {\n\
  128. PROVIDE_HIDDEN (__fini_array_start = .);\n\
  129. KEEP (*(SORT(.fini_array.*)))\n\
  130. KEEP (*(.fini_array*))\n\
  131. PROVIDE_HIDDEN (__fini_array_end = .);\n\
  132. } >FLASH\n\
  133. \n\
  134. _sidata = LOADADDR(.data);\n\
  135. \n\
  136. .data : \n\
  137. {\n\
  138. . = ALIGN(4);\n\
  139. _sdata = .; \n\
  140. *(.data)\n\
  141. *(.data*)\n\
  142. \n\
  143. . = ALIGN(4);\n\
  144. _edata = .;\n\
  145. } >RAM AT> FLASH\n\
  146. ${CCRAM_SECTION}\n\
  147. . = ALIGN(4);\n\
  148. .bss :\n\
  149. {\n\
  150. _sbss = .;\n\
  151. __bss_start__ = _sbss;\n\
  152. *(.bss)\n\
  153. *(.bss*)\n\
  154. *(COMMON)\n\
  155. \n\
  156. . = ALIGN(4);\n\
  157. _ebss = .;\n\
  158. __bss_end__ = _ebss;\n\
  159. } >RAM\n\
  160. \n\
  161. ._user_heap_stack :\n\
  162. {\n\
  163. . = ALIGN(8);\n\
  164. PROVIDE ( end = . );\n\
  165. PROVIDE ( _end = . );\n\
  166. . = . + _Min_Heap_Size;\n\
  167. . = . + _Min_Stack_Size;\n\
  168. . = ALIGN(8);\n\
  169. } >RAM\n\
  170. \n\
  171. /DISCARD/ :\n\
  172. {\n\
  173. libc.a ( * )\n\
  174. libm.a ( * )\n\
  175. libgcc.a ( * )\n\
  176. }\n\
  177. \n\
  178. .ARM.attributes 0 : { *(.ARM.attributes) }\n\
  179. }"
  180. )
  181. file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld CONTENT "${SCRIPT_TEXT}")
  182. stm32_set_linker_script(${TARGET} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
  183. endfunction()