mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-02-22 05:15:23 +08:00
[bsp][tms320f28379d] Add support for upward-growing stack
This commit is contained in:
parent
d85981a715
commit
697a4495a6
@ -16,6 +16,8 @@
|
|||||||
#include "board.h"
|
#include "board.h"
|
||||||
#include "F28x_Project.h"
|
#include "F28x_Project.h"
|
||||||
|
|
||||||
|
extern interrupt void RTOSINT_Handler();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the timer interrupt service routine.
|
* 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
|
EALLOW; // This is needed to write to EALLOW protected registers
|
||||||
PieVectTable.TIMER2_INT = &cpu_timer2_isr;
|
PieVectTable.TIMER2_INT = &cpu_timer2_isr;
|
||||||
|
PieVectTable.RTOS_INT = &RTOSINT_Handler;
|
||||||
EDIS;
|
EDIS;
|
||||||
|
|
||||||
InitCpuTimers();
|
InitCpuTimers();
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#define RT_USING_HOOK
|
#define RT_USING_HOOK
|
||||||
#define RT_IDEL_HOOK_LIST_SIZE 4
|
#define RT_IDEL_HOOK_LIST_SIZE 4
|
||||||
#define IDLE_THREAD_STACK_SIZE 1024
|
#define IDLE_THREAD_STACK_SIZE 1024
|
||||||
|
#define RT_STACK_UPWARD_GROW
|
||||||
#define RT_DEBUG
|
#define RT_DEBUG
|
||||||
|
|
||||||
/* Inter-Thread communication */
|
/* Inter-Thread communication */
|
||||||
@ -37,9 +38,6 @@
|
|||||||
//#define RT_USING_CONSOLE
|
//#define RT_USING_CONSOLE
|
||||||
#define RT_CONSOLEBUF_SIZE 128
|
#define RT_CONSOLEBUF_SIZE 128
|
||||||
#define RT_CONSOLE_DEVICE_NAME "uart2"
|
#define RT_CONSOLE_DEVICE_NAME "uart2"
|
||||||
#define ARCH_ARM
|
|
||||||
#define ARCH_ARM_CORTEX_M
|
|
||||||
#define ARCH_ARM_CORTEX_M4
|
|
||||||
|
|
||||||
/* RT-Thread Components */
|
/* RT-Thread Components */
|
||||||
|
|
||||||
|
@ -86,6 +86,7 @@ _rt_hw_interrupt_enable:
|
|||||||
.asmfunc
|
.asmfunc
|
||||||
_rt_hw_context_switch_interrupt:
|
_rt_hw_context_switch_interrupt:
|
||||||
_rt_hw_context_switch:
|
_rt_hw_context_switch:
|
||||||
|
MOV AR0, AL
|
||||||
; set rt_thread_switch_interrupt_flag to 1
|
; set rt_thread_switch_interrupt_flag to 1
|
||||||
MOVL XAR2, #_rt_thread_switch_interrupt_flag
|
MOVL XAR2, #_rt_thread_switch_interrupt_flag
|
||||||
MOVL XAR3, *XAR2
|
MOVL XAR3, *XAR2
|
||||||
@ -96,7 +97,7 @@ _rt_hw_context_switch:
|
|||||||
MOVL *XAR2, XAR3
|
MOVL *XAR2, XAR3
|
||||||
|
|
||||||
MOVL XAR2, #_rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
MOVL XAR2, #_rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||||
MOVL *XAR2, XAR0
|
MOVL *XAR2, XAR0
|
||||||
|
|
||||||
_reswitch:
|
_reswitch:
|
||||||
MOVL XAR2, #_rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
MOVL XAR2, #_rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||||
@ -162,21 +163,8 @@ switch_to_thread:
|
|||||||
; LDMFD r1!, {r3} ; pop flag
|
; LDMFD r1!, {r3} ; pop flag
|
||||||
;#endif
|
;#endif
|
||||||
|
|
||||||
RT_CTX_RESTORE ; pop r4 - r11 register
|
MOV @SP, AR1
|
||||||
|
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
|
|
||||||
|
|
||||||
rtosint_exit:
|
rtosint_exit:
|
||||||
; restore interrupt
|
; restore interrupt
|
||||||
@ -206,8 +194,7 @@ _rt_hw_get_st1:
|
|||||||
.asmfunc
|
.asmfunc
|
||||||
_rt_hw_context_switch_to:
|
_rt_hw_context_switch_to:
|
||||||
MOV AR1, #_rt_interrupt_to_thread
|
MOV AR1, #_rt_interrupt_to_thread
|
||||||
MOV AL, *AR1
|
MOV *AR1, AL
|
||||||
MOV AR0, AL
|
|
||||||
|
|
||||||
;#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
;#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||||
; CLEAR CONTROL.FPCA
|
; CLEAR CONTROL.FPCA
|
||||||
|
@ -34,6 +34,7 @@ struct exception_stack_frame
|
|||||||
|
|
||||||
struct stack_frame
|
struct stack_frame
|
||||||
{
|
{
|
||||||
|
struct exception_stack_frame exception_stack_frame;
|
||||||
|
|
||||||
/* r4 ~ r11 register */
|
/* r4 ~ r11 register */
|
||||||
rt_uint16_t ar0h;
|
rt_uint16_t ar0h;
|
||||||
@ -48,7 +49,6 @@ struct stack_frame
|
|||||||
rt_uint32_t rpc;
|
rt_uint32_t rpc;
|
||||||
|
|
||||||
|
|
||||||
struct exception_stack_frame exception_stack_frame;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
rt_uint8_t *rt_hw_stack_init(void *tentry,
|
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;
|
rt_uint8_t *stk;
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
|
|
||||||
stk = stack_addr + sizeof(rt_uint32_t);
|
stk = stack_addr;
|
||||||
stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);
|
stk = (rt_uint8_t *)RT_ALIGN((rt_uint32_t)stk, 8);
|
||||||
stk -= sizeof(struct stack_frame);
|
//stk -= sizeof(struct stack_frame);
|
||||||
|
|
||||||
stack_frame = (struct stack_frame *)stk;
|
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 */
|
stack_frame->exception_stack_frame.return_address = (unsigned long)tentry; /* return_address */
|
||||||
|
|
||||||
/* return task's current stack address */
|
/* return task's current stack address */
|
||||||
return stk;
|
return stk + sizeof(struct stack_frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -150,9 +150,15 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread,
|
|||||||
|
|
||||||
/* init thread stack */
|
/* init thread stack */
|
||||||
rt_memset(thread->stack_addr, '#', thread->stack_size);
|
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,
|
thread->sp = (void *)rt_hw_stack_init(thread->entry, thread->parameter,
|
||||||
(void *)((char *)thread->stack_addr + thread->stack_size - 4),
|
(void *)((char *)thread->stack_addr + thread->stack_size - 4),
|
||||||
(void *)rt_thread_exit);
|
(void *)rt_thread_exit);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* priority init */
|
/* priority init */
|
||||||
RT_ASSERT(priority < RT_THREAD_PRIORITY_MAX);
|
RT_ASSERT(priority < RT_THREAD_PRIORITY_MAX);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user