diff --git a/CMakeLists.txt b/CMakeLists.txt index c2f8382..80b54cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,7 @@ add_subdirectory(port/moonlight) function(setup_target TARGET) set(options) - set(oneValueArgs) #None for now + set(oneValueArgs PLATFORM_TARGET) set(multiValueArgs LIBRARIES SOURCES) cmake_parse_arguments(ST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(ST_UNPARSED_ARGUMENTS) @@ -51,7 +51,11 @@ function(setup_target TARGET) set_target_properties(${TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} ) - target_add_moonlight_platform(${TARGET}) + if(ST_PLATFORM_TARGET) + target_add_moonlight_platform(${TARGET} PLATFORM_TARGET ${ST_PLATFORM_TARGET}) + else() + target_add_moonlight_platform(${TARGET}) + endif() if("netxduo" IN_LIST ST_LIBRARIES) target_add_moonlight_network_driver(${TARGET}) @@ -83,4 +87,4 @@ endfunction() setup_target(thread_demo LIBRARIES threadx SOURCES src/thread_demo/main.c) setup_target(tcp_demo LIBRARIES threadx netxduo SOURCES src/tcp_demo/main.c) -setup_target(smp_demo LIBRARIES threadx_smp SOURCES src/thread_demo/main.c) +setup_target(smp_demo PLATFORM_TARGET moonlight_platform_common_smp LIBRARIES threadx_smp SOURCES src/thread_demo/main.c) diff --git a/port/moonlight/CMakeLists.txt b/port/moonlight/CMakeLists.txt index e790854..f56fa22 100644 --- a/port/moonlight/CMakeLists.txt +++ b/port/moonlight/CMakeLists.txt @@ -3,7 +3,7 @@ set(THREADX4TGFS_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..) set(MOONLIGHT_SRC_DIR ${MOONLIGHT_ROOT}/src) set(MOONLIGHT_INC_DIR ${MOONLIGHT_ROOT}/inc) -if(NOT DEFINED MOONLIGHT_TRAP_SOURCE) +if(NOT DEFINED MOONLIGHT_TRAP_SOURCE) # Hook to use vectored traps, also used in regression testing set(MOONLIGHT_TRAP_SOURCE ${MOONLIGHT_SRC_DIR}/trap_non_vectored.c) endif() @@ -15,6 +15,7 @@ set(MOONLIGHT_PLATFORM_SOURCES ${MOONLIGHT_SRC_DIR}/exception.c ${MOONLIGHT_SRC_DIR}/vector_table.c) +# define a basic library containing all generic board components add_library(moonlight_platform_defaults INTERFACE) target_include_directories(moonlight_platform_defaults INTERFACE ${MOONLIGHT_INC_DIR} @@ -32,6 +33,7 @@ if(NX_DEBUG) NX_DEBUG_PACKET) endif() +# helper to tie in different threadx runtimes function(moonlight_define_platform TARGET THREADX_TARGET) add_library(${TARGET} OBJECT ${MOONLIGHT_PLATFORM_SOURCES}) @@ -41,7 +43,10 @@ function(moonlight_define_platform TARGET THREADX_TARGET) ${THREADX_TARGET}) endfunction() -moonlight_define_platform(moonlight_platform_common threadx) +if(TARGET threadx) + moonlight_define_platform(moonlight_platform_common threadx) +endif() + if(TARGET threadx_smp) moonlight_define_platform(moonlight_platform_common_smp threadx_smp) endif() @@ -56,6 +61,7 @@ if(DEFINED NETXDUO_CUSTOM_PORT) netxduo) endif() +# helper for consumers to inject moonlight as a dependency into a target function(target_add_moonlight_platform TARGET) set(options) set(oneValueArgs PLATFORM_TARGET) @@ -66,12 +72,16 @@ function(target_add_moonlight_platform TARGET) endif() if(NOT TAMP_PLATFORM_TARGET) + if(NOT TARGET moonlight_platform_common) + message(FATAL_ERROR "moonlight_platform_common is not available in this build; pass PLATFORM_TARGET explicitly") + endif() set(TAMP_PLATFORM_TARGET moonlight_platform_common) endif() target_link_libraries(${TARGET} PRIVATE ${TAMP_PLATFORM_TARGET}) endfunction() +# helper to inject the network driver into a target function(target_add_moonlight_network_driver TARGET) if(NOT TARGET moonlight_network_driver) message(FATAL_ERROR "moonlight_network_driver requires netxduo to be available in this build") diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt deleted file mode 100644 index 0c9d216..0000000 --- a/test/CMakeLists.txt +++ /dev/null @@ -1,115 +0,0 @@ -cmake_minimum_required(VERSION 3.21) - -set(BUILD_SHARED_LIBS OFF) -get_filename_component(THREADX4TGFS_ROOT "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE) - -if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) - set(CMAKE_TOOLCHAIN_FILE - ${THREADX4TGFS_ROOT}/cmake/rv32imac_gnu.cmake - CACHE FILEPATH "Toolchain file") -endif() -include(${CMAKE_TOOLCHAIN_FILE}) - -set(__THREAD_LOCAL_STORAGE OFF) -add_subdirectory(${THREADX4TGFS_ROOT}/third-party/picolibc ${CMAKE_BINARY_DIR}/picolibc) -target_link_libraries(c PUBLIC gcc) - -set(THREADX_CUSTOM_PORT ${THREADX4TGFS_ROOT}/port/threadx) -add_subdirectory(${THREADX4TGFS_ROOT}/third-party/threadx ${CMAKE_BINARY_DIR}/threadx) -target_link_libraries(threadx PUBLIC c) -target_compile_definitions(threadx PUBLIC TX_REGRESSION_TEST) - -add_subdirectory(${THREADX4TGFS_ROOT}/port/threadx_smp ${CMAKE_BINARY_DIR}/port/threadx_smp) -target_link_libraries(threadx_smp PUBLIC c) -target_compile_definitions(threadx_smp PUBLIC TX_REGRESSION_TEST TX_THREAD_SMP_ONLY_CORE_0_DEFAULT TX_SMP_NOT_POSSIBLE) - -project(threadx_regression C ASM) -enable_testing() -set(TARGET_MEM "ram_dram" CACHE STRING "memory map to use") -set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") - -set(THREADX_TEST_SIMULATOR - "" - CACHE FILEPATH "Path to the RISC-V VP executable used by CTest") -if(NOT THREADX_TEST_SIMULATOR) - message(FATAL_ERROR - "THREADX_TEST_SIMULATOR is not set. Configure with -DTHREADX_TEST_SIMULATOR=/path/to/riscv-vp") -endif() - -# Evaluate the variable from the toolchain file to decide which XLEN we are targetting (IMAC only!) -if(CMAKE_SYSTEM_PROCESSOR STREQUAL "risc-v32") - set(THREADX_TEST_ISA "rv32imac_m") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "risc-v64") - set(THREADX_TEST_ISA "rv64imac_m") -else() - message(FATAL_ERROR - "Unsupported CMAKE_SYSTEM_PROCESSOR for VP ISA selection: ${CMAKE_SYSTEM_PROCESSOR}") -endif() - -# The regression tests require the Timer ISR to call the function test_interrupt_dispatch(void) -# We patch the current trap handler and include it using MOONLIGHT_TRAP_SOURCE. -set(MOONLIGHT_TRAP_SOURCE_INPUT ${THREADX4TGFS_ROOT}/port/moonlight/src/trap_non_vectored.c) -set(MOONLIGHT_TRAP_SOURCE ${CMAKE_BINARY_DIR}/generated/trap_non_vectored.c) -add_custom_command( - OUTPUT ${MOONLIGHT_TRAP_SOURCE} - COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/threadx/generate_trap_file.sh - ${MOONLIGHT_TRAP_SOURCE_INPUT} - ${MOONLIGHT_TRAP_SOURCE} - DEPENDS ${MOONLIGHT_TRAP_SOURCE_INPUT} - ${CMAKE_CURRENT_LIST_DIR}/threadx/generate_trap_file.sh - VERBATIM -) -add_custom_target(threadx_regression_generated_trap DEPENDS ${MOONLIGHT_TRAP_SOURCE}) -set_source_files_properties(${MOONLIGHT_TRAP_SOURCE} PROPERTIES GENERATED TRUE) - -add_subdirectory(${THREADX4TGFS_ROOT}/port/moonlight ${CMAKE_BINARY_DIR}/port/moonlight) -add_dependencies(moonlight_platform_common threadx_regression_generated_trap) -if(TARGET moonlight_platform_common_smp) - add_dependencies(moonlight_platform_common_smp threadx_regression_generated_trap) -endif() - -function(setup_target TARGET) - set(options) - set(oneValueArgs PLATFORM_TARGET) - set(multiValueArgs LIBRARIES SOURCES) - cmake_parse_arguments(ST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - if(ST_UNPARSED_ARGUMENTS) - message(FATAL_ERROR "setup_target(${TARGET} ...): unknown args: ${ST_UNPARSED_ARGUMENTS}") - endif() - - add_executable(${TARGET}) - set_target_properties(${TARGET} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - ) - if(ST_PLATFORM_TARGET) - target_add_moonlight_platform(${TARGET} PLATFORM_TARGET ${ST_PLATFORM_TARGET}) - else() - target_add_moonlight_platform(${TARGET}) - endif() - - if(ST_SOURCES) - target_sources(${TARGET} PRIVATE ${ST_SOURCES}) - endif() - - if(ST_LIBRARIES) - target_link_libraries(${TARGET} PRIVATE ${ST_LIBRARIES}) - endif() - - target_link_options(${TARGET} PRIVATE - -nostartfiles - -nostdlib - -T ${THREADX4TGFS_ROOT}/src/${TARGET_MEM}.lds - -Wl,--gc-sections - -Wl,-Map=${CMAKE_BINARY_DIR}/${TARGET}.map) - - add_custom_command(TARGET ${TARGET} POST_BUILD - COMMAND ${OBJCOPY} -O ihex $ ${CMAKE_BINARY_DIR}/${TARGET}.hex - COMMAND ${OBJCOPY} -O binary $ ${CMAKE_BINARY_DIR}/${TARGET}.bin - #COMMAND ${SIZE} $ - COMMAND ${OBJDUMP} -S $ > ${CMAKE_BINARY_DIR}/${TARGET}.dis - #COMMENT "Creating collateral for ${TARGET}" - ) -endfunction() - -add_subdirectory(threadx regression_targets) -add_subdirectory(smp smp_regression_targets) diff --git a/test/CMakePresets.json b/test/CMakePresets.json deleted file mode 100644 index 240564f..0000000 --- a/test/CMakePresets.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "version": 3, - "cmakeMinimumRequired": { - "major": 3, - "minor": 24, - "patch": 0 - }, - "configurePresets": [ - { - "name": "Debug", - "binaryDir": "${sourceDir}/../build/${presetName}/test", - "cacheVariables": { - "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../cmake/rv64imac_gnu.cmake", - "CMAKE_BUILD_TYPE": "Debug", - "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" - } - }, - { - "name": "Debug32", - "binaryDir": "${sourceDir}/../build/${presetName}/test", - "cacheVariables": { - "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../cmake/rv32imac_gnu.cmake", - "CMAKE_BUILD_TYPE": "Debug", - "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" - } - }, - { - "name": "Release", - "binaryDir": "${sourceDir}/../build/${presetName}/test", - "cacheVariables": { - "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../cmake/rv64imac_gnu.cmake", - "CMAKE_BUILD_TYPE": "RelWithDebInfo", - "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" - } - }, - { - "name": "Release32", - "binaryDir": "${sourceDir}/../build/${presetName}/test", - "cacheVariables": { - "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../cmake/rv32imac_gnu.cmake", - "CMAKE_BUILD_TYPE": "RelWithDebInfo", - "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" - } - }, - { - "name": "MinSizeRel", - "binaryDir": "${sourceDir}/../build/${presetName}/test", - "cacheVariables": { - "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../cmake/rv64imac_gnu.cmake", - "CMAKE_BUILD_TYPE": "MinSizeRel", - "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" - } - }, - { - "name": "MinSizeRel32", - "binaryDir": "${sourceDir}/../build/${presetName}/test", - "cacheVariables": { - "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../cmake/rv32imac_gnu.cmake", - "CMAKE_BUILD_TYPE": "MinSizeRel", - "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" - } - } - ], - "buildPresets": [ - { - "name": "Debug", - "configurePreset": "Debug" - }, - { - "name": "Debug32", - "configurePreset": "Debug32" - }, - { - "name": "Release", - "configurePreset": "Release" - }, - { - "name": "Release32", - "configurePreset": "Release32" - }, - { - "name": "MinSizeRel", - "configurePreset": "MinSizeRel" - }, - { - "name": "MinSizeRel32", - "configurePreset": "MinSizeRel32" - } - ] -} diff --git a/test/smp/CMakeLists.txt b/test/smp/CMakeLists.txt index 8cafa8a..73b9ace 100644 --- a/test/smp/CMakeLists.txt +++ b/test/smp/CMakeLists.txt @@ -1,178 +1,275 @@ +cmake_minimum_required(VERSION 3.21) + +set(BUILD_SHARED_LIBS OFF) +get_filename_component(THREADX4TGFS_ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + set(CMAKE_TOOLCHAIN_FILE + ${THREADX4TGFS_ROOT}/cmake/rv32imac_gnu.cmake + CACHE FILEPATH "Toolchain file") +endif() +include(${CMAKE_TOOLCHAIN_FILE}) + +project(threadx_smp_regression LANGUAGES C ASM) +enable_testing() + +set(TARGET_MEM "ram_dram" CACHE STRING "memory map to use") +set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") + +set(THREADX_TEST_SIMULATOR + "" + CACHE FILEPATH "Path to the RISC-V VP executable used by CTest") +if(NOT THREADX_TEST_SIMULATOR) + message(FATAL_ERROR + "THREADX_TEST_SIMULATOR is not set. Configure with -DTHREADX_TEST_SIMULATOR=/path/to/riscv-vp") +endif() + +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "risc-v32") + set(THREADX_TEST_ISA "rv32imac_m") +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "risc-v64") + set(THREADX_TEST_ISA "rv64imac_m") +else() + message(FATAL_ERROR + "Unsupported CMAKE_SYSTEM_PROCESSOR for VP ISA selection: ${CMAKE_SYSTEM_PROCESSOR}") +endif() + +set(__THREAD_LOCAL_STORAGE OFF) +add_subdirectory(${THREADX4TGFS_ROOT}/third-party/picolibc ${CMAKE_BINARY_DIR}/picolibc) +target_link_libraries(c PUBLIC gcc) + +add_subdirectory(${THREADX4TGFS_ROOT}/port/threadx_smp ${CMAKE_BINARY_DIR}/port/threadx_smp) +target_link_libraries(threadx_smp PUBLIC c) +target_compile_definitions(threadx_smp PUBLIC TX_REGRESSION_TEST TX_THREAD_SMP_ONLY_CORE_0_DEFAULT TX_SMP_NOT_POSSIBLE) + +set(MOONLIGHT_TRAP_SOURCE_INPUT ${THREADX4TGFS_ROOT}/port/moonlight/src/trap_non_vectored.c) +set(MOONLIGHT_TRAP_SOURCE ${CMAKE_BINARY_DIR}/generated/trap_non_vectored.c) +add_custom_command( + OUTPUT ${MOONLIGHT_TRAP_SOURCE} + COMMAND bash ${THREADX4TGFS_ROOT}/test/threadx/generate_trap_file.sh + ${MOONLIGHT_TRAP_SOURCE_INPUT} + ${MOONLIGHT_TRAP_SOURCE} + DEPENDS ${MOONLIGHT_TRAP_SOURCE_INPUT} + ${THREADX4TGFS_ROOT}/test/threadx/generate_trap_file.sh + VERBATIM +) +add_custom_target(threadx_regression_generated_trap DEPENDS ${MOONLIGHT_TRAP_SOURCE}) +set_source_files_properties(${MOONLIGHT_TRAP_SOURCE} PROPERTIES GENERATED TRUE) + +add_subdirectory(${THREADX4TGFS_ROOT}/port/moonlight ${CMAKE_BINARY_DIR}/port/moonlight) +add_dependencies(moonlight_platform_common_smp threadx_regression_generated_trap) + +function(setup_target TARGET) + set(options) + set(oneValueArgs PLATFORM_TARGET) + set(multiValueArgs LIBRARIES SOURCES) + cmake_parse_arguments(ST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + if(ST_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "setup_target(${TARGET} ...): unknown args: ${ST_UNPARSED_ARGUMENTS}") + endif() + + add_executable(${TARGET}) + set_target_properties(${TARGET} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + ) + if(ST_PLATFORM_TARGET) + target_add_moonlight_platform(${TARGET} PLATFORM_TARGET ${ST_PLATFORM_TARGET}) + else() + target_add_moonlight_platform(${TARGET}) + endif() + + if(ST_SOURCES) + target_sources(${TARGET} PRIVATE ${ST_SOURCES}) + endif() + + if(ST_LIBRARIES) + target_link_libraries(${TARGET} PRIVATE ${ST_LIBRARIES}) + endif() + + target_link_options(${TARGET} PRIVATE + -nostartfiles + -nostdlib + -T ${THREADX4TGFS_ROOT}/src/${TARGET_MEM}.lds + -Wl,--gc-sections + -Wl,-Map=${CMAKE_BINARY_DIR}/${TARGET}.map) + + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${OBJCOPY} -O ihex $ ${CMAKE_BINARY_DIR}/${TARGET}.hex + COMMAND ${OBJCOPY} -O binary $ ${CMAKE_BINARY_DIR}/${TARGET}.bin + COMMAND ${OBJDUMP} -S $ > ${CMAKE_BINARY_DIR}/${TARGET}.dis + ) +endfunction() + set(TX_REGRESSION_DIR - ${THREADX4TGFS_ROOT}/third-party/threadx/test/smp/regression + ${THREADX4TGFS_ROOT}/third-party/threadx/test/smp/regression ) set(TX_CMAKE_DIR - ${THREADX4TGFS_ROOT}/third-party/threadx/test/tx/cmake + ${THREADX4TGFS_ROOT}/third-party/threadx/test/tx/cmake ) set(TX_REGRESSION_CASES - ${TX_REGRESSION_DIR}/threadx_block_memory_basic_test.c - ${TX_REGRESSION_DIR}/threadx_block_memory_error_detection_test.c - ${TX_REGRESSION_DIR}/threadx_block_memory_information_test.c - ${TX_REGRESSION_DIR}/threadx_block_memory_prioritize_test.c - ${TX_REGRESSION_DIR}/threadx_block_memory_suspension_test.c - ${TX_REGRESSION_DIR}/threadx_block_memory_suspension_timeout_test.c - ${TX_REGRESSION_DIR}/threadx_block_memory_thread_terminate_test.c - ${TX_REGRESSION_DIR}/threadx_byte_memory_basic_test.c - ${TX_REGRESSION_DIR}/threadx_byte_memory_information_test.c - ${TX_REGRESSION_DIR}/threadx_byte_memory_prioritize_test.c - ${TX_REGRESSION_DIR}/threadx_byte_memory_suspension_test.c - ${TX_REGRESSION_DIR}/threadx_byte_memory_suspension_timeout_test.c - ${TX_REGRESSION_DIR}/threadx_byte_memory_thread_contention_test.c - ${TX_REGRESSION_DIR}/threadx_byte_memory_thread_terminate_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_basic_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_information_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_isr_set_clear_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_isr_wait_abort_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_single_thread_terminate_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_consume_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_different_bits_consume_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_different_bits_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_timeout_test.c - ${TX_REGRESSION_DIR}/threadx_event_flag_thread_terminate_test.c - ${TX_REGRESSION_DIR}/threadx_interrupt_control_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_basic_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_delete_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_information_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_nested_priority_inheritance_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_no_preemption_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_preemption_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_priority_inheritance_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_proritize_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_suspension_timeout_test.c - ${TX_REGRESSION_DIR}/threadx_mutex_thread_terminate_test.c - ${TX_REGRESSION_DIR}/threadx_queue_basic_eight_word_test.c - ${TX_REGRESSION_DIR}/threadx_queue_basic_four_word_test.c - ${TX_REGRESSION_DIR}/threadx_queue_basic_one_word_test.c - ${TX_REGRESSION_DIR}/threadx_queue_basic_sixteen_word_test.c - ${TX_REGRESSION_DIR}/threadx_queue_basic_two_word_test.c - ${TX_REGRESSION_DIR}/threadx_queue_basic_max_message_size_test.c - ${TX_REGRESSION_DIR}/threadx_queue_empty_suspension_test.c - ${TX_REGRESSION_DIR}/threadx_queue_flush_no_suspension_test.c - ${TX_REGRESSION_DIR}/threadx_queue_flush_test.c - ${TX_REGRESSION_DIR}/threadx_queue_front_send_test.c - ${TX_REGRESSION_DIR}/threadx_queue_full_suspension_test.c - ${TX_REGRESSION_DIR}/threadx_queue_information_test.c - ${TX_REGRESSION_DIR}/threadx_queue_prioritize.c - ${TX_REGRESSION_DIR}/threadx_queue_suspension_timeout_test.c - ${TX_REGRESSION_DIR}/threadx_queue_thread_terminate_test.c - ${TX_REGRESSION_DIR}/threadx_semaphore_basic_test.c - ${TX_REGRESSION_DIR}/threadx_semaphore_ceiling_put_test.c - ${TX_REGRESSION_DIR}/threadx_semaphore_delete_test.c - ${TX_REGRESSION_DIR}/threadx_semaphore_information_test.c - ${TX_REGRESSION_DIR}/threadx_semaphore_non_preemption_test.c - ${TX_REGRESSION_DIR}/threadx_semaphore_preemption_test.c - ${TX_REGRESSION_DIR}/threadx_semaphore_prioritize.c - ${TX_REGRESSION_DIR}/threadx_semaphore_thread_terminate_test.c - ${TX_REGRESSION_DIR}/threadx_semaphore_timeout_test.c - ${TX_REGRESSION_DIR}/threadx_smp_multiple_threads_one_core_test.c - ${TX_REGRESSION_DIR}/threadx_smp_non_trivial_scheduling_test.c - ${TX_REGRESSION_DIR}/threadx_smp_one_thread_dynamic_exclusion_test.c - ${TX_REGRESSION_DIR}/threadx_smp_preemption_threshold_test.c - ${TX_REGRESSION_DIR}/threadx_smp_random_resume_suspend_exclusion_pt_test.c - ${TX_REGRESSION_DIR}/threadx_smp_random_resume_suspend_exclusion_test.c - ${TX_REGRESSION_DIR}/threadx_smp_random_resume_suspend_test.c - ${TX_REGRESSION_DIR}/threadx_smp_rebalance_exclusion_test.c - ${TX_REGRESSION_DIR}/threadx_smp_relinquish_test.c - ${TX_REGRESSION_DIR}/threadx_smp_resume_suspend_accending_order_test.c - ${TX_REGRESSION_DIR}/threadx_smp_resume_suspend_decending_order_test.c - ${TX_REGRESSION_DIR}/threadx_smp_time_slice_test.c - ${TX_REGRESSION_DIR}/threadx_smp_two_threads_one_core_test.c - ${TX_REGRESSION_DIR}/threadx_thread_basic_execution_test.c - ${TX_REGRESSION_DIR}/threadx_thread_basic_time_slice_test.c - ${TX_REGRESSION_DIR}/threadx_thread_completed_test.c - ${TX_REGRESSION_DIR}/threadx_thread_create_preemption_threshold_test.c - ${TX_REGRESSION_DIR}/threadx_thread_delayed_suspension_test.c - ${TX_REGRESSION_DIR}/threadx_thread_information_test.c - ${TX_REGRESSION_DIR}/threadx_thread_multi_level_preemption_threshold_test.c - ${TX_REGRESSION_DIR}/threadx_thread_multiple_non_current_test.c - ${TX_REGRESSION_DIR}/threadx_thread_multiple_sleep_test.c - ${TX_REGRESSION_DIR}/threadx_thread_multiple_suspension_test.c - ${TX_REGRESSION_DIR}/threadx_thread_multiple_time_slice_test.c - ${TX_REGRESSION_DIR}/threadx_thread_preemptable_suspension_test.c - ${TX_REGRESSION_DIR}/threadx_thread_preemption_change_test.c - ${TX_REGRESSION_DIR}/threadx_thread_priority_change.c - ${TX_REGRESSION_DIR}/threadx_thread_relinquish_test.c - ${TX_REGRESSION_DIR}/threadx_thread_reset_test.c - ${TX_REGRESSION_DIR}/threadx_thread_simple_sleep_non_clear_test.c - ${TX_REGRESSION_DIR}/threadx_thread_simple_sleep_test.c - ${TX_REGRESSION_DIR}/threadx_thread_simple_suspend_test.c - ${TX_REGRESSION_DIR}/threadx_thread_sleep_for_100ticks_test.c - ${TX_REGRESSION_DIR}/threadx_thread_sleep_terminate_test.c - ${TX_REGRESSION_DIR}/threadx_thread_stack_checking_test.c - ${TX_REGRESSION_DIR}/threadx_thread_terminate_delete_test.c - ${TX_REGRESSION_DIR}/threadx_thread_time_slice_change_test.c - ${TX_REGRESSION_DIR}/threadx_thread_wait_abort_and_isr_test.c - ${TX_REGRESSION_DIR}/threadx_thread_wait_abort_test.c - ${TX_REGRESSION_DIR}/threadx_time_get_set_test.c - ${TX_REGRESSION_DIR}/threadx_timer_activate_deactivate_test.c - ${TX_REGRESSION_DIR}/threadx_timer_deactivate_accuracy_test.c - ${TX_REGRESSION_DIR}/threadx_timer_information_test.c - ${TX_REGRESSION_DIR}/threadx_timer_large_timer_accuracy_test.c - ${TX_REGRESSION_DIR}/threadx_timer_multiple_accuracy_test.c - ${TX_REGRESSION_DIR}/threadx_timer_multiple_test.c - ${TX_REGRESSION_DIR}/threadx_timer_simple_test.c - #${TX_REGRESSION_DIR}/threadx_trace_basic_test.c # requires windows specific port - ${TX_REGRESSION_DIR}/threadx_initialize_kernel_setup_test.c + ${TX_REGRESSION_DIR}/threadx_block_memory_basic_test.c + ${TX_REGRESSION_DIR}/threadx_block_memory_error_detection_test.c + ${TX_REGRESSION_DIR}/threadx_block_memory_information_test.c + ${TX_REGRESSION_DIR}/threadx_block_memory_prioritize_test.c + ${TX_REGRESSION_DIR}/threadx_block_memory_suspension_test.c + ${TX_REGRESSION_DIR}/threadx_block_memory_suspension_timeout_test.c + ${TX_REGRESSION_DIR}/threadx_block_memory_thread_terminate_test.c + ${TX_REGRESSION_DIR}/threadx_byte_memory_basic_test.c + ${TX_REGRESSION_DIR}/threadx_byte_memory_information_test.c + ${TX_REGRESSION_DIR}/threadx_byte_memory_prioritize_test.c + ${TX_REGRESSION_DIR}/threadx_byte_memory_suspension_test.c + ${TX_REGRESSION_DIR}/threadx_byte_memory_suspension_timeout_test.c + ${TX_REGRESSION_DIR}/threadx_byte_memory_thread_contention_test.c + ${TX_REGRESSION_DIR}/threadx_byte_memory_thread_terminate_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_basic_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_information_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_isr_set_clear_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_isr_wait_abort_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_single_thread_terminate_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_consume_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_different_bits_consume_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_different_bits_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_suspension_timeout_test.c + ${TX_REGRESSION_DIR}/threadx_event_flag_thread_terminate_test.c + ${TX_REGRESSION_DIR}/threadx_initialize_kernel_setup_test.c + ${TX_REGRESSION_DIR}/threadx_interrupt_control_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_basic_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_delete_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_information_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_nested_priority_inheritance_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_no_preemption_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_preemption_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_priority_inheritance_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_proritize_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_suspension_timeout_test.c + ${TX_REGRESSION_DIR}/threadx_mutex_thread_terminate_test.c + ${TX_REGRESSION_DIR}/threadx_queue_basic_eight_word_test.c + ${TX_REGRESSION_DIR}/threadx_queue_basic_four_word_test.c + ${TX_REGRESSION_DIR}/threadx_queue_basic_max_message_size_test.c + ${TX_REGRESSION_DIR}/threadx_queue_basic_one_word_test.c + ${TX_REGRESSION_DIR}/threadx_queue_basic_sixteen_word_test.c + ${TX_REGRESSION_DIR}/threadx_queue_basic_two_word_test.c + ${TX_REGRESSION_DIR}/threadx_queue_empty_suspension_test.c + ${TX_REGRESSION_DIR}/threadx_queue_flush_no_suspension_test.c + ${TX_REGRESSION_DIR}/threadx_queue_flush_test.c + ${TX_REGRESSION_DIR}/threadx_queue_front_send_test.c + ${TX_REGRESSION_DIR}/threadx_queue_full_suspension_test.c + ${TX_REGRESSION_DIR}/threadx_queue_information_test.c + ${TX_REGRESSION_DIR}/threadx_queue_prioritize.c + ${TX_REGRESSION_DIR}/threadx_queue_suspension_timeout_test.c + ${TX_REGRESSION_DIR}/threadx_queue_thread_terminate_test.c + ${TX_REGRESSION_DIR}/threadx_semaphore_basic_test.c + ${TX_REGRESSION_DIR}/threadx_semaphore_ceiling_put_test.c + ${TX_REGRESSION_DIR}/threadx_semaphore_delete_test.c + ${TX_REGRESSION_DIR}/threadx_semaphore_information_test.c + ${TX_REGRESSION_DIR}/threadx_semaphore_non_preemption_test.c + ${TX_REGRESSION_DIR}/threadx_semaphore_preemption_test.c + ${TX_REGRESSION_DIR}/threadx_semaphore_prioritize.c + ${TX_REGRESSION_DIR}/threadx_semaphore_thread_terminate_test.c + ${TX_REGRESSION_DIR}/threadx_semaphore_timeout_test.c + ${TX_REGRESSION_DIR}/threadx_smp_multiple_threads_one_core_test.c + ${TX_REGRESSION_DIR}/threadx_smp_non_trivial_scheduling_test.c + ${TX_REGRESSION_DIR}/threadx_smp_one_thread_dynamic_exclusion_test.c + ${TX_REGRESSION_DIR}/threadx_smp_preemption_threshold_test.c + ${TX_REGRESSION_DIR}/threadx_smp_random_resume_suspend_exclusion_pt_test.c + ${TX_REGRESSION_DIR}/threadx_smp_random_resume_suspend_exclusion_test.c + ${TX_REGRESSION_DIR}/threadx_smp_random_resume_suspend_test.c + ${TX_REGRESSION_DIR}/threadx_smp_rebalance_exclusion_test.c + ${TX_REGRESSION_DIR}/threadx_smp_relinquish_test.c + ${TX_REGRESSION_DIR}/threadx_smp_resume_suspend_accending_order_test.c + ${TX_REGRESSION_DIR}/threadx_smp_resume_suspend_decending_order_test.c + ${TX_REGRESSION_DIR}/threadx_smp_time_slice_test.c + ${TX_REGRESSION_DIR}/threadx_smp_two_threads_one_core_test.c + ${TX_REGRESSION_DIR}/threadx_thread_basic_execution_test.c + ${TX_REGRESSION_DIR}/threadx_thread_basic_time_slice_test.c + ${TX_REGRESSION_DIR}/threadx_thread_completed_test.c + ${TX_REGRESSION_DIR}/threadx_thread_create_preemption_threshold_test.c + ${TX_REGRESSION_DIR}/threadx_thread_delayed_suspension_test.c + ${TX_REGRESSION_DIR}/threadx_thread_information_test.c + ${TX_REGRESSION_DIR}/threadx_thread_multi_level_preemption_threshold_test.c + ${TX_REGRESSION_DIR}/threadx_thread_multiple_non_current_test.c + ${TX_REGRESSION_DIR}/threadx_thread_multiple_sleep_test.c + ${TX_REGRESSION_DIR}/threadx_thread_multiple_suspension_test.c + ${TX_REGRESSION_DIR}/threadx_thread_multiple_time_slice_test.c + ${TX_REGRESSION_DIR}/threadx_thread_preemptable_suspension_test.c + ${TX_REGRESSION_DIR}/threadx_thread_preemption_change_test.c + ${TX_REGRESSION_DIR}/threadx_thread_priority_change.c + ${TX_REGRESSION_DIR}/threadx_thread_relinquish_test.c + ${TX_REGRESSION_DIR}/threadx_thread_reset_test.c + ${TX_REGRESSION_DIR}/threadx_thread_simple_sleep_non_clear_test.c + ${TX_REGRESSION_DIR}/threadx_thread_simple_sleep_test.c + ${TX_REGRESSION_DIR}/threadx_thread_simple_suspend_test.c + ${TX_REGRESSION_DIR}/threadx_thread_sleep_for_100ticks_test.c + ${TX_REGRESSION_DIR}/threadx_thread_sleep_terminate_test.c + ${TX_REGRESSION_DIR}/threadx_thread_stack_checking_test.c + ${TX_REGRESSION_DIR}/threadx_thread_terminate_delete_test.c + ${TX_REGRESSION_DIR}/threadx_thread_time_slice_change_test.c + ${TX_REGRESSION_DIR}/threadx_thread_wait_abort_and_isr_test.c + ${TX_REGRESSION_DIR}/threadx_thread_wait_abort_test.c + ${TX_REGRESSION_DIR}/threadx_time_get_set_test.c + ${TX_REGRESSION_DIR}/threadx_timer_activate_deactivate_test.c + ${TX_REGRESSION_DIR}/threadx_timer_deactivate_accuracy_test.c + ${TX_REGRESSION_DIR}/threadx_timer_information_test.c + ${TX_REGRESSION_DIR}/threadx_timer_large_timer_accuracy_test.c + ${TX_REGRESSION_DIR}/threadx_timer_multiple_accuracy_test.c + ${TX_REGRESSION_DIR}/threadx_timer_multiple_test.c + ${TX_REGRESSION_DIR}/threadx_timer_simple_test.c + #${TX_REGRESSION_DIR}/threadx_trace_basic_test.c #windows specifics in the test ) -set(TX_REGRESSION_TARGETS) - add_library( - threadx_smp_regression_support STATIC - ${TX_REGRESSION_DIR}/testcontrol.c - ${TX_CMAKE_DIR}/samples/fake.c + threadx_smp_regression_support STATIC + ${TX_REGRESSION_DIR}/testcontrol.c + ${TX_CMAKE_DIR}/samples/fake.c ) target_link_libraries(threadx_smp_regression_support PUBLIC threadx_smp c) target_compile_definitions( - threadx_smp_regression_support - PUBLIC - TX_REGRESSION_TEST - TX_THREAD_SMP_ONLY_CORE_0_DEFAULT - TX_SMP_NOT_POSSIBLE - CTEST - BATCH_TEST - TEST_STACK_SIZE_PRINTF=4096 + threadx_smp_regression_support + PUBLIC + TX_REGRESSION_TEST + TX_THREAD_SMP_ONLY_CORE_0_DEFAULT + TX_SMP_NOT_POSSIBLE + CTEST + BATCH_TEST + TEST_STACK_SIZE_PRINTF=4096 ) function(add_threadx_regression_test TEST_SOURCE) - get_filename_component(TEST_NAME ${TEST_SOURCE} NAME_WE) - set(TARGET_NAME smp_${TEST_NAME}) - set(CTEST_NAME smp_${TEST_NAME}) + get_filename_component(TEST_NAME ${TEST_SOURCE} NAME_WE) - if(TEST_NAME STREQUAL "threadx_initialize_kernel_setup_test") - set(test_libraries threadx_smp) - else() - set(test_libraries threadx_smp_regression_support) - endif() + if(TEST_NAME STREQUAL "threadx_initialize_kernel_setup_test") + set(test_libraries threadx_smp) + else() + set(test_libraries threadx_smp_regression_support) + endif() - setup_target( - ${TARGET_NAME} - PLATFORM_TARGET moonlight_platform_common_smp - LIBRARIES ${test_libraries} - SOURCES ${TEST_SOURCE} - ) + setup_target( + ${TEST_NAME} + PLATFORM_TARGET moonlight_platform_common_smp + LIBRARIES ${test_libraries} + SOURCES ${TEST_SOURCE} + ) + list(APPEND TX_REGRESSION_TARGETS ${TEST_NAME}) + set(TX_REGRESSION_TARGETS ${TX_REGRESSION_TARGETS} PARENT_SCOPE) - list(APPEND TX_REGRESSION_TARGETS ${TARGET_NAME}) - set(TX_REGRESSION_TARGETS ${TX_REGRESSION_TARGETS} PARENT_SCOPE) - - add_test( - NAME ${CTEST_NAME} - COMMAND ${THREADX_TEST_SIMULATOR} - --isa=${THREADX_TEST_ISA} - -f $ - -m 60s - ) - set_tests_properties(${CTEST_NAME} PROPERTIES TIMEOUT 10) + add_test( + NAME ${TEST_NAME} + COMMAND ${THREADX_TEST_SIMULATOR} + --isa=${THREADX_TEST_ISA} + -f $ + -m 60s + -p tb.top.num_cores=4 + ) + set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT 10) endfunction() foreach(test_case ${TX_REGRESSION_CASES}) - add_threadx_regression_test(${test_case}) + add_threadx_regression_test(${test_case}) endforeach() add_custom_target( - threadx_smp_regression_build - DEPENDS ${TX_REGRESSION_TARGETS} + threadx_smp_regression_build + DEPENDS ${TX_REGRESSION_TARGETS} ) diff --git a/test/smp/CMakePresets.json b/test/smp/CMakePresets.json new file mode 100644 index 0000000..4ecfd90 --- /dev/null +++ b/test/smp/CMakePresets.json @@ -0,0 +1,72 @@ +{ + "version": 3, + "cmakeMinimumRequired": { + "major": 3, + "minor": 24, + "patch": 0 + }, + "configurePresets": [ + { + "name": "Debug", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/smp", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv64imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "Debug32", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/smp", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv32imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "Release", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/smp", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv64imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "RelWithDebInfo", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "Release32", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/smp", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv32imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "RelWithDebInfo", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "MinSizeRel", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/smp", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv64imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "MinSizeRel", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "MinSizeRel32", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/smp", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv32imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "MinSizeRel", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + } + ], + "buildPresets": [ + { "name": "Debug", "configurePreset": "Debug" }, + { "name": "Debug32", "configurePreset": "Debug32" }, + { "name": "Release", "configurePreset": "Release" }, + { "name": "Release32", "configurePreset": "Release32" }, + { "name": "MinSizeRel", "configurePreset": "MinSizeRel" }, + { "name": "MinSizeRel32", "configurePreset": "MinSizeRel32" } + ] +} diff --git a/test/threadx/CMakeLists.txt b/test/threadx/CMakeLists.txt index 2eb06c7..0404a00 100644 --- a/test/threadx/CMakeLists.txt +++ b/test/threadx/CMakeLists.txt @@ -1,3 +1,105 @@ +cmake_minimum_required(VERSION 3.21) + +set(BUILD_SHARED_LIBS OFF) +get_filename_component(THREADX4TGFS_ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + set(CMAKE_TOOLCHAIN_FILE + ${THREADX4TGFS_ROOT}/cmake/rv32imac_gnu.cmake + CACHE FILEPATH "Toolchain file") +endif() +include(${CMAKE_TOOLCHAIN_FILE}) + +project(threadx_regression LANGUAGES C ASM) +enable_testing() + +set(TARGET_MEM "ram_dram" CACHE STRING "memory map to use") +set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") + +set(THREADX_TEST_SIMULATOR + "" + CACHE FILEPATH "Path to the RISC-V VP executable used by CTest") +if(NOT THREADX_TEST_SIMULATOR) + message(FATAL_ERROR + "THREADX_TEST_SIMULATOR is not set. Configure with -DTHREADX_TEST_SIMULATOR=/path/to/riscv-vp") +endif() + +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "risc-v32") + set(THREADX_TEST_ISA "rv32imac_m") +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "risc-v64") + set(THREADX_TEST_ISA "rv64imac_m") +else() + message(FATAL_ERROR + "Unsupported CMAKE_SYSTEM_PROCESSOR for VP ISA selection: ${CMAKE_SYSTEM_PROCESSOR}") +endif() + +set(__THREAD_LOCAL_STORAGE OFF) +add_subdirectory(${THREADX4TGFS_ROOT}/third-party/picolibc ${CMAKE_BINARY_DIR}/picolibc) +target_link_libraries(c PUBLIC gcc) + +set(THREADX_CUSTOM_PORT ${THREADX4TGFS_ROOT}/port/threadx) +add_subdirectory(${THREADX4TGFS_ROOT}/third-party/threadx ${CMAKE_BINARY_DIR}/threadx) +target_link_libraries(threadx PUBLIC c) +target_compile_definitions(threadx PUBLIC TX_REGRESSION_TEST) + +set(MOONLIGHT_TRAP_SOURCE_INPUT ${THREADX4TGFS_ROOT}/port/moonlight/src/trap_non_vectored.c) +set(MOONLIGHT_TRAP_SOURCE ${CMAKE_BINARY_DIR}/generated/trap_non_vectored.c) +add_custom_command( + OUTPUT ${MOONLIGHT_TRAP_SOURCE} + COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/generate_trap_file.sh + ${MOONLIGHT_TRAP_SOURCE_INPUT} + ${MOONLIGHT_TRAP_SOURCE} + DEPENDS ${MOONLIGHT_TRAP_SOURCE_INPUT} + ${CMAKE_CURRENT_LIST_DIR}/generate_trap_file.sh + VERBATIM +) +add_custom_target(threadx_regression_generated_trap DEPENDS ${MOONLIGHT_TRAP_SOURCE}) +set_source_files_properties(${MOONLIGHT_TRAP_SOURCE} PROPERTIES GENERATED TRUE) + +add_subdirectory(${THREADX4TGFS_ROOT}/port/moonlight ${CMAKE_BINARY_DIR}/port/moonlight) +add_dependencies(moonlight_platform_common threadx_regression_generated_trap) + +function(setup_target TARGET) + set(options) + set(oneValueArgs PLATFORM_TARGET) + set(multiValueArgs LIBRARIES SOURCES) + cmake_parse_arguments(ST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + if(ST_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "setup_target(${TARGET} ...): unknown args: ${ST_UNPARSED_ARGUMENTS}") + endif() + + add_executable(${TARGET}) + set_target_properties(${TARGET} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + ) + if(ST_PLATFORM_TARGET) + target_add_moonlight_platform(${TARGET} PLATFORM_TARGET ${ST_PLATFORM_TARGET}) + else() + target_add_moonlight_platform(${TARGET}) + endif() + + if(ST_SOURCES) + target_sources(${TARGET} PRIVATE ${ST_SOURCES}) + endif() + + if(ST_LIBRARIES) + target_link_libraries(${TARGET} PRIVATE ${ST_LIBRARIES}) + endif() + + target_link_options(${TARGET} PRIVATE + -nostartfiles + -nostdlib + -T ${THREADX4TGFS_ROOT}/src/${TARGET_MEM}.lds + -Wl,--gc-sections + -Wl,-Map=${CMAKE_BINARY_DIR}/${TARGET}.map) + + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${OBJCOPY} -O ihex $ ${CMAKE_BINARY_DIR}/${TARGET}.hex + COMMAND ${OBJCOPY} -O binary $ ${CMAKE_BINARY_DIR}/${TARGET}.bin + COMMAND ${OBJDUMP} -S $ > ${CMAKE_BINARY_DIR}/${TARGET}.dis + ) +endfunction() + set(TX_REGRESSION_DIR ${THREADX4TGFS_ROOT}/third-party/threadx/test/tx/regression ) @@ -136,7 +238,6 @@ function(add_threadx_regression_test TEST_SOURCE) SOURCES ${TEST_SOURCE} ) - list(APPEND TX_REGRESSION_TARGETS ${TEST_NAME}) set(TX_REGRESSION_TARGETS ${TX_REGRESSION_TARGETS} PARENT_SCOPE) diff --git a/test/threadx/CMakePresets.json b/test/threadx/CMakePresets.json new file mode 100644 index 0000000..afbc481 --- /dev/null +++ b/test/threadx/CMakePresets.json @@ -0,0 +1,72 @@ +{ + "version": 3, + "cmakeMinimumRequired": { + "major": 3, + "minor": 24, + "patch": 0 + }, + "configurePresets": [ + { + "name": "Debug", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/threadx", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv64imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "Debug32", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/threadx", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv32imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "Release", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/threadx", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv64imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "RelWithDebInfo", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "Release32", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/threadx", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv32imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "RelWithDebInfo", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "MinSizeRel", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/threadx", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv64imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "MinSizeRel", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + }, + { + "name": "MinSizeRel32", + "binaryDir": "${sourceDir}/../../build/${presetName}/test/threadx", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../../cmake/rv32imac_gnu.cmake", + "CMAKE_BUILD_TYPE": "MinSizeRel", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + } + } + ], + "buildPresets": [ + { "name": "Debug", "configurePreset": "Debug" }, + { "name": "Debug32", "configurePreset": "Debug32" }, + { "name": "Release", "configurePreset": "Release" }, + { "name": "Release32", "configurePreset": "Release32" }, + { "name": "MinSizeRel", "configurePreset": "MinSizeRel" }, + { "name": "MinSizeRel32", "configurePreset": "MinSizeRel32" } + ] +} diff --git a/third-party/threadx b/third-party/threadx index 8cd9aed..cfbccc8 160000 --- a/third-party/threadx +++ b/third-party/threadx @@ -1 +1 @@ -Subproject commit 8cd9aedbbb014b1837d893681155487f440f9aea +Subproject commit cfbccc838ea15d4d359e48965a1bf8bc3f841d49