From 697a4495a6b40e01ea856cf1e3dc90bde2e368c7 Mon Sep 17 00:00:00 2001 From: xuzhuoyi Date: Mon, 3 Sep 2018 00:03:06 +0800 Subject: [bsp][tms320f28379d] Add support for upward-growing stack --- libcpu/c28x/context.s | 23 +++++------------------ libcpu/c28x/cpuport.c | 10 +++++----- 2 files changed, 10 insertions(+), 23 deletions(-) (limited to 'libcpu') 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); } /** -- cgit v1.3.1