removes convoluted generation of offsets
Ass ULONG is now 8 bytes on RV64, the SMP offset is the only one left, harcoding it as a magic number is simpler
This commit is contained in:
@@ -1,8 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.24)
|
cmake_minimum_required(VERSION 3.24)
|
||||||
project(smp_demo LANGUAGES C ASM)
|
project(smp_demo LANGUAGES C ASM)
|
||||||
|
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ThreadXSmpOffsets.cmake)
|
|
||||||
|
|
||||||
set(THREADX_COMMON_SMP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../third-party/threadx/common_smp)
|
set(THREADX_COMMON_SMP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../third-party/threadx/common_smp)
|
||||||
if(NOT EXISTS "${THREADX_COMMON_SMP_DIR}")
|
if(NOT EXISTS "${THREADX_COMMON_SMP_DIR}")
|
||||||
message(FATAL_ERROR "could not find ThreadX SMP sources, is the submodule checked out?")
|
message(FATAL_ERROR "could not find ThreadX SMP sources, is the submodule checked out?")
|
||||||
@@ -31,19 +29,6 @@ set(THREADX_SMP_CUSTOM_SRC
|
|||||||
src/tx_timer_interrupt.c
|
src/tx_timer_interrupt.c
|
||||||
)
|
)
|
||||||
|
|
||||||
threadx_smp_add_offsets(
|
|
||||||
TARGET threadx_smp_offsets
|
|
||||||
OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
|
|
||||||
SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/tx_asm_offsets.c
|
|
||||||
INCLUDE_DIRS
|
|
||||||
${THREADX_COMMON_SMP_DIR}/inc
|
|
||||||
${THREADX_SMP_CUSTOM_INC}
|
|
||||||
DEPENDS
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/inc/tx_port.h
|
|
||||||
${THREADX_COMMON_SMP_DIR}/inc/tx_api.h
|
|
||||||
OUT_INCLUDE_DIR THREADX_SMP_GENERATED_INC_DIR
|
|
||||||
)
|
|
||||||
|
|
||||||
set(THREADX_SMP_SOURCES
|
set(THREADX_SMP_SOURCES
|
||||||
${THREADX_COMMON_SMP_DIR}/src/tx_block_allocate.c
|
${THREADX_COMMON_SMP_DIR}/src/tx_block_allocate.c
|
||||||
${THREADX_COMMON_SMP_DIR}/src/tx_block_pool_cleanup.c
|
${THREADX_COMMON_SMP_DIR}/src/tx_block_pool_cleanup.c
|
||||||
@@ -250,8 +235,4 @@ target_include_directories(threadx_smp PUBLIC
|
|||||||
${THREADX_COMMON_SMP_DIR}/inc
|
${THREADX_COMMON_SMP_DIR}/inc
|
||||||
${THREADX_SMP_CUSTOM_INC}
|
${THREADX_SMP_CUSTOM_INC}
|
||||||
)
|
)
|
||||||
target_include_directories(threadx_smp PRIVATE
|
|
||||||
${THREADX_SMP_GENERATED_INC_DIR}
|
|
||||||
)
|
|
||||||
target_compile_definitions(threadx_smp PRIVATE TX_QUEUE_MESSAGE_MAX_SIZE=16) #This is addressed in PR #503
|
target_compile_definitions(threadx_smp PRIVATE TX_QUEUE_MESSAGE_MAX_SIZE=16) #This is addressed in PR #503
|
||||||
add_dependencies(threadx_smp threadx_smp_offsets)
|
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
function(threadx_smp_add_offsets)
|
|
||||||
set(options)
|
|
||||||
set(oneValueArgs TARGET OUTPUT_DIR SOURCE OUT_INCLUDE_DIR)
|
|
||||||
set(multiValueArgs INCLUDE_DIRS COMPILE_DEFINITIONS DEPENDS)
|
|
||||||
cmake_parse_arguments(THREADX_SMP_OFFSETS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
||||||
|
|
||||||
if(NOT THREADX_SMP_OFFSETS_TARGET)
|
|
||||||
message(FATAL_ERROR "threadx_smp_add_offsets requires TARGET")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT THREADX_SMP_OFFSETS_OUTPUT_DIR)
|
|
||||||
message(FATAL_ERROR "threadx_smp_add_offsets requires OUTPUT_DIR")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT THREADX_SMP_OFFSETS_SOURCE)
|
|
||||||
message(FATAL_ERROR "threadx_smp_add_offsets requires SOURCE")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT THREADX_SMP_OFFSETS_OUT_INCLUDE_DIR)
|
|
||||||
message(FATAL_ERROR "threadx_smp_add_offsets requires OUT_INCLUDE_DIR")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(threadx_smp_generate_script "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/GenerateAsmOffsets.cmake")
|
|
||||||
set(threadx_smp_offset_asm "${THREADX_SMP_OFFSETS_OUTPUT_DIR}/tx_asm_offsets.s")
|
|
||||||
set(threadx_smp_offset_inc "${THREADX_SMP_OFFSETS_OUTPUT_DIR}/tx_asm_offsets.inc")
|
|
||||||
|
|
||||||
set(threadx_smp_offset_include_args ${THREADX_SMP_OFFSETS_INCLUDE_DIRS})
|
|
||||||
list(TRANSFORM threadx_smp_offset_include_args PREPEND -I)
|
|
||||||
|
|
||||||
set(threadx_smp_offset_define_args ${THREADX_SMP_OFFSETS_COMPILE_DEFINITIONS})
|
|
||||||
list(TRANSFORM threadx_smp_offset_define_args PREPEND -D)
|
|
||||||
|
|
||||||
set(threadx_smp_offset_cflags ${CMAKE_C_FLAGS})
|
|
||||||
if(CMAKE_BUILD_TYPE)
|
|
||||||
string(TOUPPER "${CMAKE_BUILD_TYPE}" threadx_smp_build_type_upper)
|
|
||||||
list(APPEND threadx_smp_offset_cflags ${CMAKE_C_FLAGS_${threadx_smp_build_type_upper}})
|
|
||||||
endif()
|
|
||||||
separate_arguments(threadx_smp_offset_cflags)
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${threadx_smp_offset_inc}
|
|
||||||
BYPRODUCTS ${threadx_smp_offset_asm}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${THREADX_SMP_OFFSETS_OUTPUT_DIR}
|
|
||||||
COMMAND ${CMAKE_C_COMPILER}
|
|
||||||
${CMAKE_C_COMPILER_ARG1}
|
|
||||||
${threadx_smp_offset_cflags}
|
|
||||||
${threadx_smp_offset_include_args}
|
|
||||||
${threadx_smp_offset_define_args}
|
|
||||||
-S
|
|
||||||
-o ${threadx_smp_offset_asm}
|
|
||||||
${THREADX_SMP_OFFSETS_SOURCE}
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-DINPUT=${threadx_smp_offset_asm}
|
|
||||||
-DOUTPUT=${threadx_smp_offset_inc}
|
|
||||||
-P ${threadx_smp_generate_script}
|
|
||||||
DEPENDS
|
|
||||||
${THREADX_SMP_OFFSETS_SOURCE}
|
|
||||||
${threadx_smp_generate_script}
|
|
||||||
${THREADX_SMP_OFFSETS_DEPENDS}
|
|
||||||
COMMAND_EXPAND_LISTS
|
|
||||||
VERBATIM
|
|
||||||
)
|
|
||||||
|
|
||||||
add_custom_target(${THREADX_SMP_OFFSETS_TARGET} DEPENDS ${threadx_smp_offset_inc})
|
|
||||||
|
|
||||||
set(${THREADX_SMP_OFFSETS_OUT_INCLUDE_DIR} ${THREADX_SMP_OFFSETS_OUTPUT_DIR} PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
@@ -64,6 +64,7 @@
|
|||||||
#define AMOSWAP_AQ amoswap.d.aq
|
#define AMOSWAP_AQ amoswap.d.aq
|
||||||
#define AMOSWAP_RL amoswap.d.rl
|
#define AMOSWAP_RL amoswap.d.rl
|
||||||
#define LOG_REGBYTES 3
|
#define LOG_REGBYTES 3
|
||||||
|
#define TX_THREAD_SMP_LOCK_READY_BIT_OFFSET 312 // This changes if thread or timer internal extensions are used
|
||||||
#else
|
#else
|
||||||
#define SLL32 sll
|
#define SLL32 sll
|
||||||
#define STORE sw
|
#define STORE sw
|
||||||
@@ -72,11 +73,10 @@
|
|||||||
#define AMOSWAP_AQ amoswap.w.aq
|
#define AMOSWAP_AQ amoswap.w.aq
|
||||||
#define AMOSWAP_RL amoswap.w.rl
|
#define AMOSWAP_RL amoswap.w.rl
|
||||||
#define LOG_REGBYTES 2
|
#define LOG_REGBYTES 2
|
||||||
|
#define TX_THREAD_SMP_LOCK_READY_BIT_OFFSET 168 // This changes if thread or timer internal extensions are used
|
||||||
#endif
|
#endif
|
||||||
#define REGBYTES (1 << LOG_REGBYTES)
|
#define REGBYTES (1 << LOG_REGBYTES)
|
||||||
|
|
||||||
#include "tx_asm_offsets.inc"
|
|
||||||
|
|
||||||
#else /*not __ASSEMBLER__ */
|
#else /*not __ASSEMBLER__ */
|
||||||
|
|
||||||
/************* Define ThreadX SMP constants. *************/
|
/************* Define ThreadX SMP constants. *************/
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#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));
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user