Browse Source

[bsp][tms320f28379d] Add support for upward-growing stack

xuzhuoyi 6 years ago
parent
commit
697a4495a6
5 changed files with 20 additions and 26 deletions
  1. 3 0
      bsp/tms320f28379d/drivers/board.c
  2. 1 3
      bsp/tms320f28379d/rtconfig.h
  3. 5 18
      libcpu/c28x/context.s
  4. 5 5
      libcpu/c28x/cpuport.c
  5. 6 0
      src/thread.c

+ 3 - 0
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();

+ 1 - 3
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 */
 

+ 5 - 18
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 

+ 5 - 5
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);
 }
 
 /**

+ 6 - 0
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);