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

Merge pull request #67 from KKoovalsky/dev_support_freertos

Support FreeRTOS
Konstantin Oblaukhov 8 лет назад
Родитель
Сommit
7c43a04fc0
2 измененных файлов с 129 добавлено и 0 удалено
  1. 11 0
      README.md
  2. 118 0
      cmake/FindFreeRTOS.cmake

+ 11 - 0
README.md

@@ -90,3 +90,14 @@ This project also supports ChibiOS v3.x.x and ChibiOS v16.x.x (both nil and rt k
 CMake modules for ChibiOS can find specified ChibiOS components using the COMPONENTS directive.
 
 See project `stm32-chibios` for example usage.
+
+# FreeRTOS Support
+
+FreeRTOS is also supported. To include it in your project you should set a variable named `FREERTOS_HEAP_IMPL` with 
+a proper number of FreeRTOS heap implementation. You can do this by invoking:
+
+```
+SET(FREERTOS_HEAP_IMPL 4)
+```
+
+before `FIND_PACKAGE` command.

+ 118 - 0
cmake/FindFreeRTOS.cmake

@@ -0,0 +1,118 @@
+IF(STM32_FAMILY STREQUAL "F0")
+	SET(PORT_GCC_DIR_SUFFIX "CM0")
+ELSEIF(STM32_FAMILY STREQUAL "F1")
+	SET(PORT_GCC_DIR_SUFFIX "CM3")
+ELSEIF(STM32_FAMILY STREQUAL "F2")
+	SET(PORT_GCC_DIR_SUFFIX "CM3")
+ELSEIF(STM32_FAMILY STREQUAL "F3")
+	SET(PORT_GCC_DIR_SUFFIX "CM4F")
+ELSEIF(STM32_FAMILY STREQUAL "F4")
+	SET(PORT_GCC_DIR_SUFFIX "CM4F")
+ELSEIF(STM32_FAMILY STREQUAL "F7")
+	SET(PORT_GCC_DIR_SUFFIX "CM7")
+ELSEIF(STM32_FAMILY STREQUAL "L0")
+	SET(PORT_GCC_DIR_SUFFIX "CM0")
+ELSEIF(STM32_FAMILY STREQUAL "L1")
+	SET(PORT_GCC_DIR_SUFFIX "CM4F")
+ENDIF()
+
+SET(FREERTOS_SRC_FILES
+	croutine.c
+	event_groups.c
+	list.c
+	queue.c
+	tasks.c
+	timers.c
+)
+
+SET(FREERTOS_HEADERS
+	croutine.h
+	deprecated_definitions.h
+	event_groups.h
+	FreeRTOS.h
+	list.h
+	mpu_prototypes.h
+	mpu_wrappers.h
+	portable.h
+	projdefs.h
+	queue.h
+	semphr.h
+	StackMacros.h
+	task.h
+	timers.h
+)
+
+SET(CMSIS_OS_SRC_FILE cmsis_os.c)
+SET(CMSIS_OS_INC_FILE cmsis_os.h)
+
+SET(PORT_ARM_SRC_FILE port.c)
+SET(PORTMACRO_ARM_HEADER portmacro.h)
+
+IF(NOT FREERTOS_HEAP_IMPL)
+	MESSAGE(FATAL_ERROR "FREERTOS_HEAP_IMPL not defined. Define it to include proper heap implementation file.")
+ELSE()
+	SET(HEAP_IMP_FILE heap_${FREERTOS_HEAP_IMPL}.c)
+ENDIF()
+
+FIND_PATH(FREERTOS_COMMON_INC_DIR ${FREERTOS_HEADERS}
+	PATH_SUFFIXES include
+	HINTS ${STM32Cube_DIR}/Middlewares/Third_Party/FreeRTOS/Source
+	CMAKE_FIND_ROOT_PATH_BOTH
+)
+
+FIND_PATH(CMSIS_OS_INC_DIR ${CMSIS_OS_INC_FILE}
+	PATH_SUFFIXES CMSIS_RTOS
+	HINTS ${STM32Cube_DIR}/Middlewares/Third_Party/FreeRTOS/Source
+	CMAKE_FIND_ROOT_PATH_BOTH
+)
+
+FIND_PATH(PORTMACRO_INC_DIR ${PORTMACRO_ARM_HEADER}
+	PATH_SUFFIXES ARM_${PORT_GCC_DIR_SUFFIX}
+	HINTS ${STM32Cube_DIR}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC
+	CMAKE_FIND_ROOT_PATH_BOTH
+)
+
+FOREACH(SRC ${FREERTOS_SRC_FILES})
+    STRING(MAKE_C_IDENTIFIER "${SRC}" SRC_CLEAN)
+	SET(FREERTOS_${SRC_CLEAN}_FILE FREERTOS_SRC_FILE-NOTFOUND)
+	FIND_FILE(FREERTOS_${SRC_CLEAN}_FILE ${SRC}
+		HINTS ${STM32Cube_DIR}/Middlewares/Third_Party/FreeRTOS/Source
+		CMAKE_FIND_ROOT_PATH_BOTH
+	)
+	LIST(APPEND FREERTOS_SOURCES ${FREERTOS_${SRC_CLEAN}_FILE})
+ENDFOREACH()
+
+FIND_FILE(CMSIS_OS_SOURCE ${CMSIS_OS_SRC_FILE}
+	PATH_SUFFIXES CMSIS_RTOS
+	HINTS ${STM32Cube_DIR}/Middlewares/Third_Party/FreeRTOS/Source
+	CMAKE_FIND_ROOT_PATH_BOTH
+)
+
+FIND_FILE(PORT_ARM_SOURCE ${PORT_ARM_SRC_FILE}
+	PATH_SUFFIXES ARM_${PORT_GCC_DIR_SUFFIX}
+	HINTS ${STM32Cube_DIR}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC
+	CMAKE_FIND_ROOT_PATH_BOTH
+)
+
+FIND_FILE(HEAP_IMP_SOURCE ${HEAP_IMP_FILE}
+	PATH_SUFFIXES MemMang
+	HINTS ${STM32Cube_DIR}/Middlewares/Third_Party/FreeRTOS/Source/portable
+	CMAKE_FIND_ROOT_PATH_BOTH
+)
+
+SET(FreeRTOS_INCLUDE_DIRS
+	${FREERTOS_COMMON_INC_DIR}
+	${CMSIS_OS_INC_DIR}
+	${PORTMACRO_INC_DIR}
+)
+
+SET(FreeRTOS_SOURCES
+	${FREERTOS_SOURCES}
+	${CMSIS_OS_SOURCE}
+	${PORT_ARM_SOURCE}
+	${HEAP_IMP_SOURCE}
+)
+
+INCLUDE(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(FreeRTOS DEFAULT_MSG FreeRTOS_INCLUDE_DIRS FreeRTOS_SOURCES)