你好,我同样碰到浮点问题,以前是M3 LM3S9B96用UCOS/II,程序都跑的好好的,现在全部切换到M4 TMC129ENCPDT(包括ucos),其他都正常,一到浮点运算的时候就有点混乱了,后面就死机状态,开始不知道有浮点问题,困惑了好久,后来网上查了下,确认才知道M4有个浮点问题,我把浮点的代码屏蔽点,确实正常,不会死机;我按照上面2位说的改了os_cpu_a.asm和os_cpu_c.c,但是一启动死机了,还不如以前,是什么情况?
初始化的时候加了
FPUEnable();
FPULazyStackingEnable();
MDk环境选了USE FPU
os_cpu_c.c
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
unsigned int i;
(void)opt; /* 'opt' is not used, prevent warning */
stk = ptos; /* Load stack pointer */
/* Registers stacked as if auto-saved on exception */
*(stk) = (INT32U)0x01000000L; /* xPSR */
*(–stk) = (INT32U)task; /* Entry Point */
*(–stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used) */
*(–stk) = (INT32U)0x12121212L; /* R12 */
*(–stk) = (INT32U)0x03030303L; /* R3 */
*(–stk) = (INT32U)0x02020202L; /* R2 */
*(–stk) = (INT32U)0x01010101L; /* R1 */
*(–stk) = (INT32U)p_arg; /* R0 : argument */
/* Remaining registers saved on process stack */
*(–stk) = (INT32U)0x11111111L; /* R11 */
*(–stk) = (INT32U)0x10101010L; /* R10 */
*(–stk) = (INT32U)0x09090909L; /* R9 */
*(–stk) = (INT32U)0x08080808L; /* R8 */
*(–stk) = (INT32U)0x07070707L; /* R7 */
*(–stk) = (INT32U)0x06060606L; /* R6 */
*(–stk) = (INT32U)0x05050505L; /* R5 */
*(–stk) = (INT32U)0x04040404L; /* R4 */
//2014 0516 ³õʼ»¯¸¡µã¼Ä´æÆ÷
#if 1 for (i = 16u; i != 0; i–) /* Initialize general-purpose Floating point registers */
{
*–stk = (INT32U)0xBBBBBBBBuL; /* S16-S31 */
}#endif return (stk);
}
os_cpu_a.asm
OSPendSV ;R0-R3,R12,LR,xPSR£¬PC»áÓÖM3×Ô¶¯Ñ¹Õ»
MRS R0, PSP ; PSP is process stack pointer
CBZ R0, OSPendSV_nosave ; skip register save the first time
SUBS R0, R0, #0x20 ; save remaining regs r4-11 on process stack
STM R0, {R4-R11}
SUBS R0, R0, #0x40 ;//20140516 ¸¡µã
VSTM R0, {S8-S15}
LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP;
LDR R1, [R1]
STR R0, [R1] ; R0 is SP of process being switched out
; at this point, entire context of process has been saved
OSPendSV_nosave
PUSH {R14} ; need to save LR exc_return value
LDR R0, =OSTaskSwHook ; OSTaskSwHook();
BLX R0
POP {R14}
LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHighRdy;
LDR R1, =OSPrioHighRdy
LDRB R2, [R1]
STRB R2, [R0]
LDR R0, =OSTCBCur ; OSTCBCur = OSTCBHighRdy;
LDR R1, =OSTCBHighRdy
LDR R2, [R1]
STR R2, [R0]
LDR R0, [R2] ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr;
VLDM R0, {S8-S15} ;2014 0516 ¸¡µã
ADDS R0, R0, #0x40
LDM R0, {R4-R11} ; restore r4-11 from new process stack
ADDS R0, R0, #0x20
BIC.W LR, LR, #0x10 ;2014 0516 ; Set exception return uses floating-point state
MSR PSP, R0 ; load PSP with new process SP
ORR LR, LR, #0x04 ; ensure exception return uses process stack
BX LR ; exception return will restore remaining context
END
ding tao:
请问有人能支持吗?
TI中文支持网
