As the offsets into the TX_THREAD are needed to access certain fields and the members for smp are quite difficult to obtain this was the safest option
73 lines
2.8 KiB
CMake
73 lines
2.8 KiB
CMake
set(THREADX_COMMON_SMP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../third-party/threadx/common_smp)
|
|
if(NOT EXISTS "${THREADX_COMMON_SMP_DIR}")
|
|
message(FATAL_ERROR "could not find ThreadX SMP sources, is the submodule checked out?")
|
|
endif()
|
|
|
|
set(THREADX_SMP_CUSTOM_INC
|
|
${CMAKE_CURRENT_SOURCE_DIR}/inc
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../moonlight
|
|
)
|
|
set(THREADX_SMP_CUSTOM_SRC
|
|
src/tx_thread_smp_core_preempt.c
|
|
src/tx_initialize_low_level.S
|
|
src/tx_thread_schedule.S
|
|
)
|
|
set(THREADX_SMP_GENERATED_INC_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
|
|
set(THREADX_SMP_OFFSET_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/tx_asm_offsets.c)
|
|
set(THREADX_SMP_OFFSET_ASM ${THREADX_SMP_GENERATED_INC_DIR}/tx_asm_offsets.s)
|
|
set(THREADX_SMP_OFFSET_INC ${THREADX_SMP_GENERATED_INC_DIR}/tx_asm_offsets.inc)
|
|
|
|
file(GLOB THREADX_SMP_SOURCES ${THREADX_COMMON_SMP_DIR}/src/*.c)
|
|
add_library(threadx_smp STATIC)
|
|
target_sources(threadx_smp PRIVATE
|
|
${THREADX_SMP_SOURCES}
|
|
${THREADX_SMP_CUSTOM_SRC}
|
|
)
|
|
target_include_directories(threadx_smp PUBLIC
|
|
${THREADX_COMMON_SMP_DIR}/inc
|
|
${THREADX_SMP_CUSTOM_INC}
|
|
)
|
|
target_include_directories(threadx_smp PRIVATE
|
|
${THREADX_SMP_GENERATED_INC_DIR}
|
|
)
|
|
target_compile_definitions(threadx_smp PRIVATE -DTX_QUEUE_MESSAGE_MAX_SIZE=16) #This is addressed in PR #503
|
|
|
|
add_custom_command(
|
|
OUTPUT ${THREADX_SMP_OFFSET_INC}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${THREADX_SMP_GENERATED_INC_DIR}
|
|
COMMAND ${CMAKE_C_COMPILER}
|
|
$<$<BOOL:$<TARGET_PROPERTY:threadx_smp,INCLUDE_DIRECTORIES>>:$<LIST:TRANSFORM,$<TARGET_PROPERTY:threadx_smp,INCLUDE_DIRECTORIES>,PREPEND,-I>>
|
|
$<$<BOOL:$<TARGET_PROPERTY:threadx_smp,COMPILE_DEFINITIONS>>:$<LIST:TRANSFORM,$<TARGET_PROPERTY:threadx_smp,COMPILE_DEFINITIONS>,PREPEND,-D>>
|
|
-S
|
|
-o ${THREADX_SMP_OFFSET_ASM}
|
|
${THREADX_SMP_OFFSET_SOURCE}
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-DINPUT=${THREADX_SMP_OFFSET_ASM}
|
|
-DOUTPUT=${THREADX_SMP_OFFSET_INC}
|
|
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateAsmOffsets.cmake
|
|
DEPENDS
|
|
${THREADX_SMP_OFFSET_SOURCE}
|
|
${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateAsmOffsets.cmake
|
|
${CMAKE_CURRENT_SOURCE_DIR}/inc/tx_port.h
|
|
${THREADX_COMMON_SMP_DIR}/inc/tx_api.h
|
|
COMMAND_EXPAND_LISTS
|
|
VERBATIM
|
|
)
|
|
|
|
add_custom_target(threadx_smp_offsets DEPENDS ${THREADX_SMP_OFFSET_INC})
|
|
add_dependencies(threadx_smp threadx_smp_offsets)
|
|
|
|
|
|
#Definition smp_demo
|
|
project(smp_demo LANGUAGES C ASM)
|
|
cmake_minimum_required(VERSION 3.24)
|
|
add_executable(smp_demo)
|
|
target_include_directories(smp_demo PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../moonlight
|
|
)
|
|
target_link_libraries(smp_demo PRIVATE threadx_smp)
|
|
|
|
target_sources(smp_demo PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../src/thread_demo/main.c)
|
|
|
|
#cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=$PWD/../../cmake/rv32gc_gnu.cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=YES
|