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

Minor improvements in CMSIS.

Custom linker script support.
Konstantin Oblaukhov 5 лет назад
Родитель
Сommit
302d51d50f

+ 38 - 24
cmake/FindCMSIS.cmake

@@ -26,7 +26,7 @@ function(cmsis_generate_default_linker_script FAMILY DEVICE)
     )
     add_custom_target(CMSIS_LD_${DEVICE} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld)
     add_dependencies(CMSIS::STM32::${DEVICE} CMSIS_LD_${DEVICE})
-    target_link_options(CMSIS::STM32::${DEVICE} INTERFACE -T "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld")
+    stm32_add_linker_script(CMSIS::STM32::${DEVICE} INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld")
 endfunction() 
 
 foreach(COMP ${CMSIS_FIND_COMPONENTS})
@@ -53,42 +53,55 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
         message(STATUS "No STM32_CUBE_${FAMILY}_PATH specified using default: ${STM32_CUBE_${FAMILY}_PATH}")
     endif()
     
-    set(CMSIS_PATH "${STM32_CUBE_${FAMILY}_PATH}/Drivers/CMSIS")
+    find_path(CMSIS_${FAMILY}_PATH
+        NAMES ARM.CMSIS.pdsc
+        PATHS "${STM32_CUBE_${FAMILY}_PATH}/Drivers/CMSIS"
+        NO_DEFAULT_PATH
+    )  
+    
+    if(NOT CMSIS_${FAMILY}_VERSION)
+        file(STRINGS "${CMSIS_${FAMILY}_PATH}/ARM.CMSIS.pdsc" VERSION_STRINGS REGEX "<release version=\"([0-9]*\\.[0-9]*\\.[0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">")
+        list(GET VERSION_STRINGS 0 STR)
+        string(REGEX MATCH "<release version=\"([0-9]*)\\.([0-9]*)\\.([0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">" MATCHED ${STR})
+        set(CMSIS_${FAMILY}_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}" CACHE INTERNAL "CMSIS STM32${FAMILY} version")
+    endif()
+    set(CMSIS_${COMP}_VERSION ${CMSIS_${FAMILY}_VERSION})
+    set(CMSIS_VERSION ${CMSIS_${COMP}_VERSION})
     
     find_path(CMSIS_${FAMILY}_COMMON_INCLUDE
         NAMES cmsis_version.h
-        PATHS "${CMSIS_PATH}/Include"
+        PATHS "${CMSIS_${FAMILY}_PATH}/Include"
         NO_DEFAULT_PATH
     )
     list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
     
     find_path(CMSIS_${FAMILY}_INCLUDE
         NAMES stm32${FAMILY_L}xx.h
-        PATHS "${CMSIS_PATH}/Device/ST/STM32${FAMILY}xx/Include"
+        PATHS "${CMSIS_${FAMILY}_PATH}/Device/ST/STM32${FAMILY}xx/Include"
         NO_DEFAULT_PATH
     )
     list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}_INCLUDE}")
     
     find_file(CMSIS_${FAMILY}_SOURCE
         NAMES system_stm32${FAMILY_L}xx.c
-        PATHS "${CMSIS_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates"
+        PATHS "${CMSIS_${FAMILY}_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates"
         NO_DEFAULT_PATH
     )
     list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}_SOURCE}")
-	
-	if ((NOT CMSIS_${FAMILY}_COMMON_INCLUDE) OR 
-	    (NOT CMSIS_${FAMILY}_INCLUDE) OR 
-	    (NOT CMSIS_${FAMILY}_SOURCE))
-		continue()
-	endif()
-	
+    
+    if ((NOT CMSIS_${FAMILY}_COMMON_INCLUDE) OR 
+        (NOT CMSIS_${FAMILY}_INCLUDE) OR 
+        (NOT CMSIS_${FAMILY}_SOURCE))
+        continue()
+    endif()
+
     if(NOT (TARGET CMSIS::STM32::${FAMILY}))
-		add_library(CMSIS::STM32::${FAMILY} INTERFACE IMPORTED)
-		target_link_libraries(CMSIS::STM32::${FAMILY} INTERFACE STM32::${FAMILY})
-		target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
-		target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_INCLUDE}")
+        add_library(CMSIS::STM32::${FAMILY} INTERFACE IMPORTED)
+        target_link_libraries(CMSIS::STM32::${FAMILY} INTERFACE STM32::${FAMILY})
+        target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
+        target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_INCLUDE}")
         target_sources(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_SOURCE}")
-	endif()
+    endif()
 
     set(DEVICES_FOUND TRUE)
     foreach(DEVICE ${DEVICES})
@@ -98,7 +111,7 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
         
         find_file(CMSIS_${FAMILY}_${TYPE}_STARTUP
             NAMES startup_stm32f${TYPE_L}.s
-            PATHS "${CMSIS_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates/gcc"
+            PATHS "${CMSIS_${FAMILY}_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates/gcc"
             NO_DEFAULT_PATH
         )
         list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
@@ -106,12 +119,12 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
             set(DEVICES_FOUND FALSE)
             break()
         endif()
-		
-		if(NOT (TARGET CMSIS::STM32::${FAMILY}::${TYPE}))
-			add_library(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE IMPORTED)
-			target_link_libraries(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE CMSIS::STM32::${FAMILY} STM32::${FAMILY}::${TYPE})
-			target_sources(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
-		endif()
+        
+        if(NOT (TARGET CMSIS::STM32::${FAMILY}::${TYPE}))
+            add_library(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE IMPORTED)
+            target_link_libraries(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE CMSIS::STM32::${FAMILY} STM32::${FAMILY}::${TYPE})
+            target_sources(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
+        endif()
         
         add_library(CMSIS::STM32::${DEVICE} INTERFACE IMPORTED)
         target_link_libraries(CMSIS::STM32::${DEVICE} INTERFACE CMSIS::STM32::${FAMILY}::${TYPE})
@@ -132,5 +145,6 @@ include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(CMSIS
     REQUIRED_VARS CMSIS_INCLUDE_DIRS CMSIS_SOURCES
     FOUND_VAR CMSIS_FOUND
+    VERSION_VAR CMSIS_VERSION
     HANDLE_COMPONENTS
 )

+ 5 - 0
cmake/stm32/common.cmake

@@ -57,6 +57,11 @@ function(stm32_get_chip_info CHIP FAMILY TYPE DEVICE)
     set(${TYPE} ${STM32_TYPE} PARENT_SCOPE)
 endfunction()
 
+function(stm32_add_linker_script TARGET VISIBILITY SCRIPT)
+    get_filename_component(SCRIPT "${SCRIPT}" ABSOLUTE)
+    target_link_options(${TARGET} ${VISIBILITY} -T "${SCRIPT}")
+endfunction()
+
 foreach(FAMILY ${STM32_SUPPORTED_FAMILIES})
     if(NOT (TARGET STM32::${FAMILY}))
         add_library(STM32::${FAMILY} INTERFACE IMPORTED)

+ 14 - 0
examples/custom-linker-script/CMakeLists.txt

@@ -0,0 +1,14 @@
+cmake_minimum_required(VERSION 3.8)
+set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
+
+project(stm32-custom-linker-script C ASM)
+
+find_package(CMSIS COMPONENTS STM32F407VG REQUIRED)
+
+set(PROJECT_SOURCES
+    main.c
+)
+
+add_executable(stm32-custom-linker-script.elf ${PROJECT_SOURCES})
+target_link_libraries(stm32-custom-linker-script.elf CMSIS::STM32::F4::407xx STM32::NoSys)
+stm32_add_linker_script(stm32-custom-linker-script.elf PRIVATE F407VG.ld)

+ 132 - 0
examples/custom-linker-script/F407VG.ld

@@ -0,0 +1,132 @@
+ENTRY(Reset_Handler)
+
+_estack = 0x20000000 + 128K;
+_Min_Heap_Size = 0x200;
+_Min_Stack_Size = 0x400;
+
+MEMORY
+{
+    FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K
+    RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
+    CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
+
+}
+
+SECTIONS
+{
+  .isr_vector :
+  {
+    . = ALIGN(4);
+    KEEP(*(.isr_vector))
+    . = ALIGN(4);
+  } >FLASH
+
+  .text :
+  {
+    . = ALIGN(4);
+    *(.text)
+    *(.text*)
+    *(.glue_7)
+    *(.glue_7t)
+    *(.eh_frame)
+
+    KEEP (*(.init))
+    KEEP (*(.fini))
+
+    . = ALIGN(4);
+    _etext = .;
+  } >FLASH
+
+  .rodata :
+  {
+    . = ALIGN(4);
+    *(.rodata)
+    *(.rodata*)
+    . = ALIGN(4);
+  } >FLASH
+
+  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+  .ARM : {
+    __exidx_start = .;
+    *(.ARM.exidx*)
+    __exidx_end = .;
+  } >FLASH
+
+  .preinit_array     :
+  {
+    PROVIDE_HIDDEN (__preinit_array_start = .);
+    KEEP (*(.preinit_array*))
+    PROVIDE_HIDDEN (__preinit_array_end = .);
+  } >FLASH
+  .init_array :
+  {
+    PROVIDE_HIDDEN (__init_array_start = .);
+    KEEP (*(SORT(.init_array.*)))
+    KEEP (*(.init_array*))
+    PROVIDE_HIDDEN (__init_array_end = .);
+  } >FLASH
+  .fini_array :
+  {
+    PROVIDE_HIDDEN (__fini_array_start = .);
+    KEEP (*(SORT(.fini_array.*)))
+    KEEP (*(.fini_array*))
+    PROVIDE_HIDDEN (__fini_array_end = .);
+  } >FLASH
+
+  _sidata = LOADADDR(.data);
+
+  .data : 
+  {
+    . = ALIGN(4);
+    _sdata = .; 
+    *(.data)
+    *(.data*)
+
+    . = ALIGN(4);
+    _edata = .;
+  } >RAM AT> FLASH
+
+_siccmram = LOADADDR(.ccmram);
+.ccmram :
+{
+. = ALIGN(4);
+_sccmram = .;
+*(.ccmram)
+*(.ccmram*)
+. = ALIGN(4);
+_eccmram = .;
+} >CCMRAM AT> FLASH
+        
+  . = ALIGN(4);
+  .bss :
+  {
+    _sbss = .;
+    __bss_start__ = _sbss;
+    *(.bss)
+    *(.bss*)
+    *(COMMON)
+
+    . = ALIGN(4);
+    _ebss = .;
+    __bss_end__ = _ebss;
+  } >RAM
+
+  ._user_heap_stack :
+  {
+    . = ALIGN(8);
+    PROVIDE ( end = . );
+    PROVIDE ( _end = . );
+    . = . + _Min_Heap_Size;
+    . = . + _Min_Stack_Size;
+    . = ALIGN(8);
+  } >RAM
+
+  /DISCARD/ :
+  {
+    libc.a ( * )
+    libm.a ( * )
+    libgcc.a ( * )
+  }
+
+  .ARM.attributes 0 : { *(.ARM.attributes) }
+}

+ 0 - 0
stm32-template/main.c → examples/custom-linker-script/main.c


+ 1 - 1
stm32-template/CMakeLists.txt → examples/template/CMakeLists.txt

@@ -1,5 +1,5 @@
-set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/stm32_gcc.cmake)
 cmake_minimum_required(VERSION 3.8)
+set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 project(stm32-template C ASM)
 

+ 5 - 0
examples/template/main.c

@@ -0,0 +1,5 @@
+int main(void)
+{
+    for (;;);
+    return 0;
+}

+ 12 - 6
tests/cmsis/CMakeLists.txt

@@ -1,16 +1,22 @@
-set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 cmake_minimum_required(VERSION 3.8)
+set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
+
+if(NOT TEST_FAMILIES)
+    set(TEST_FAMILIES F4)
+endif()
 
 project(cmsis-test C ASM)
 
-find_package(CMSIS COMPONENTS STM32F4 REQUIRED)
+find_package(CMSIS REQUIRED)
 
 set(SOURCES main.c)
 
 include(stm32/devices)
 
-stm32_get_devices_by_family(F4 DEVICES)
-foreach(DEVICE ${DEVICES})    
-    add_executable(cmsis-test-${DEVICE} ${SOURCES})
-    target_link_libraries(cmsis-test-${DEVICE} CMSIS::STM32::${DEVICE} STM32::NoSys)
+foreach(FAMILY ${TEST_FAMILIES})
+    stm32_get_devices_by_family(${FAMILY} DEVICES)
+    foreach(DEVICE ${DEVICES})    
+        add_executable(cmsis-test-${DEVICE} ${SOURCES})
+        target_link_libraries(cmsis-test-${DEVICE} CMSIS::STM32::${DEVICE} STM32::NoSys)
+    endforeach()
 endforeach()