adds smp tx_timer_interrupt
This commit is contained in:
@@ -27,6 +27,7 @@ set(THREADX_SMP_CUSTOM_SRC
|
|||||||
src/tx_thread_smp_unprotect.S
|
src/tx_thread_smp_unprotect.S
|
||||||
src/tx_thread_stack_build.S
|
src/tx_thread_stack_build.S
|
||||||
src/tx_thread_system_return.S
|
src/tx_thread_system_return.S
|
||||||
|
src/tx_timer_interrupt.c
|
||||||
)
|
)
|
||||||
|
|
||||||
threadx_smp_add_offsets(
|
threadx_smp_add_offsets(
|
||||||
|
|||||||
129
port/threadx_smp/src/tx_timer_interrupt.c
Normal file
129
port/threadx_smp/src/tx_timer_interrupt.c
Normal file
@@ -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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user