From 2e955b934236b4be7f7802d9c3ebb3edbaab493a Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Tue, 10 Mar 2026 20:59:58 +0100 Subject: [PATCH] adds the generation of the offsetof defines to CMakeLists.txt 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 --- port/threadx_smp/CMakeLists.txt | 40 ++++++++++++++++++- .../cmake/GenerateAsmOffsets.cmake | 22 ++++++++++ port/threadx_smp/src/tx_asm_offsets.c | 14 +++++++ 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 port/threadx_smp/cmake/GenerateAsmOffsets.cmake create mode 100644 port/threadx_smp/src/tx_asm_offsets.c diff --git a/port/threadx_smp/CMakeLists.txt b/port/threadx_smp/CMakeLists.txt index 3927344..87419a1 100644 --- a/port/threadx_smp/CMakeLists.txt +++ b/port/threadx_smp/CMakeLists.txt @@ -3,11 +3,19 @@ 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_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) @@ -19,8 +27,36 @@ 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} + $<$>:$,PREPEND,-I>> + $<$>:$,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) @@ -33,4 +69,4 @@ 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 \ No newline at end of file +#cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=$PWD/../../cmake/rv32gc_gnu.cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=YES diff --git a/port/threadx_smp/cmake/GenerateAsmOffsets.cmake b/port/threadx_smp/cmake/GenerateAsmOffsets.cmake new file mode 100644 index 0000000..9657e20 --- /dev/null +++ b/port/threadx_smp/cmake/GenerateAsmOffsets.cmake @@ -0,0 +1,22 @@ +if(NOT DEFINED INPUT) + message(FATAL_ERROR "INPUT is required") +endif() + +if(NOT DEFINED OUTPUT) + message(FATAL_ERROR "OUTPUT is required") +endif() + +file(STRINGS "${INPUT}" OFFSET_LINES REGEX "->") + +set(OFFSET_CONTENT "/* Generated by GenerateAsmOffsets.cmake. */\n") + +foreach(LINE IN LISTS OFFSET_LINES) + string(REGEX MATCH "->([A-Za-z0-9_]+)[^0-9-]*(-?[0-9]+)" _ "${LINE}") + if(NOT CMAKE_MATCH_1) + continue() + endif() + + string(APPEND OFFSET_CONTENT "#define ${CMAKE_MATCH_1} ${CMAKE_MATCH_2}\n") +endforeach() + +file(WRITE "${OUTPUT}" "${OFFSET_CONTENT}") diff --git a/port/threadx_smp/src/tx_asm_offsets.c b/port/threadx_smp/src/tx_asm_offsets.c new file mode 100644 index 0000000..1ec59fc --- /dev/null +++ b/port/threadx_smp/src/tx_asm_offsets.c @@ -0,0 +1,14 @@ +#include + +#include "tx_api.h" + + +#define TX_ASM_OFFSET(symbol, value) __asm__ volatile("\n.ascii \"->" #symbol " %c0\\n\"" : : "i" (value)) + + +void tx_asm_offsets_generate(void) +{ + TX_ASM_OFFSET(TX_THREAD_STACK_END_OFFSET, offsetof(TX_THREAD, tx_thread_stack_end)); + TX_ASM_OFFSET(TX_THREAD_TIME_SLICE_OFFSET, offsetof(TX_THREAD, tx_thread_time_slice)); + TX_ASM_OFFSET(TX_THREAD_SMP_LOCK_READY_BIT_OFFSET, offsetof(TX_THREAD, tx_thread_smp_lock_ready_bit)); +}