Merge pull request #3240 from xlf605401969/c28x_fpu
[libcpu][c28x]add support for c28x mcu hardware fpu
This commit is contained in:
commit
fa38e8d11e
|
@ -8,6 +8,7 @@
|
||||||
; 2018-09-01 xuzhuoyi the first version.
|
; 2018-09-01 xuzhuoyi the first version.
|
||||||
; 2019-06-17 zhaoxiaowei fix bugs of old c28x interrupt api.
|
; 2019-06-17 zhaoxiaowei fix bugs of old c28x interrupt api.
|
||||||
; 2019-07-03 zhaoxiaowei add _rt_hw_calc_csb function to support __rt_ffs.
|
; 2019-07-03 zhaoxiaowei add _rt_hw_calc_csb function to support __rt_ffs.
|
||||||
|
; 2019-12-05 xiaolifan add support for hardware fpu32
|
||||||
;
|
;
|
||||||
|
|
||||||
.ref _rt_interrupt_to_thread
|
.ref _rt_interrupt_to_thread
|
||||||
|
@ -24,6 +25,16 @@
|
||||||
.def _rt_hw_interrupt_thread_switch
|
.def _rt_hw_interrupt_thread_switch
|
||||||
.def _rt_hw_interrupt_disable
|
.def _rt_hw_interrupt_disable
|
||||||
.def _rt_hw_interrupt_enable
|
.def _rt_hw_interrupt_enable
|
||||||
|
|
||||||
|
;workaround for importing fpu settings from the compiler
|
||||||
|
.cdecls C,NOLIST
|
||||||
|
%{
|
||||||
|
#ifdef __TMS320C28XX_FPU32__
|
||||||
|
#define __FPU32__ 1
|
||||||
|
#else
|
||||||
|
#define __FPU32__ 0
|
||||||
|
#endif
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
||||||
RT_CTX_SAVE .macro
|
RT_CTX_SAVE .macro
|
||||||
|
@ -38,12 +49,37 @@ RT_CTX_SAVE .macro
|
||||||
PUSH XAR7
|
PUSH XAR7
|
||||||
PUSH XT
|
PUSH XT
|
||||||
PUSH RPC
|
PUSH RPC
|
||||||
|
|
||||||
|
.if __FPU32__
|
||||||
|
PUSH RB
|
||||||
|
MOV32 *SP++, STF
|
||||||
|
MOV32 *SP++, R0H
|
||||||
|
MOV32 *SP++, R1H
|
||||||
|
MOV32 *SP++, R2H
|
||||||
|
MOV32 *SP++, R3H
|
||||||
|
MOV32 *SP++, R4H
|
||||||
|
MOV32 *SP++, R5H
|
||||||
|
MOV32 *SP++, R6H
|
||||||
|
MOV32 *SP++, R7H
|
||||||
|
.endif
|
||||||
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
||||||
RT_CTX_RESTORE .macro
|
RT_CTX_RESTORE .macro
|
||||||
|
|
||||||
|
.if __FPU32__
|
||||||
|
MOV32 R7H, *--SP, UNCF
|
||||||
|
MOV32 R6H, *--SP, UNCF
|
||||||
|
MOV32 R5H, *--SP, UNCF
|
||||||
|
MOV32 R4H, *--SP, UNCF
|
||||||
|
MOV32 R3H, *--SP, UNCF
|
||||||
|
MOV32 R2H, *--SP, UNCF
|
||||||
|
MOV32 R1H, *--SP, UNCF
|
||||||
|
MOV32 R0H, *--SP, UNCF
|
||||||
|
MOV32 STF, *--SP
|
||||||
|
POP RB
|
||||||
|
.endif
|
||||||
|
|
||||||
POP RPC
|
POP RPC
|
||||||
POP XT
|
POP XT
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
* Date Author Notes
|
* Date Author Notes
|
||||||
* 2018-09-01 xuzhuoyi the first version.
|
* 2018-09-01 xuzhuoyi the first version.
|
||||||
* 2019-07-03 zhaoxiaowei add support for __rt_ffs.
|
* 2019-07-03 zhaoxiaowei add support for __rt_ffs.
|
||||||
|
* 2019-12-05 xiaolifan add support for hardware fpu32
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
@ -22,6 +23,7 @@ extern rt_uint16_t rt_hw_get_st0(void);
|
||||||
extern rt_uint16_t rt_hw_get_st1(void);
|
extern rt_uint16_t rt_hw_get_st1(void);
|
||||||
extern int rt_hw_calc_csb(int value);
|
extern int rt_hw_calc_csb(int value);
|
||||||
|
|
||||||
|
|
||||||
struct exception_stack_frame
|
struct exception_stack_frame
|
||||||
{
|
{
|
||||||
rt_uint32_t t_st0;
|
rt_uint32_t t_st0;
|
||||||
|
@ -49,6 +51,18 @@ struct stack_frame
|
||||||
rt_uint32_t xt;
|
rt_uint32_t xt;
|
||||||
rt_uint32_t rpc;
|
rt_uint32_t rpc;
|
||||||
|
|
||||||
|
#ifdef __TMS320C28XX_FPU32__
|
||||||
|
rt_uint32_t rb;
|
||||||
|
rt_uint32_t stf;
|
||||||
|
rt_uint32_t r0h;
|
||||||
|
rt_uint32_t r1h;
|
||||||
|
rt_uint32_t r2h;
|
||||||
|
rt_uint32_t r3h;
|
||||||
|
rt_uint32_t r4h;
|
||||||
|
rt_uint32_t r5h;
|
||||||
|
rt_uint32_t r6h;
|
||||||
|
rt_uint32_t r7h;
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -83,6 +97,11 @@ 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 */
|
||||||
stack_frame->rpc = (unsigned long)texit;
|
stack_frame->rpc = (unsigned long)texit;
|
||||||
|
|
||||||
|
#ifdef __TMS320C28XX_FPU32__
|
||||||
|
stack_frame->stf = 0x00000200;
|
||||||
|
stack_frame->rb = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* return task's current stack address */
|
/* return task's current stack address */
|
||||||
return stk + sizeof(struct stack_frame);
|
return stk + sizeof(struct stack_frame);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue