1919/**************************************************************************/
2020/**************************************************************************/
2121
22- .section .data
23- .global __tx_free_memory_start
22+ /* Include necessary system files. */
23+
24+ /* #include "tx_api.h"
25+ #include "tx_initialize.h"
26+ #include "tx_thread.h"
27+ #include "tx_timer.h" */
28+
29+ .extern _tx_thread_system_stack_ptr
30+ .extern _tx_initialize_unused_memory
31+ .extern _tx_thread_context_save
32+ .extern _tx_thread_context_restore
33+ .extern _tx_timer_interrupt
34+
35+ .section .bss
36+ .balign 4
37+ .globl __tx_free_memory_start
2438__tx_free_memory_start:
25-
39+ .space 4
2640
2741 .section .text
42+ .balign 4
2843/**************************************************************************/
2944/* */
3045/* FUNCTION RELEASE */
@@ -34,6 +49,7 @@ __tx_free_memory_start:
3449/* AUTHOR */
3550/* */
3651/* Akif Ejaz, 10xEngineers */
52+ /* Wei-Chen Lai, National Cheng Kung University */
3753/* */
3854/* DESCRIPTION */
3955/* */
@@ -60,32 +76,42 @@ __tx_free_memory_start:
6076/* _tx_initialize_kernel_enter ThreadX entry function */
6177/* */
6278/**************************************************************************/
79+
6380/* VOID _tx_initialize_low_level(VOID)
6481{ */
65- .global _tx_initialize_low_level
66- .weak _tx_initialize_low_level
82+ .globl _tx_initialize_low_level
6783_tx_initialize_low_level:
68-
69- /* Save the system stack pointer. */
70- /* _tx_thread_system_stack_ptr = sp; */
71-
72- la t0, _tx_thread_system_stack_ptr // Pickup address of system stack ptr
84+ la t0, _tx_thread_system_stack_ptr
7385 sw sp, 0 (t0) // Save system stack pointer
7486
75- /* Pickup first free address. */
76- /* _tx_initialize_unused_memory(__tx_free_memory_start); */
77-
7887 la t0, __tx_free_memory_start // Pickup first free address
79- la t1, _tx_initialize_unused_memory // Pickup address of unused memory
88+ la t1, _tx_initialize_unused_memory
8089 sw t0, 0 (t1) // Save unused memory address
8190
82- /* Initialize floating point control/status register if floating point is enabled. */
83- #ifdef __riscv_flen
84- li t0, 0
85- csrw fcsr, t0 // Clear FP control/status register
91+ ret
92+
93+
94+ /* Define the actual timer interrupt/exception handler. */
95+ .globl _tx_timer_interrupt_handler
96+ .globl __minterrupt_000007
97+ _tx_timer_interrupt_handler:
98+ __minterrupt_000007:
99+
100+ /* Before calling _tx_thread_context_save, we have to allocate an interrupt
101+ stack frame and save the current value of x1 (ra). */
102+ #if defined(__riscv_32e) || defined(__riscv_32rve)
103+ addi sp, sp, -260 // Allocate space for all registers - with floating point enabled
104+ #else
105+ addi sp, sp, -128 // Allocate space for all registers - without floating point enabled
86106#endif
107+ sw x1, 0x70 (sp) // Store RA
108+ call _tx_thread_context_save // Call ThreadX context save
87109
88- ret
110+ /* Call the ThreadX timer routine. */
111+ call _tx_timer_interrupt // Call timer interrupt handler
112+
113+ /* Timer interrupt processing is done, jump to ThreadX context restore. */
114+ tail _tx_thread_context_restore // Jump to ThreadX context restore function. Note: this does not return!
89115
90116/* Timer Interrupt Handler Note:
91117 Platform-specific implementations must provide their own timer ISR.
@@ -109,4 +135,4 @@ _tx_initialize_low_level:
109135
110136 The port assumes Machine mode (M-mode) execution.
111137 For Supervisor mode (S-mode), use sstatus and SIE/SPIE instead of mstatus.
112- See the RISC-V Privileged Specification for more details. */
138+ See the RISC-V Privileged Specification for more details. */
0 commit comments