Просмотр исходного кода

A (bit) better linker script generation.

Konstantin Oblaukhov 5 лет назад
Родитель
Сommit
4b75360550
3 измененных файлов с 158 добавлено и 143 удалено
  1. 0 2
      cmake/stm32/cmsis.cmake
  2. 14 141
      cmake/stm32/linker.cmake
  3. 144 0
      cmake/stm32/linker_ld.cmake

+ 0 - 2
cmake/stm32/cmsis.cmake

@@ -1,5 +1,3 @@
-include(FindPackageHandleStandardArgs)
-
 function(stm32_add_cmsis TARGET)
 function(stm32_add_cmsis TARGET)
     stm32_get_chip(${TARGET} FAMILY DEVICE) 
     stm32_get_chip(${TARGET} FAMILY DEVICE) 
     stm32_get_type(${FAMILY} ${DEVICE} TYPE)
     stm32_get_type(${FAMILY} ${DEVICE} TYPE)

+ 14 - 141
cmake/stm32/linker.cmake

@@ -44,147 +44,20 @@ function(stm32_generate_linker_script TARGET)
         set(HEAP_SIZE 0x200)
         set(HEAP_SIZE 0x200)
     endif()
     endif()
     
     
-    if((NOT CCRAM_SIZE) OR (CCRAM_SIZE STREQUAL "0K"))
-        set(CCRAM_DEFINITION "")
-        set(CCRAM_SECTION "")
-    else()
-        set(CCRAM_DEFINITION "    CCMRAM (rw) : ORIGIN = ${CCRAM_ORIGIN}, LENGTH = ${CCRAM_SIZE}\n")
-        set(CCRAM_SECTION "
-_siccmram = LOADADDR(.ccmram);\n\
-.ccmram :\n\
-{\n\
-. = ALIGN(4);\n\
-_sccmram = .;\n\
-*(.ccmram)\n\
-*(.ccmram*)\n\
-. = ALIGN(4);\n\
-_eccmram = .;\n\
-} >CCMRAM AT> FLASH\n\
-        ")
-    endif()
-    
-    set(SCRIPT_TEXT 
-"ENTRY(Reset_Handler)\n\
-\n\
-_estack = ${RAM_ORIGIN} + ${RAM_SIZE};\n\
-_Min_Heap_Size = ${HEAP_SIZE};\n\
-_Min_Stack_Size = ${STACK_SIZE};\n\
-\n\
-MEMORY\n\
-{\n\
-    FLASH (rx)      : ORIGIN = ${FLASH_ORIGIN}, LENGTH = ${FLASH_SIZE}\n\
-    RAM (xrw)      : ORIGIN = ${RAM_ORIGIN}, LENGTH = ${RAM_SIZE}\n\
-${CCRAM_DEFINITION}\n\
-}\n\
-\n\
-SECTIONS\n\
-{\n\
-  .isr_vector :\n\
-  {\n\
-    . = ALIGN(4);\n\
-    KEEP(*(.isr_vector))\n\
-    . = ALIGN(4);\n\
-  } >FLASH\n\
-\n\
-  .text :\n\
-  {\n\
-    . = ALIGN(4);\n\
-    *(.text)\n\
-    *(.text*)\n\
-    *(.glue_7)\n\
-    *(.glue_7t)\n\
-    *(.eh_frame)\n\
-\n\
-    KEEP (*(.init))\n\
-    KEEP (*(.fini))\n\
-\n\
-    . = ALIGN(4);\n\
-    _etext = .;\n\
-  } >FLASH\n\
-\n\
-  .rodata :\n\
-  {\n\
-    . = ALIGN(4);\n\
-    *(.rodata)\n\
-    *(.rodata*)\n\
-    . = ALIGN(4);\n\
-  } >FLASH\n\
-\n\
-  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n\
-  .ARM : {\n\
-    __exidx_start = .;\n\
-    *(.ARM.exidx*)\n\
-    __exidx_end = .;\n\
-  } >FLASH\n\
-\n\
-  .preinit_array     :\n\
-  {\n\
-    PROVIDE_HIDDEN (__preinit_array_start = .);\n\
-    KEEP (*(.preinit_array*))\n\
-    PROVIDE_HIDDEN (__preinit_array_end = .);\n\
-  } >FLASH\n\
-  .init_array :\n\
-  {\n\
-    PROVIDE_HIDDEN (__init_array_start = .);\n\
-    KEEP (*(SORT(.init_array.*)))\n\
-    KEEP (*(.init_array*))\n\
-    PROVIDE_HIDDEN (__init_array_end = .);\n\
-  } >FLASH\n\
-  .fini_array :\n\
-  {\n\
-    PROVIDE_HIDDEN (__fini_array_start = .);\n\
-    KEEP (*(SORT(.fini_array.*)))\n\
-    KEEP (*(.fini_array*))\n\
-    PROVIDE_HIDDEN (__fini_array_end = .);\n\
-  } >FLASH\n\
-\n\
-  _sidata = LOADADDR(.data);\n\
-\n\
-  .data : \n\
-  {\n\
-    . = ALIGN(4);\n\
-    _sdata = .; \n\
-    *(.data)\n\
-    *(.data*)\n\
-\n\
-    . = ALIGN(4);\n\
-    _edata = .;\n\
-  } >RAM AT> FLASH\n\
-${CCRAM_SECTION}\n\
-  . = ALIGN(4);\n\
-  .bss :\n\
-  {\n\
-    _sbss = .;\n\
-    __bss_start__ = _sbss;\n\
-    *(.bss)\n\
-    *(.bss*)\n\
-    *(COMMON)\n\
-\n\
-    . = ALIGN(4);\n\
-    _ebss = .;\n\
-    __bss_end__ = _ebss;\n\
-  } >RAM\n\
-\n\
-  ._user_heap_stack :\n\
-  {\n\
-    . = ALIGN(8);\n\
-    PROVIDE ( end = . );\n\
-    PROVIDE ( _end = . );\n\
-    . = . + _Min_Heap_Size;\n\
-    . = . + _Min_Stack_Size;\n\
-    . = ALIGN(8);\n\
-  } >RAM\n\
-\n\
-  /DISCARD/ :\n\
-  {\n\
-    libc.a ( * )\n\
-    libm.a ( * )\n\
-    libgcc.a ( * )\n\
-  }\n\
-\n\
-  .ARM.attributes 0 : { *(.ARM.attributes) }\n\
-}"
+    add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld"
+        COMMAND ${CMAKE_COMMAND} 
+            -DFLASH_ORIGIN="${FLASH_ORIGIN}" 
+            -DRAM_ORIGIN="${RAM_ORIGIN}" 
+            -DCCRAM_ORIGIN="${CCRAM_ORIGIN}" 
+            -DFLASH_SIZE="${FLASH_SIZE}" 
+            -DRAM_SIZE="${RAM_SIZE}" 
+            -DCCRAM_SIZE="${CCRAM_SIZE}" 
+            -DSTACK_SIZE="${STACK_SIZE}" 
+            -DHEAP_SIZE="${HEAP_SIZE}" 
+            -DLINKER_SCRIPT="${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld"
+            -P "${STM32_CMAKE_DIR}/stm32/linker_ld.cmake"
     )
     )
-    file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld CONTENT "${SCRIPT_TEXT}")
+    add_custom_target(${TARGET}_linker_script DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
+    add_dependencies(${TARGET} ${TARGET}_linker_script)
     stm32_set_linker_script(${TARGET} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
     stm32_set_linker_script(${TARGET} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
 endfunction() 
 endfunction() 

+ 144 - 0
cmake/stm32/linker_ld.cmake

@@ -0,0 +1,144 @@
+if((NOT CCRAM_SIZE) OR (CCRAM_SIZE STREQUAL "0K"))
+    set(CCRAM_DEFINITION "")
+    set(CCRAM_SECTION "")
+else()
+    set(CCRAM_DEFINITION "    CCMRAM (rw) : ORIGIN = ${CCRAM_ORIGIN}, LENGTH = ${CCRAM_SIZE}\n")
+    set(CCRAM_SECTION "
+_siccmram = LOADADDR(.ccmram);\n\
+.ccmram :\n\
+{\n\
+. = ALIGN(4);\n\
+_sccmram = .;\n\
+*(.ccmram)\n\
+*(.ccmram*)\n\
+. = ALIGN(4);\n\
+_eccmram = .;\n\
+} >CCMRAM AT> FLASH\n\
+        ")
+endif()
+    
+set(SCRIPT_TEXT 
+"ENTRY(Reset_Handler)\n\
+\n\
+_estack = ${RAM_ORIGIN} + ${RAM_SIZE};\n\
+_Min_Heap_Size = ${HEAP_SIZE};\n\
+_Min_Stack_Size = ${STACK_SIZE};\n\
+\n\
+MEMORY\n\
+{\n\
+    FLASH (rx)      : ORIGIN = ${FLASH_ORIGIN}, LENGTH = ${FLASH_SIZE}\n\
+    RAM (xrw)      : ORIGIN = ${RAM_ORIGIN}, LENGTH = ${RAM_SIZE}\n\
+${CCRAM_DEFINITION}\n\
+}\n\
+\n\
+SECTIONS\n\
+{\n\
+  .isr_vector :\n\
+  {\n\
+    . = ALIGN(4);\n\
+    KEEP(*(.isr_vector))\n\
+    . = ALIGN(4);\n\
+  } >FLASH\n\
+\n\
+  .text :\n\
+  {\n\
+    . = ALIGN(4);\n\
+    *(.text)\n\
+    *(.text*)\n\
+    *(.glue_7)\n\
+    *(.glue_7t)\n\
+    *(.eh_frame)\n\
+\n\
+    KEEP (*(.init))\n\
+    KEEP (*(.fini))\n\
+\n\
+    . = ALIGN(4);\n\
+    _etext = .;\n\
+  } >FLASH\n\
+\n\
+  .rodata :\n\
+  {\n\
+    . = ALIGN(4);\n\
+    *(.rodata)\n\
+    *(.rodata*)\n\
+    . = ALIGN(4);\n\
+  } >FLASH\n\
+\n\
+  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n\
+  .ARM : {\n\
+    __exidx_start = .;\n\
+    *(.ARM.exidx*)\n\
+    __exidx_end = .;\n\
+  } >FLASH\n\
+\n\
+  .preinit_array     :\n\
+  {\n\
+    PROVIDE_HIDDEN (__preinit_array_start = .);\n\
+    KEEP (*(.preinit_array*))\n\
+    PROVIDE_HIDDEN (__preinit_array_end = .);\n\
+  } >FLASH\n\
+  .init_array :\n\
+  {\n\
+    PROVIDE_HIDDEN (__init_array_start = .);\n\
+    KEEP (*(SORT(.init_array.*)))\n\
+    KEEP (*(.init_array*))\n\
+    PROVIDE_HIDDEN (__init_array_end = .);\n\
+  } >FLASH\n\
+  .fini_array :\n\
+  {\n\
+    PROVIDE_HIDDEN (__fini_array_start = .);\n\
+    KEEP (*(SORT(.fini_array.*)))\n\
+    KEEP (*(.fini_array*))\n\
+    PROVIDE_HIDDEN (__fini_array_end = .);\n\
+  } >FLASH\n\
+\n\
+  _sidata = LOADADDR(.data);\n\
+\n\
+  .data : \n\
+  {\n\
+    . = ALIGN(4);\n\
+    _sdata = .; \n\
+    *(.data)\n\
+    *(.data*)\n\
+\n\
+    . = ALIGN(4);\n\
+    _edata = .;\n\
+  } >RAM AT> FLASH\n\
+${CCRAM_SECTION}\n\
+  . = ALIGN(4);\n\
+  .bss :\n\
+  {\n\
+    _sbss = .;\n\
+    __bss_start__ = _sbss;\n\
+    *(.bss)\n\
+    *(.bss*)\n\
+    *(COMMON)\n\
+\n\
+    . = ALIGN(4);\n\
+    _ebss = .;\n\
+    __bss_end__ = _ebss;\n\
+  } >RAM\n\
+\n\
+  ._user_heap_stack :\n\
+  {\n\
+    . = ALIGN(8);\n\
+    PROVIDE ( end = . );\n\
+    PROVIDE ( _end = . );\n\
+    . = . + _Min_Heap_Size;\n\
+    . = . + _Min_Stack_Size;\n\
+    . = ALIGN(8);\n\
+  } >RAM\n\
+\n\
+  /DISCARD/ :\n\
+  {\n\
+    libc.a ( * )\n\
+    libm.a ( * )\n\
+    libgcc.a ( * )\n\
+  }\n\
+\n\
+  .ARM.attributes 0 : { *(.ARM.attributes) }\n\
+}"
+)
+file(WRITE "${LINKER_SCRIPT}" "${SCRIPT_TEXT}")
+
+