From 3e5a16c95bff3086cc28fecec292894a4f94a34d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Desbiens?= Date: Tue, 15 Sep 2026 16:24:50 -0400 Subject: [PATCH] Allowed tx_timer_change to be called from tx_application_define (#730) Fixes #224 `_txe_timer_change` returned `TX_CALLER_ERROR` for any call at or above `TX_INITIALIZE_IN_PROGRESS`, making `tx_timer_change` the only timer service that could not be called from `tx_application_define` -- while still being allowed from an ISR. The check has no technical basis: `_tx_timer_change` only writes the expiration fields of a timer that is not on an active list, with interrupts disabled. Removed it from both the `common` and `common_smp` copies of `txe_timer_change.c`, with the now-unused includes and the `TX_CALLER_ERROR` line in the header comment. Relaxing an error check is backward compatible. `testcontrol.c` in both suites now calls `tx_timer_change` at initialization, so the timer simple test covers it: `ERROR #30` on `dev`, green with the fix. 116/116 SMP, 103/103 non-SMP. Assisted-by: Copilot (Opus 5) --- common/src/txe_timer_change.c | 12 ++---------- common_smp/src/txe_timer_change.c | 12 ++---------- test/smp/regression/testcontrol.c | 7 +++++++ test/tx/regression/testcontrol.c | 7 +++++++ 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/common/src/txe_timer_change.c b/common/src/txe_timer_change.c index ef503ffa..91b104d0 100644 --- a/common/src/txe_timer_change.c +++ b/common/src/txe_timer_change.c @@ -9,6 +9,8 @@ * SPDX-License-Identifier: MIT **************************************************************************/ +// Some portions generated by Copilot (Opus 5). + /**************************************************************************/ /**************************************************************************/ @@ -26,8 +28,6 @@ /* Include necessary system files. */ #include "tx_api.h" -#include "tx_initialize.h" -#include "tx_thread.h" #include "tx_timer.h" @@ -56,7 +56,6 @@ /* */ /* TX_TIMER_ERROR Invalid application timer pointer */ /* TX_TICK_ERROR Invalid initial tick value of 0 */ -/* TX_CALLER_ERROR Invalid caller of this function */ /* status Actual completion status */ /* */ /* CALLS */ @@ -98,13 +97,6 @@ UINT status; status = TX_TICK_ERROR; } - /* Check for invalid caller of this function. */ - else if (TX_THREAD_GET_SYSTEM_STATE() >= TX_INITIALIZE_IN_PROGRESS) - { - - /* Invalid caller of this function, return appropriate error code. */ - status = TX_CALLER_ERROR; - } else { diff --git a/common_smp/src/txe_timer_change.c b/common_smp/src/txe_timer_change.c index ef503ffa..91b104d0 100644 --- a/common_smp/src/txe_timer_change.c +++ b/common_smp/src/txe_timer_change.c @@ -9,6 +9,8 @@ * SPDX-License-Identifier: MIT **************************************************************************/ +// Some portions generated by Copilot (Opus 5). + /**************************************************************************/ /**************************************************************************/ @@ -26,8 +28,6 @@ /* Include necessary system files. */ #include "tx_api.h" -#include "tx_initialize.h" -#include "tx_thread.h" #include "tx_timer.h" @@ -56,7 +56,6 @@ /* */ /* TX_TIMER_ERROR Invalid application timer pointer */ /* TX_TICK_ERROR Invalid initial tick value of 0 */ -/* TX_CALLER_ERROR Invalid caller of this function */ /* status Actual completion status */ /* */ /* CALLS */ @@ -98,13 +97,6 @@ UINT status; status = TX_TICK_ERROR; } - /* Check for invalid caller of this function. */ - else if (TX_THREAD_GET_SYSTEM_STATE() >= TX_INITIALIZE_IN_PROGRESS) - { - - /* Invalid caller of this function, return appropriate error code. */ - status = TX_CALLER_ERROR; - } else { diff --git a/test/smp/regression/testcontrol.c b/test/smp/regression/testcontrol.c index 59d8e69a..632ae921 100644 --- a/test/smp/regression/testcontrol.c +++ b/test/smp/regression/testcontrol.c @@ -11,6 +11,7 @@ /* This is the test control routine of the ThreadX kernel. All tests are dispatched from this routine. */ // Some portions generated by Codex (gpt 5.5). +// Some portions generated by Copilot (Opus 5). #define TX_THREAD_SMP_SOURCE_CODE @@ -65,6 +66,7 @@ TX_BLOCK_POOL init_block_pool; ULONG init_block_pool_area[50]; TX_EVENT_FLAGS_GROUP init_event_flags; TX_TIMER init_timer; +TX_TIMER init_timer_change; TX_THREAD init_test_thread; TX_THREAD second_test_thread; #ifndef TX_TIMER_PROCESS_IN_ISR @@ -692,6 +694,11 @@ TX_THREAD *thread_ptr; test_timer_create_init = tx_timer_create(&init_timer, "init timer", init_timer_entry, 0x5678, 100, 200, TX_AUTO_ACTIVATE); + /* Test timer change from initialization. */ + test_timer_create_init += tx_timer_create(&init_timer_change, "init timer change", init_timer_entry, 0x5678, + 100, 200, TX_NO_ACTIVATE); + test_timer_create_init += tx_timer_change(&init_timer_change, 50, 100); + /* Test calling tx_thread_relinquish to see if the error checking throws it out. */ tx_thread_relinquish(); #endif diff --git a/test/tx/regression/testcontrol.c b/test/tx/regression/testcontrol.c index 00e31d9b..6b60d79e 100644 --- a/test/tx/regression/testcontrol.c +++ b/test/tx/regression/testcontrol.c @@ -11,6 +11,7 @@ /* This is the test control routine of the ThreadX kernel. All tests are dispatched from this routine. */ // Some portions generated by Codex (gpt 5.4). +// Some portions generated by Copilot (Opus 5). #include "tx_api.h" #include @@ -69,6 +70,7 @@ TX_BLOCK_POOL init_block_pool; ULONG init_block_pool_area[50]; TX_EVENT_FLAGS_GROUP init_event_flags; TX_TIMER init_timer; +TX_TIMER init_timer_change; TX_THREAD init_test_thread; TX_THREAD second_test_thread; #ifndef TX_TIMER_PROCESS_IN_ISR @@ -567,6 +569,11 @@ TX_THREAD *thread_ptr; test_timer_create_init = tx_timer_create(&init_timer, "init timer", init_timer_entry, 0x5678, 100, 200, TX_AUTO_ACTIVATE); + /* Test timer change from initialization. */ + test_timer_create_init += tx_timer_create(&init_timer_change, "init timer change", init_timer_entry, 0x5678, + 100, 200, TX_NO_ACTIVATE); + test_timer_create_init += tx_timer_change(&init_timer_change, 50, 100); + /* Test calling tx_thread_relinquish to see if the error checking throws it out. */ tx_thread_relinquish(); #endif