|
发表于 2018-4-20 21:32:16
|
显示全部楼层
ucos好似所有的浮点都没有判断。 之前有人移植用了判断,测试一直没问题。后来移植到F7没搞定,只好换官方的IAR改过去就是所有都入栈了。
以下是M4 ucos3.01版本的,不需要全部入栈。
CPU_STK *OSTaskStkInit (OS_TASK_PTR p_task,
void *p_arg,
CPU_STK *p_stk_base,
CPU_STK *p_stk_limit,
CPU_STK_SIZE stk_size,
OS_OPT opt)
{
CPU_STK *p_stk;
(void)opt; /* Prevent compiler warning */
p_stk = &p_stk_base[stk_size]; /* Load stack pointer */
/* Align the stack to 8-bytes. */
p_stk = (CPU_STK *)((CPU_STK)(p_stk) & 0xFFFFFFF8);
/* Registers stacked as if auto-saved on exception */
*--p_stk = (CPU_STK)0x01000000u; /* xPSR */
*--p_stk = (CPU_STK)p_task; /* Entry Point */
*--p_stk = (CPU_STK)OS_TaskReturn; /* R14 (LR) */
*--p_stk = (CPU_STK)0x12121212u; /* R12 */
*--p_stk = (CPU_STK)0x03030303u; /* R3 */
*--p_stk = (CPU_STK)0x02020202u; /* R2 */
*--p_stk = (CPU_STK)p_stk_limit; /* R1 */
*--p_stk = (CPU_STK)p_arg; /* R0 : argument */
/* Remaining registers saved on process stack */
*--p_stk = (CPU_STK)0x11111111u; /* R11 */
*--p_stk = (CPU_STK)0x10101010u; /* R10 */
*--p_stk = (CPU_STK)0x09090909u; /* R9 */
*--p_stk = (CPU_STK)0x08080808u; /* R8 */
*--p_stk = (CPU_STK)0x07070707u; /* R7 */
*--p_stk = (CPU_STK)0x06060606u; /* R6 */
*--p_stk = (CPU_STK)0x05050505u; /* R5 */
*--p_stk = (CPU_STK)0x04040404u; /* R4 */
//============ FPU register=====================
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
*--p_stk = (CPU_STK)0xFFFFFFFDUL; /* (1)这句话最重要,这里是将 EXC_RETURN也进行了入栈处理。 */
#endif
return (p_stk);
}
;=====================================================================
; USE FPU register.. version 2
;=====================================================================
TST LR, #0x10 ; (1)
IT EQ
VSTMDBEQ R0!, {S16-S31}
MOV R3, LR ;(2)
STMDB R0!,{R3-R11}
|
|