summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorhathach <[email protected]>2026-04-14 10:51:20 +0700
committerhathach <[email protected]>2026-04-14 10:51:20 +0700
commit44b0ee05390b0f97d006a016b25fa513699e0a96 (patch)
tree93decf8946c6eacabcae6d063fb5d576c99e5d86 /hw
parent7c3f5979ff9be05b7938f10dbaa6e55daaf8bdc1 (diff)
get freertos working with rp2040
Diffstat (limited to 'hw')
-rw-r--r--hw/bsp/family_support.cmake71
-rw-r--r--hw/bsp/rp2040/family.c14
-rw-r--r--hw/bsp/rp2040/family.cmake48
3 files changed, 94 insertions, 39 deletions
diff --git a/hw/bsp/family_support.cmake b/hw/bsp/family_support.cmake
index 2274515e4..d69884407 100644
--- a/hw/bsp/family_support.cmake
+++ b/hw/bsp/family_support.cmake
@@ -367,24 +367,66 @@ endfunction()
# Most families use these settings except rp2040 and espressif
#-------------------------------------------------------------
function(family_add_board BOARD_TARGET)
- # empty function, should be redefined in FAMILY/family.cmake
+ # empty function, should be overridden in FAMILY/family.cmake
endfunction()
# Add RTOS to example
function(family_add_rtos TARGET RTOS)
if (RTOS STREQUAL "freertos")
- if (NOT TARGET freertos_config)
- add_library(freertos_config INTERFACE)
- target_include_directories(freertos_config INTERFACE ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${FAMILY}/FreeRTOSConfig)
- # add board definition to freertos_config mostly for SystemCoreClock
- target_link_libraries(freertos_config INTERFACE board_${BOARD})
+ # RP2040 family uses Raspberry Pi's FreeRTOS-Kernel fork with platform-specific SMP port
+ if (FAMILY STREQUAL "rp2040")
+ if (NOT TARGET FreeRTOS-Kernel)
+ set(FREERTOS_KERNEL_PATH ${TOP}/hw/mcu/raspberry_pi/FreeRTOS-Kernel)
+ set(FREERTOS_CONFIG_FILE_DIRECTORY ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${FAMILY}/FreeRTOSConfig)
+ if (PICO_PLATFORM STREQUAL "rp2040")
+ set(FREERTOS_PORT_PATH ${FREERTOS_KERNEL_PATH}/portable/ThirdParty/GCC/RP2040)
+ else()
+ set(FREERTOS_PORT_PATH ${FREERTOS_KERNEL_PATH}/portable/ThirdParty/GCC/RP2350_ARM_NTZ)
+ endif()
+ include(${FREERTOS_PORT_PATH}/library.cmake)
+ endif()
+ target_link_libraries(${TARGET} PUBLIC FreeRTOS-Kernel-Static)
+
+ # Suppress warnings in FreeRTOS kernel port sources
+ foreach(_ft IN ITEMS FreeRTOS-Kernel FreeRTOS-Kernel-Core FreeRTOS-Kernel-Static)
+ get_target_property(_srcs ${_ft} INTERFACE_SOURCES)
+ if (_srcs)
+ set_source_files_properties(${_srcs} PROPERTIES COMPILE_OPTIONS "-w")
+ endif()
+ endforeach()
+
+ # FreeRTOS headers use undefined macros in #if (triggers -Wundef/-Werror).
+ # Convert all FreeRTOS include dirs to SYSTEM to suppress warnings.
+ foreach(_ft IN ITEMS FreeRTOS-Kernel FreeRTOS-Kernel-Core)
+ get_target_property(_incs ${_ft} INTERFACE_INCLUDE_DIRECTORIES)
+ if (_incs)
+ set_target_properties(${_ft} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "")
+ target_include_directories(${_ft} SYSTEM INTERFACE ${_incs})
+ endif()
+ endforeach()
+ else()
+ # All other families: use upstream FreeRTOS-Kernel with add_subdirectory
+ if (NOT TARGET freertos_config)
+ add_library(freertos_config INTERFACE)
+ target_include_directories(freertos_config INTERFACE
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${FAMILY}/FreeRTOSConfig)
+ target_link_libraries(freertos_config INTERFACE board_${BOARD})
+ endif()
+
+ if (NOT TARGET freertos_kernel)
+ add_subdirectory(${TOP}/lib/FreeRTOS-Kernel ${CMAKE_BINARY_DIR}/lib/freertos_kernel)
+ endif ()
+
+ target_link_libraries(${TARGET} PUBLIC freertos_kernel)
endif()
- if (NOT TARGET freertos_kernel)
- add_subdirectory(${TOP}/lib/FreeRTOS-Kernel ${CMAKE_BINARY_DIR}/lib/freertos_kernel)
- endif ()
+ # RP2040: remove CFG_TUSB_OS=OPT_OS_PICO from tinyusb_common_base to avoid redefinition
+ if (FAMILY STREQUAL "rp2040" AND TARGET tinyusb_common_base)
+ get_target_property(_defs tinyusb_common_base INTERFACE_COMPILE_DEFINITIONS)
+ list(REMOVE_ITEM _defs "CFG_TUSB_OS=${TINYUSB_OPT_OS}")
+ set_property(TARGET tinyusb_common_base PROPERTY INTERFACE_COMPILE_DEFINITIONS ${_defs})
+ endif()
- target_link_libraries(${TARGET} PUBLIC freertos_kernel)
target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_OS=OPT_OS_FREERTOS)
elseif (RTOS STREQUAL "threadx")
if (NOT TARGET threadx)
@@ -465,7 +507,10 @@ function(family_configure_common TARGET RTOS)
target_compile_definitions(${TARGET} PUBLIC LOGGER_UART)
endif ()
- if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ # rp2040 family handles warnings and linker map in its own family_configure_example
+ if (FAMILY STREQUAL "rp2040")
+ # skip - handled by rp2040_family_configure_example_warnings
+ elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
target_compile_options(${TARGET} PRIVATE ${WARN_FLAGS_${CMAKE_C_COMPILER_ID}})
target_link_options(${TARGET} PUBLIC "LINKER:-Map=$<TARGET_FILE:${TARGET}>.map")
if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0
@@ -557,11 +602,11 @@ endfunction()
#-------------------------------------------------------
# Example Target Configure (Default rule)
-# These function can be redefined in FAMILY/family.cmake
+# These function can be overridden in FAMILY/family.cmake
#--------------------------------------------------------
function(family_configure_example TARGET RTOS)
- # empty function, should be redefined in FAMILY/family.cmake
+ # empty function, should be overridden in FAMILY/family.cmake
endfunction()
# Configure device example with RTOS
diff --git a/hw/bsp/rp2040/family.c b/hw/bsp/rp2040/family.c
index b5a1375a2..a4642face 100644
--- a/hw/bsp/rp2040/family.c
+++ b/hw/bsp/rp2040/family.c
@@ -298,6 +298,20 @@ void board_init_after_tusb(void) {
// nothing to do
}
+//--------------------------------------------------------------------+
+// FreeRTOS hooks
+//--------------------------------------------------------------------+
+#if CFG_TUSB_OS == OPT_OS_FREERTOS
+#include "FreeRTOS.h"
+#include "task.h"
+
+void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
+ (void) xTask;
+ (void) pcTaskName;
+ panic("FreeRTOS stack overflow: %s", pcTaskName);
+}
+#endif
+
void board_reset_to_bootloader(void) {
// not implemented
}
diff --git a/hw/bsp/rp2040/family.cmake b/hw/bsp/rp2040/family.cmake
index 2e2cd436a..f125caafe 100644
--- a/hw/bsp/rp2040/family.cmake
+++ b/hw/bsp/rp2040/family.cmake
@@ -231,36 +231,32 @@ function(family_add_default_example_warnings TARGET)
endif()
endfunction()
+function(family_add_board BOARD_TARGET)
+ add_library(${BOARD_TARGET} INTERFACE)
+endfunction()
-# TODO merge with family_configure_common from family_support.cmake
-function(family_configure_target TARGET RTOS)
- if (RTOS STREQUAL noos OR RTOS STREQUAL "")
- set(RTOS_SUFFIX "")
- else()
- set(RTOS_SUFFIX _${RTOS})
- endif()
- # export RTOS_SUFFIX to parent scope
- set(RTOS_SUFFIX ${RTOS_SUFFIX} PARENT_SCOPE)
- # compile define from command line
- if(DEFINED CFLAGS_CLI)
- separate_arguments(CFLAGS_CLI)
- target_compile_options(${TARGET} PUBLIC ${CFLAGS_CLI})
+function(family_configure_example TARGET RTOS)
+ # Set OS per-target: FreeRTOS or Pico SDK
+ if (NOT DEFINED RTOS)
+ set(RTOS noos CACHE STRING "RTOS")
+ endif ()
+
+ family_configure_common(${TARGET} ${RTOS})
+
+ # Set OS for non-RTOS targets (RTOS targets get it from family_add_rtos)
+ if (NOT RTOS STREQUAL "freertos")
+ target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_OS=${TINYUSB_OPT_OS})
endif()
pico_add_extra_outputs(${TARGET})
pico_enable_stdio_uart(${TARGET} 1)
- target_link_options(${TARGET} PUBLIC "LINKER:-Map=$<TARGET_FILE:${TARGET}>.map")
- target_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_board${RTOS_SUFFIX} tinyusb_additions)
+ target_link_options(${TARGET} PUBLIC "LINKER:-Map=$<TARGET_FILE:${TARGET}>.map")
+ target_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_board tinyusb_additions)
- family_flash_openocd(${TARGET})
+ family_flash_openocd(${TARGET})
family_flash_jlink(${TARGET})
-
- # Generate linkermap target and post build. LINKERMAP_OPTION can be set with -D to change default options
- family_add_bloaty(${TARGET})
- family_add_linkermap(${TARGET})
- family_add_membrowse(${TARGET})
endfunction()
@@ -276,8 +272,8 @@ endfunction()
function(family_configure_device_example TARGET RTOS)
- family_configure_target(${TARGET} ${RTOS})
- target_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_device${RTOS_SUFFIX})
+ family_configure_example(${TARGET} ${RTOS})
+ target_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_device)
rp2040_family_configure_example_warnings(${TARGET})
endfunction()
@@ -298,8 +294,8 @@ function(is_compiler_supported_by_pico_pio_usb OUTVAR)
endfunction()
function(family_configure_host_example TARGET RTOS)
- family_configure_target(${TARGET} ${RTOS})
- target_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_host${RTOS_SUFFIX})
+ family_configure_example(${TARGET} ${RTOS})
+ target_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_host)
rp2040_family_configure_example_warnings(${TARGET})
# For rp2040 enable pico-pio-usb
@@ -319,7 +315,7 @@ endfunction()
function(family_configure_dual_usb_example TARGET RTOS)
- family_configure_target(${TARGET} ${RTOS})
+ family_configure_example(${TARGET} ${RTOS})
# require tinyusb_pico_pio_usb
target_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_device tinyusb_host tinyusb_pico_pio_usb )
rp2040_family_configure_example_warnings(${TARGET})