summaryrefslogtreecommitdiff
path: root/test/smp/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'test/smp/cmake')
-rw-r--r--test/smp/cmake/CMakeLists.txt100
-rwxr-xr-xtest/smp/cmake/coverage.sh11
-rw-r--r--test/smp/cmake/regression/CMakeLists.txt50
-rw-r--r--test/smp/cmake/regression/generate_test_file.cmake44
-rwxr-xr-xtest/smp/cmake/regression/generate_test_file.sh11
-rw-r--r--test/smp/cmake/samples/fake.c11
-rw-r--r--test/smp/cmake/threadx_smp/CMakeLists.txt19
-rw-r--r--test/smp/cmake/threadx_smp/ports_smp/win64/vs_2022/CMakeLists.txt29
8 files changed, 217 insertions, 58 deletions
diff --git a/test/smp/cmake/CMakeLists.txt b/test/smp/cmake/CMakeLists.txt
index f57d253c..e2ca8627 100644
--- a/test/smp/cmake/CMakeLists.txt
+++ b/test/smp/cmake/CMakeLists.txt
@@ -2,11 +2,19 @@ cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
cmake_policy(SET CMP0054 NEW)
cmake_policy(SET CMP0057 NEW)
+if((DEFINED THREADX_ARCH) AND (THREADX_ARCH STREQUAL "win64"))
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+endif()
+
project(threadx_smp_test LANGUAGES C)
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_C_EXTENSIONS OFF)
+
# Set build configurations
-set(BUILD_CONFIGURATIONS default_build_coverage
- disable_notify_callbacks_build stack_checking_build stack_checking_rand_fill_build
+set(BUILD_CONFIGURATIONS default_build_coverage disable_notify_callbacks_build
+ stack_checking_build stack_checking_rand_fill_build
trace_build)
set(CMAKE_CONFIGURATION_TYPES
${BUILD_CONFIGURATIONS}
@@ -23,26 +31,31 @@ endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}.")
-set(default_build_coverage -DTX_QUEUE_MESSAGE_MAX_SIZE=32)
-set(disable_notify_callbacks_build -DTX_QUEUE_MESSAGE_MAX_SIZE=32 -DTX_DISABLE_NOTIFY_CALLBACKS)
-set(stack_checking_build -DTX_QUEUE_MESSAGE_MAX_SIZE=32 -DTX_ENABLE_STACK_CHECKING)
-set(stack_checking_rand_fill_build -DTX_QUEUE_MESSAGE_MAX_SIZE=32 -DTX_ENABLE_STACK_CHECKING -DTX_ENABLE_RANDOM_NUMBER_STACK_FILLING)
-set(trace_build -DTX_QUEUE_MESSAGE_MAX_SIZE=32 -DTX_ENABLE_EVENT_TRACE)
+set(default_build_coverage TX_QUEUE_MESSAGE_MAX_SIZE=32)
+set(disable_notify_callbacks_build TX_QUEUE_MESSAGE_MAX_SIZE=32 TX_DISABLE_NOTIFY_CALLBACKS)
+set(stack_checking_build TX_QUEUE_MESSAGE_MAX_SIZE=32 TX_ENABLE_STACK_CHECKING)
+set(stack_checking_rand_fill_build TX_QUEUE_MESSAGE_MAX_SIZE=32 TX_ENABLE_STACK_CHECKING TX_ENABLE_RANDOM_NUMBER_STACK_FILLING)
+set(trace_build TX_QUEUE_MESSAGE_MAX_SIZE=32 TX_ENABLE_EVENT_TRACE)
-add_compile_options(
- -m32
- -std=c99
- -ggdb
- -g3
- -gdwarf-2
- -fdiagnostics-color
- # -Werror
- -DTX_THREAD_SMP_ONLY_CORE_0_DEFAULT
- -DTX_SMP_NOT_POSSIBLE
- -DTX_REGRESSION_TEST
- -DTEST_STACK_SIZE_PRINTF=4096
+add_compile_definitions(
+ TX_THREAD_SMP_ONLY_CORE_0_DEFAULT
+ TX_SMP_NOT_POSSIBLE
+ TX_REGRESSION_TEST
+ TEST_STACK_SIZE_PRINTF=4096
${${CMAKE_BUILD_TYPE}})
-add_link_options(-m32)
+
+if(MSVC)
+ add_compile_options(/W3 /Zi)
+ add_link_options(/DEBUG /INCREMENTAL:NO)
+else()
+ add_compile_options(
+ -m32
+ -ggdb
+ -g3
+ -gdwarf-2
+ -fdiagnostics-color)
+ add_link_options(-m32)
+endif()
enable_testing()
@@ -52,26 +65,31 @@ add_subdirectory(samples)
# Coverage
if(CMAKE_BUILD_TYPE MATCHES ".*_coverage")
- target_compile_options(threadx_smp PRIVATE -fprofile-arcs -ftest-coverage)
- target_link_options(threadx_smp PRIVATE -fprofile-arcs -ftest-coverage)
+ if(NOT MSVC)
+ target_compile_options(threadx_smp PRIVATE -fprofile-arcs -ftest-coverage)
+ target_link_options(threadx_smp PRIVATE -fprofile-arcs -ftest-coverage)
+ endif()
endif()
-target_compile_options(
- threadx_smp
- PRIVATE # -Werror
- -Wall
- -Wextra
- -pedantic
- -fmessage-length=0
- -fsigned-char
- -ffunction-sections
- -fdata-sections
- -Wunused
- -Wuninitialized
- -Wmissing-declarations
- -Wconversion
- -Wpointer-arith
- # -Wshadow
- -Wlogical-op
- -Waggregate-return
- -Wfloat-equal)
+if(MSVC)
+ target_compile_options(threadx_smp PRIVATE /W3)
+else()
+ target_compile_options(
+ threadx_smp
+ PRIVATE
+ -Wall
+ -Wextra
+ -pedantic
+ -fmessage-length=0
+ -fsigned-char
+ -ffunction-sections
+ -fdata-sections
+ -Wunused
+ -Wuninitialized
+ -Wmissing-declarations
+ -Wconversion
+ -Wpointer-arith
+ -Wlogical-op
+ -Waggregate-return
+ -Wfloat-equal)
+endif()
diff --git a/test/smp/cmake/coverage.sh b/test/smp/cmake/coverage.sh
index 51b2e8ca..d35284f5 100755
--- a/test/smp/cmake/coverage.sh
+++ b/test/smp/cmake/coverage.sh
@@ -1,4 +1,15 @@
#!/bin/bash
+##############################################################################
+# Copyright (c) 2024 Microsoft Corporation
+# Copyright (c) 2026 Eclipse ThreadX contributors
+#
+# This program and the accompanying materials are made available under the
+# terms of the MIT License which is available at
+# https://opensource.org/licenses/MIT.
+#
+# SPDX-License-Identifier: MIT
+##############################################################################
+
set -e
diff --git a/test/smp/cmake/regression/CMakeLists.txt b/test/smp/cmake/regression/CMakeLists.txt
index c2362620..b448ae3e 100644
--- a/test/smp/cmake/regression/CMakeLists.txt
+++ b/test/smp/cmake/regression/CMakeLists.txt
@@ -4,6 +4,16 @@ cmake_policy(SET CMP0057 NEW)
project(regression_test LANGUAGES C)
set(SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/../../regression)
+set(REPO_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../..)
+set(PORT_LOW_LEVEL_SOURCE ${REPO_ROOT}/ports_smp/${THREADX_ARCH}/${THREADX_TOOLCHAIN}/src/tx_initialize_low_level.c)
+set(GENERATED_LOW_LEVEL_SOURCE ${CMAKE_CURRENT_BINARY_DIR}/tx_initialize_low_level.c)
+set(TESTCONTROL_WEAK_DEFAULTS_SOURCE ${REPO_ROOT}/test/shared/regression/testcontrol_weak_defaults.c)
+
+include_directories(${REPO_ROOT}/test/tx/regression)
+
+if(NOT EXISTS ${PORT_LOW_LEVEL_SOURCE})
+ message(FATAL_ERROR "Unable to locate tx_initialize_low_level.c for ${THREADX_ARCH}/${THREADX_TOOLCHAIN}")
+endif()
set(regression_test_cases
${SOURCE_DIR}/threadx_block_memory_basic_test.c
@@ -75,8 +85,8 @@ set(regression_test_cases
${SOURCE_DIR}/threadx_smp_random_resume_suspend_test.c
${SOURCE_DIR}/threadx_smp_rebalance_exclusion_test.c
${SOURCE_DIR}/threadx_smp_relinquish_test.c
- ${SOURCE_DIR}/threadx_smp_resume_suspend_accending_order_test.c
- ${SOURCE_DIR}/threadx_smp_resume_suspend_decending_order_test.c
+ ${SOURCE_DIR}/threadx_smp_resume_suspend_ascending_order_test.c
+ ${SOURCE_DIR}/threadx_smp_resume_suspend_descending_order_test.c
${SOURCE_DIR}/threadx_smp_time_slice_test.c
${SOURCE_DIR}/threadx_smp_two_threads_one_core_test.c
${SOURCE_DIR}/threadx_thread_basic_execution_test.c
@@ -117,18 +127,38 @@ set(regression_test_cases
${SOURCE_DIR}/threadx_initialize_kernel_setup_test.c)
add_custom_command(
- OUTPUT ${SOURCE_DIR}/tx_initialize_low_level.c
- COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/generate_test_file.sh
+ OUTPUT ${GENERATED_LOW_LEVEL_SOURCE}
+ COMMAND ${CMAKE_COMMAND}
+ -DSOURCE_FILE=${PORT_LOW_LEVEL_SOURCE}
+ -DOUTPUT_FILE=${GENERATED_LOW_LEVEL_SOURCE}
+ -P ${CMAKE_CURRENT_LIST_DIR}/generate_test_file.cmake
+ DEPENDS ${PORT_LOW_LEVEL_SOURCE} ${CMAKE_CURRENT_LIST_DIR}/generate_test_file.cmake
COMMENT "Generating tx_initialize_low_level.c for test")
-add_library(test_utility ${SOURCE_DIR}/tx_initialize_low_level.c
- ${SOURCE_DIR}/testcontrol.c)
-target_link_libraries(test_utility PUBLIC azrtos::threadx_smp)
-target_compile_definitions(test_utility PUBLIC CTEST BATCH_TEST)
+add_library(test_weak_defaults OBJECT ${TESTCONTROL_WEAK_DEFAULTS_SOURCE})
+target_link_libraries(test_weak_defaults PRIVATE azrtos::threadx_smp)
+target_compile_definitions(test_weak_defaults PRIVATE CTEST BATCH_TEST
+ TEST_STACK_SIZE_PRINTF=4096)
+
+add_library(test_utility OBJECT ${GENERATED_LOW_LEVEL_SOURCE}
+ ${SOURCE_DIR}/testcontrol.c)
+target_link_libraries(test_utility PRIVATE azrtos::threadx_smp)
+target_compile_definitions(test_utility PRIVATE CTEST BATCH_TEST
+ TEST_STACK_SIZE_PRINTF=4096)
foreach(test_case ${regression_test_cases})
get_filename_component(test_name ${test_case} NAME_WE)
- add_executable(${test_name} ${test_case})
- target_link_libraries(${test_name} PRIVATE test_utility)
+
+ if(test_name STREQUAL "threadx_initialize_kernel_setup_test")
+ add_executable(${test_name} ${test_case} $<TARGET_OBJECTS:test_weak_defaults>)
+ else()
+ add_executable(${test_name} ${test_case}
+ $<TARGET_OBJECTS:test_utility>
+ $<TARGET_OBJECTS:test_weak_defaults>)
+ target_compile_definitions(${test_name} PRIVATE CTEST BATCH_TEST
+ TEST_STACK_SIZE_PRINTF=4096)
+ endif()
+
+ target_link_libraries(${test_name} PRIVATE azrtos::threadx_smp)
add_test(${CMAKE_BUILD_TYPE}::${test_name} ${test_name})
endforeach()
diff --git a/test/smp/cmake/regression/generate_test_file.cmake b/test/smp/cmake/regression/generate_test_file.cmake
new file mode 100644
index 00000000..77cccaa5
--- /dev/null
+++ b/test/smp/cmake/regression/generate_test_file.cmake
@@ -0,0 +1,44 @@
+if(NOT DEFINED SOURCE_FILE)
+ message(FATAL_ERROR "SOURCE_FILE is required")
+endif()
+
+if(NOT DEFINED OUTPUT_FILE)
+ message(FATAL_ERROR "OUTPUT_FILE is required")
+endif()
+
+file(STRINGS "${SOURCE_FILE}" FILE_LINES)
+
+set(UPDATED_FILE_CONTENTS "")
+set(DISPATCH_DECLARATION "VOID test_interrupt_dispatch(VOID);")
+set(DISPATCH_CALL "test_interrupt_dispatch();")
+set(DECLARATION_INSERTED FALSE)
+set(CALL_INSERTED FALSE)
+
+foreach(FILE_LINE IN LISTS FILE_LINES)
+ if((NOT DECLARATION_INSERTED) AND
+ ((FILE_LINE MATCHES "^void[ \t]+\\*_tx_linux_timer_interrupt\\(void \\*p\\);[ \t]*$")
+ OR
+ (FILE_LINE MATCHES "^VOID[ \t]+_tx_win32_timer_interrupt\\(VOID\\);[ \t]*$")
+ OR
+ (FILE_LINE MATCHES "^VOID CALLBACK[ \t]+_tx_win32_timer_interrupt\\(UINT wTimerID, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2\\);[ \t]*$")))
+ string(APPEND UPDATED_FILE_CONTENTS "${FILE_LINE}\n${DISPATCH_DECLARATION}\n")
+ set(DECLARATION_INSERTED TRUE)
+ elseif((NOT CALL_INSERTED) AND (FILE_LINE MATCHES "^([ \t]*)_tx_timer_interrupt\\(\\);[ \t]*$"))
+ string(APPEND UPDATED_FILE_CONTENTS "${CMAKE_MATCH_1}${DISPATCH_CALL}\n${FILE_LINE}\n")
+ set(CALL_INSERTED TRUE)
+ else()
+ string(APPEND UPDATED_FILE_CONTENTS "${FILE_LINE}\n")
+ endif()
+endforeach()
+
+if(NOT CALL_INSERTED)
+ message(FATAL_ERROR "Unable to insert test interrupt dispatcher call into ${SOURCE_FILE}")
+endif()
+
+if(NOT DECLARATION_INSERTED)
+ message(FATAL_ERROR "Unable to insert test interrupt dispatcher declaration into ${SOURCE_FILE}")
+endif()
+
+get_filename_component(OUTPUT_DIRECTORY "${OUTPUT_FILE}" DIRECTORY)
+file(MAKE_DIRECTORY "${OUTPUT_DIRECTORY}")
+file(WRITE "${OUTPUT_FILE}" "${UPDATED_FILE_CONTENTS}")
diff --git a/test/smp/cmake/regression/generate_test_file.sh b/test/smp/cmake/regression/generate_test_file.sh
index 0172469a..495e363e 100755
--- a/test/smp/cmake/regression/generate_test_file.sh
+++ b/test/smp/cmake/regression/generate_test_file.sh
@@ -1,4 +1,15 @@
#!/bin/bash
+##############################################################################
+# Copyright (c) 2024 Microsoft Corporation
+# Copyright (c) 2026 Eclipse ThreadX contributors
+#
+# This program and the accompanying materials are made available under the
+# terms of the MIT License which is available at
+# https://opensource.org/licenses/MIT.
+#
+# SPDX-License-Identifier: MIT
+##############################################################################
+
dst=$(dirname $0)/../../regression/tx_initialize_low_level.c
src=$(dirname $0)/../../../../ports_smp/linux/gnu/src/tx_initialize_low_level.c
diff --git a/test/smp/cmake/samples/fake.c b/test/smp/cmake/samples/fake.c
index 8159fef4..f379e798 100644
--- a/test/smp/cmake/samples/fake.c
+++ b/test/smp/cmake/samples/fake.c
@@ -1,3 +1,14 @@
+/***************************************************************************/
+/* Copyright (c) 2024 Microsoft Corporation */
+/* Copyright (c) 2026 Eclipse ThreadX contributors */
+/* */
+/* This program and the accompanying materials are made available under */
+/* the terms of the MIT License which is available at */
+/* https://opensource.org/licenses/MIT. */
+/* */
+/* SPDX-License-Identifier: MIT */
+/***************************************************************************/
+
#include "tx_api.h"
typedef unsigned int TEST_FLAG;
diff --git a/test/smp/cmake/threadx_smp/CMakeLists.txt b/test/smp/cmake/threadx_smp/CMakeLists.txt
index f6596253..568fece4 100644
--- a/test/smp/cmake/threadx_smp/CMakeLists.txt
+++ b/test/smp/cmake/threadx_smp/CMakeLists.txt
@@ -1,11 +1,5 @@
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
-# Set up the project
-project(threadx_smp
- VERSION 6.0.0
- LANGUAGES C ASM
-)
-
if(NOT DEFINED THREADX_ARCH)
message(FATAL_ERROR "Error: THREADX_ARCH not defined")
endif()
@@ -13,6 +7,17 @@ if(NOT DEFINED THREADX_TOOLCHAIN)
message(FATAL_ERROR "Error: THREADX_TOOLCHAIN not defined")
endif()
+set(THREADX_SMP_PROJECT_LANGUAGES C)
+if(NOT ((THREADX_ARCH STREQUAL "win64") AND (THREADX_TOOLCHAIN STREQUAL "vs_2022")))
+ list(APPEND THREADX_SMP_PROJECT_LANGUAGES ASM)
+endif()
+
+# Set up the project
+project(threadx_smp
+ VERSION 6.0.0
+ LANGUAGES ${THREADX_SMP_PROJECT_LANGUAGES}
+)
+
set(PROJECT_DIR ${CMAKE_CURRENT_LIST_DIR}/../../../..)
# Define our target library and an alias for consumers
@@ -57,4 +62,4 @@ set(CPACK_SOURCE_IGNORE_FILES
".*~$"
)
set(CPACK_VERBATIM_VARIABLES YES)
-include(CPack) \ No newline at end of file
+include(CPack)
diff --git a/test/smp/cmake/threadx_smp/ports_smp/win64/vs_2022/CMakeLists.txt b/test/smp/cmake/threadx_smp/ports_smp/win64/vs_2022/CMakeLists.txt
new file mode 100644
index 00000000..6b219bb2
--- /dev/null
+++ b/test/smp/cmake/threadx_smp/ports_smp/win64/vs_2022/CMakeLists.txt
@@ -0,0 +1,29 @@
+set(CURRENT_DIR ${PROJECT_DIR}/ports_smp/win64/vs_2022)
+target_sources(${PROJECT_NAME}
+ PRIVATE
+ # {{BEGIN_TARGET_SOURCES}}
+ ${CURRENT_DIR}/src/tx_initialize_low_level.c
+ ${CURRENT_DIR}/src/tx_thread_context_restore.c
+ ${CURRENT_DIR}/src/tx_thread_context_save.c
+ ${CURRENT_DIR}/src/tx_thread_interrupt_control.c
+ ${CURRENT_DIR}/src/tx_thread_schedule.c
+ ${CURRENT_DIR}/src/tx_thread_smp_core_get.c
+ ${CURRENT_DIR}/src/tx_thread_smp_core_preempt.c
+ ${CURRENT_DIR}/src/tx_thread_smp_current_state_get.c
+ ${CURRENT_DIR}/src/tx_thread_smp_current_thread_get.c
+ ${CURRENT_DIR}/src/tx_thread_smp_initialize_wait.c
+ ${CURRENT_DIR}/src/tx_thread_smp_low_level_initialize.c
+ ${CURRENT_DIR}/src/tx_thread_smp_protect.c
+ ${CURRENT_DIR}/src/tx_thread_smp_time_get.c
+ ${CURRENT_DIR}/src/tx_thread_smp_unprotect.c
+ ${CURRENT_DIR}/src/tx_thread_stack_build.c
+ ${CURRENT_DIR}/src/tx_thread_system_return.c
+ ${CURRENT_DIR}/src/tx_timer_interrupt.c
+
+ # {{END_TARGET_SOURCES}}
+)
+
+target_include_directories(${PROJECT_NAME}
+ PUBLIC
+ ${CURRENT_DIR}/inc
+)