From ebe891dad66ac6a6c834aed3cbe84c0d6f020b7c Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Thu, 12 Mar 2026 16:15:57 +0100 Subject: [PATCH] adds smp tx_timer_interrupt --- port/threadx_smp/CMakeLists.txt | 1 + port/threadx_smp/src/tx_timer_interrupt.c | 129 ++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 port/threadx_smp/src/tx_timer_interrupt.c diff --git a/port/threadx_smp/CMakeLists.txt b/port/threadx_smp/CMakeLists.txt index a97bfc7..898381a 100644 --- a/port/threadx_smp/CMakeLists.txt +++ b/port/threadx_smp/CMakeLists.txt @@ -27,6 +27,7 @@ set(THREADX_SMP_CUSTOM_SRC src/tx_thread_smp_unprotect.S src/tx_thread_stack_build.S src/tx_thread_system_return.S + src/tx_timer_interrupt.c ) threadx_smp_add_offsets( diff --git a/port/threadx_smp/src/tx_timer_interrupt.c b/port/threadx_smp/src/tx_timer_interrupt.c new file mode 100644 index 0000000..bbb07ae --- /dev/null +++ b/port/threadx_smp/src/tx_timer_interrupt.c @@ -0,0 +1,129 @@ +/*************************************************************************** + * Copyright (c) 2024 Microsoft Corporation + * + * 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 + **************************************************************************/ + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Timer */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE +#define TX_THREAD_SMP_SOURCE_CODE + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_timer_interrupt RISC-V64/GNU */ +/* 6.2.1 */ +/* AUTHOR */ +/* */ +/* Scott Larson, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function processes the hardware timer interrupt. This */ +/* processing includes incrementing the system clock and checking for */ +/* time slice and/or timer expiration. If either is found, the */ +/* interrupt context save/restore functions are called along with the */ +/* expiration functions. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_timer_expiration_process Timer expiration processing */ +/* _tx_thread_time_slice Time slice interrupted thread */ +/* */ +/* CALLED BY */ +/* */ +/* interrupt vector */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 03-08-2023 Scott Larson Initial Version 6.2.1 */ +/* */ +/**************************************************************************/ +VOID _tx_timer_interrupt(VOID) +{ +UINT saved_posture; + + + /* Only core 0 advances the global timer wheel. */ + if (TX_SMP_CORE_ID != ((UINT) 0)) + { + return; + } + + /* Get the protection. */ + saved_posture = _tx_thread_smp_protect(); + + /* Indicate timer interrupt processing is active. */ + _tx_timer_interrupt_active++; + + /* Increment system clock. */ + _tx_timer_system_clock++; + + /* Test for timer expiration. */ + if (*_tx_timer_current_ptr) + { + + /* Set expiration flag. */ + _tx_timer_expired = TX_TRUE; + } + else + { + + /* No timer expired, increment the timer pointer. */ + _tx_timer_current_ptr++; + + /* Check for wrap-around. */ + if (_tx_timer_current_ptr == _tx_timer_list_end) + { + + /* Wrap to beginning of list. */ + _tx_timer_current_ptr = _tx_timer_list_start; + } + } + + /* Did a timer expire? */ + if (_tx_timer_expired) + { + /* Process timer expiration. */ + _tx_timer_expiration_process(); + } + + /* Process time-slice expiration for all cores. */ + _tx_thread_time_slice(); + + /* Timer interrupt processing is no longer active. */ + _tx_timer_interrupt_active--; + + /* Release the protection. */ + _tx_thread_smp_unprotect(saved_posture); +}