Files

115 lines
4.4 KiB
CMake

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})