From 697a4495a6b40e01ea856cf1e3dc90bde2e368c7 Mon Sep 17 00:00:00 2001 From: xuzhuoyi Date: Mon, 3 Sep 2018 00:03:06 +0800 Subject: [PATCH] [bsp][tms320f28379d] Add support for upward-growing stack --- bsp/tms320f28379d/drivers/board.c | 3 +++ bsp/tms320f28379d/rtconfig.h | 4 +--- libcpu/c28x/context.s | 23 +++++------------------ libcpu/c28x/cpuport.c | 10 +++++----- src/thread.c | 6 ++++++ 5 files changed, 20 insertions(+), 26 deletions(-) diff --git a/bsp/tms320f28379d/drivers/board.c b/bsp/tms320f28379d/drivers/board.c index a019e24cd6..30a33f91eb 100644 --- a/bsp/tms320f28379d/drivers/board.c +++ b/bsp/tms320f28379d/drivers/board.c @@ -16,6 +16,8 @@ #include "board.h" #include "F28x_Project.h" +extern interrupt void RTOSINT_Handler(); + /** * This is the timer interrupt service routine. @@ -51,6 +53,7 @@ void rt_hw_board_init() EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.TIMER2_INT = &cpu_timer2_isr; + PieVectTable.RTOS_INT = &RTOSINT_Handler; EDIS; InitCpuTimers(); diff --git a/bsp/tms320f28379d/rtconfig.h b/bsp/tms320f28379d/rtconfig.h index 73de6650e4..5fafc1da5e 100644 --- a/bsp/tms320f28379d/rtconfig.h +++ b/bsp/tms320f28379d/rtconfig.h @@ -15,6 +15,7 @@ #define RT_USING_HOOK #define RT_IDEL_HOOK_LIST_SIZE 4 #define IDLE_THREAD_STACK_SIZE 1024 +#define RT_STACK_UPWARD_GROW #define RT_DEBUG /* Inter-Thread communication */ @@ -37,9 +38,6 @@ //#define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart2" -#define ARCH_ARM -#define ARCH_ARM_CORTEX_M -#define ARCH_ARM_CORTEX_M4 /* RT-Thread Components */ diff --git a/libcpu/c28x/context.s b/libcpu/c28x/context.s index f01e5ea246..9efec09fb2 100644 --- a/libcpu/c28x/context.s +++ b/libcpu/c28x/context.s @@ -86,6 +86,7 @@ _rt_hw_interrupt_enable: .asmfunc _rt_hw_context_switch_interrupt: _rt_hw_context_switch: + MOV AR0, AL ; set rt_thread_switch_interrupt_flag to 1 MOVL XAR2, #_rt_thread_switch_interrupt_flag MOVL XAR3, *XAR2 @@ -96,7 +97,7 @@ _rt_hw_context_switch: MOVL *XAR2, XAR3 MOVL XAR2, #_rt_interrupt_from_thread ; set rt_interrupt_from_thread - MOVL *XAR2, XAR0 + MOVL *XAR2, XAR0 _reswitch: MOVL XAR2, #_rt_interrupt_to_thread ; set rt_interrupt_to_thread @@ -162,21 +163,8 @@ switch_to_thread: ; LDMFD r1!, {r3} ; pop flag ;#endif - RT_CTX_RESTORE ; pop r4 - r11 register - - -;#if defined (__VFP_FP__) && !defined(__SOFTFP__) -; CMP r3, #0 ; if(flag_r3 != 0) -; VLDMIANE r1!, {d8 - d15} ; pop FPU register s16~s31 -;#endif - - MOV @SP, AR1 ; update stack pointer - -;#if defined (__VFP_FP__) && !defined(__SOFTFP__) -; ORR lr, lr, #0x10 ; lr |= (1 << 4), clean FPCA. -; CMP r3, #0 ; if(flag_r3 != 0) -; BICNE lr, lr, #0x10 ; lr &= ~(1 << 4), set FPCA. -;#endif + MOV @SP, AR1 + RT_CTX_RESTORE ; pop r4 - r11 register rtosint_exit: ; restore interrupt @@ -206,8 +194,7 @@ _rt_hw_get_st1: .asmfunc _rt_hw_context_switch_to: MOV AR1, #_rt_interrupt_to_thread - MOV AL, *AR1 - MOV AR0, AL + MOV *AR1, AL ;#if defined (__VFP_FP__) && !defined(__SOFTFP__) ; CLEAR CONTROL.FPCA diff --git a/libcpu/c28x/cpuport.c b/libcpu/c28x/cpuport.c index 0143656b6e..720bb01776 100644 --- a/libcpu/c28x/cpuport.c +++ b/libcpu/c28x/cpuport.c @@ -34,6 +34,7 @@ struct exception_stack_frame struct stack_frame { + struct exception_stack_frame exception_stack_frame; /* r4 ~ r11 register */ rt_uint16_t ar0h; @@ -48,7 +49,6 @@ struct stack_frame rt_uint32_t rpc; - struct exception_stack_frame exception_stack_frame; }; rt_uint8_t *rt_hw_stack_init(void *tentry, @@ -60,9 +60,9 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, rt_uint8_t *stk; unsigned long i; - stk = stack_addr + sizeof(rt_uint32_t); - stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8); - stk -= sizeof(struct stack_frame); + stk = stack_addr; + stk = (rt_uint8_t *)RT_ALIGN((rt_uint32_t)stk, 8); + //stk -= sizeof(struct stack_frame); stack_frame = (struct stack_frame *)stk; @@ -81,7 +81,7 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, stack_frame->exception_stack_frame.return_address = (unsigned long)tentry; /* return_address */ /* return task's current stack address */ - return stk; + return stk + sizeof(struct stack_frame); } /** diff --git a/src/thread.c b/src/thread.c index b3d91b30d0..49e004e5cc 100644 --- a/src/thread.c +++ b/src/thread.c @@ -150,9 +150,15 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread, /* init thread stack */ rt_memset(thread->stack_addr, '#', thread->stack_size); +#ifdef RT_STACK_UPWARD_GROW + thread->sp = (void *)rt_hw_stack_init(thread->entry, thread->parameter, + (void *)((char *)thread->stack_addr), + (void *)rt_thread_exit); +#else thread->sp = (void *)rt_hw_stack_init(thread->entry, thread->parameter, (void *)((char *)thread->stack_addr + thread->stack_size - 4), (void *)rt_thread_exit); +#endif /* priority init */ RT_ASSERT(priority < RT_THREAD_PRIORITY_MAX);