summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bsp/tms320f28379d/drivers/board.c3
-rw-r--r--bsp/tms320f28379d/rtconfig.h4
-rw-r--r--libcpu/c28x/context.s23
-rw-r--r--libcpu/c28x/cpuport.c10
-rw-r--r--src/thread.c6
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);