Merge pull request #3240 from xlf605401969/c28x_fpu

[libcpu][c28x]add support for c28x mcu hardware fpu
This commit is contained in:
Bernard Xiong 2020-12-31 08:35:23 +08:00 committed by GitHub
commit fa38e8d11e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 1 deletions

View File

@ -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
@ -25,6 +26,16 @@
.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
@ -39,12 +50,37 @@ RT_CTX_SAVE .macro
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
POP XAR7 POP XAR7

View File

@ -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);
} }