feat: rebuild heap4 card around upstream FreeRTOS allocator
This commit is contained in:
+114
@@ -0,0 +1,114 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
if(NOT PICO_SDK_PATH)
|
||||
if(DEFINED ENV{PICO_SDK_PATH})
|
||||
set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})
|
||||
else()
|
||||
message(FATAL_ERROR "Set PICO_SDK_PATH to a Raspberry Pi Pico SDK checkout")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
include(${PICO_SDK_PATH}/external/pico_sdk_import.cmake)
|
||||
|
||||
project(freertos_heap4_rp2350 C CXX ASM)
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
|
||||
# The card and allocator are C-only. Debian's compact RISC-V toolchain does
|
||||
# not ship libstdc++ headers, so keep the SDK's optional new/delete source out
|
||||
# while preserving the interface targets expected by pico_stdlib.
|
||||
add_library(pico_cxx_options_headers INTERFACE)
|
||||
target_include_directories(pico_cxx_options_headers SYSTEM INTERFACE
|
||||
${PICO_SDK_PATH}/src/rp2_common/pico_cxx_options/include)
|
||||
add_library(pico_cxx_options INTERFACE)
|
||||
target_link_libraries(pico_cxx_options INTERFACE pico_cxx_options_headers)
|
||||
|
||||
pico_sdk_init()
|
||||
|
||||
if(NOT PICO_PLATFORM STREQUAL "rp2350-riscv")
|
||||
message(FATAL_ERROR "This card targets the RP2350 RISC-V cores")
|
||||
endif()
|
||||
if(NOT HEAP4_UPSTREAM_ROOT)
|
||||
if(DEFINED ENV{HEAP4_UPSTREAM_ROOT})
|
||||
set(HEAP4_UPSTREAM_ROOT $ENV{HEAP4_UPSTREAM_ROOT})
|
||||
else()
|
||||
set(HEAP4_UPSTREAM_ROOT /opt/FreeRTOS-Kernel)
|
||||
endif()
|
||||
endif()
|
||||
if(NOT EXISTS ${HEAP4_UPSTREAM_ROOT}/portable/MemMang/heap_4.c)
|
||||
message(FATAL_ERROR "Pinned FreeRTOS heap_4.c not found at ${HEAP4_UPSTREAM_ROOT}")
|
||||
endif()
|
||||
if(NOT FREERTOS_RP2350_PATH)
|
||||
if(DEFINED ENV{FREERTOS_RP2350_PATH})
|
||||
set(FREERTOS_RP2350_PATH $ENV{FREERTOS_RP2350_PATH})
|
||||
else()
|
||||
set(FREERTOS_RP2350_PATH /opt/FreeRTOS-RP2350)
|
||||
endif()
|
||||
endif()
|
||||
if(NOT EXISTS ${FREERTOS_RP2350_PATH}/portable/ThirdParty/GCC/RP2350_RISC-V/portASM.S)
|
||||
message(FATAL_ERROR "Compatible RP2350 FreeRTOS core/port not found at ${FREERTOS_RP2350_PATH}")
|
||||
endif()
|
||||
|
||||
set(FREERTOS_CONFIG_FILE_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/include)
|
||||
# Raspberry Pi's port CMake uses FREERTOS_KERNEL_PATH for its matching core.
|
||||
# Keep the stable allocator root separate and add its heap_4.c explicitly.
|
||||
set(FREERTOS_KERNEL_PATH ${FREERTOS_RP2350_PATH})
|
||||
add_subdirectory(
|
||||
${FREERTOS_RP2350_PATH}/portable/ThirdParty/GCC/RP2350_RISC-V
|
||||
${CMAKE_BINARY_DIR}/freertos-kernel)
|
||||
|
||||
set(HEAP4_PROFILE "observe" CACHE STRING "observe, debug or release")
|
||||
set_property(CACHE HEAP4_PROFILE PROPERTY STRINGS observe debug release)
|
||||
set(HEAP4_BINARY_TYPE "no_flash" CACHE STRING "Pico SDK binary type")
|
||||
set_property(CACHE HEAP4_BINARY_TYPE PROPERTY STRINGS no_flash default)
|
||||
|
||||
if(HEAP4_PROFILE STREQUAL "observe")
|
||||
set(HEAP4_COMPILE_OPTIONS
|
||||
-O0 -g3 -fno-omit-frame-pointer -fno-inline
|
||||
-fno-optimize-sibling-calls)
|
||||
elseif(HEAP4_PROFILE STREQUAL "debug")
|
||||
set(HEAP4_COMPILE_OPTIONS
|
||||
-Og -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls)
|
||||
elseif(HEAP4_PROFILE STREQUAL "release")
|
||||
set(HEAP4_COMPILE_OPTIONS -O2)
|
||||
else()
|
||||
message(FATAL_ERROR "HEAP4_PROFILE must be observe, debug or release")
|
||||
endif()
|
||||
|
||||
set(MODEL_TASKS
|
||||
task01_first_fit_split
|
||||
task02_address_order_coalesce)
|
||||
|
||||
foreach(task IN LISTS MODEL_TASKS)
|
||||
set(task_source src/tasks/${task}.c)
|
||||
add_executable(${task} ${task_source})
|
||||
target_include_directories(${task} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src/tasks)
|
||||
set_property(SOURCE ${task_source} APPEND PROPERTY COMPILE_OPTIONS
|
||||
${HEAP4_COMPILE_OPTIONS} -Wall -Wextra -Wpedantic)
|
||||
target_link_libraries(${task} pico_stdlib)
|
||||
pico_enable_stdio_usb(${task} 0)
|
||||
pico_enable_stdio_uart(${task} 0)
|
||||
if(NOT HEAP4_BINARY_TYPE STREQUAL "default")
|
||||
pico_set_binary_type(${task} ${HEAP4_BINARY_TYPE})
|
||||
endif()
|
||||
pico_add_extra_outputs(${task})
|
||||
endforeach()
|
||||
|
||||
set(heap4_task task03_freertos_heap4)
|
||||
set(heap4_source src/tasks/${heap4_task}.c)
|
||||
add_executable(${heap4_task} ${heap4_source})
|
||||
target_sources(${heap4_task} PRIVATE
|
||||
${HEAP4_UPSTREAM_ROOT}/portable/MemMang/heap_4.c)
|
||||
target_include_directories(${heap4_task} PRIVATE
|
||||
${CMAKE_CURRENT_LIST_DIR}/include
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/tasks)
|
||||
set_property(SOURCE ${heap4_source} APPEND PROPERTY COMPILE_OPTIONS
|
||||
${HEAP4_COMPILE_OPTIONS} -Wall -Wextra -Wpedantic)
|
||||
target_link_libraries(${heap4_task} pico_stdlib FreeRTOS-Kernel)
|
||||
pico_enable_stdio_usb(${heap4_task} 0)
|
||||
pico_enable_stdio_uart(${heap4_task} 0)
|
||||
if(NOT HEAP4_BINARY_TYPE STREQUAL "default")
|
||||
pico_set_binary_type(${heap4_task} ${HEAP4_BINARY_TYPE})
|
||||
endif()
|
||||
pico_add_extra_outputs(${heap4_task})
|
||||
Reference in New Issue
Block a user