各位大牛好,小弟最近开始搞uCOS-II的开发,在任务中sprintf打印浮点数出现0.0000的情况,在网上搜索后得知是8字节对齐的问题,后在任务的堆栈前加入__align(8),但还是无法正确输出,经排查得知系统任务堆栈初始化函数OSTaskStkInit存在问题,后对比ucos官网的例程,发现ucos官方例程在函数OSTaskStkInit在开始部分将堆栈地址加1,后参考官方例程修改可以实现sprintf正确输出浮点数。
任务堆栈的地址为什么都要加1呢?
以下为ucos官方例程中的代码
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
OS_STK *p_stk;
p_stk = ptos + 1u; /* Load stack pointer */
/* Align the stack to 8-bytes. */
p_stk = (OS_STK *)((OS_STK)(p_stk) & 0xFFFFFFF8u);
/* Registers stacked as if auto-saved on exception */
*(--p_stk) = (OS_STK)0x01000000uL; /* xPSR */
*(--p_stk) = (OS_STK)task; /* Entry Point */
*(--p_stk) = (OS_STK)OS_TaskReturn; /* R14 (LR) */
*(--p_stk) = (OS_STK)0x12121212uL; /* R12 */
*(--p_stk) = (OS_STK)0x03030303uL; /* R3 */
*(--p_stk) = (OS_STK)0x02020202uL; /* R2 */
*(--p_stk) = (OS_STK)0x01010101uL; /* R1 */
*(--p_stk) = (OS_STK)p_arg; /* R0 : argument */
/* Remaining registers saved on process stack */
*(--p_stk) = (OS_STK)0x11111111uL; /* R11 */
*(--p_stk) = (OS_STK)0x10101010uL; /* R10 */
*(--p_stk) = (OS_STK)0x09090909uL; /* R9 */
*(--p_stk) = (OS_STK)0x08080808uL; /* R8 */
*(--p_stk) = (OS_STK)0x07070707uL; /* R7 */
*(--p_stk) = (OS_STK)0x06060606uL; /* R6 */
*(--p_stk) = (OS_STK)0x05050505uL; /* R5 */
*(--p_stk) = (OS_STK)0x04040404uL; /* R4 */
#if (OS_CPU_ARM_FP_EN > 0u)
if ((opt & OS_TASK_OPT_SAVE_FP) != (INT16U)0) {
*--p_stk = (OS_STK)0x02000000u; /* FPSCR */
/* Initialize S0-S31 floating point registers */
*--p_stk = (OS_STK)0x41F80000u; /* S31 */
*--p_stk = (OS_STK)0x41F00000u; /* S30 */
*--p_stk = (OS_STK)0x41E80000u; /* S29 */
*--p_stk = (OS_STK)0x41E00000u; /* S28 */
*--p_stk = (OS_STK)0x41D80000u; /* S27 */
*--p_stk = (OS_STK)0x41D00000u; /* S26 */
*--p_stk = (OS_STK)0x41C80000u; /* S25 */
*--p_stk = (OS_STK)0x41C00000u; /* S24 */
*--p_stk = (OS_STK)0x41B80000u; /* S23 */
*--p_stk = (OS_STK)0x41B00000u; /* S22 */
*--p_stk = (OS_STK)0x41A80000u; /* S21 */
*--p_stk = (OS_STK)0x41A00000u; /* S20 */
*--p_stk = (OS_STK)0x41980000u; /* S19 */
*--p_stk = (OS_STK)0x41900000u; /* S18 */
*--p_stk = (OS_STK)0x41880000u; /* S17 */
*--p_stk = (OS_STK)0x41800000u; /* S16 */
*--p_stk = (OS_STK)0x41700000u; /* S15 */
*--p_stk = (OS_STK)0x41600000u; /* S14 */
*--p_stk = (OS_STK)0x41500000u; /* S13 */
*--p_stk = (OS_STK)0x41400000u; /* S12 */
*--p_stk = (OS_STK)0x41300000u; /* S11 */
*--p_stk = (OS_STK)0x41200000u; /* S10 */
*--p_stk = (OS_STK)0x41100000u; /* S9 */
*--p_stk = (OS_STK)0x41000000u; /* S8 */
*--p_stk = (OS_STK)0x40E00000u; /* S7 */
*--p_stk = (OS_STK)0x40C00000u; /* S6 */
*--p_stk = (OS_STK)0x40A00000u; /* S5 */
*--p_stk = (OS_STK)0x40800000u; /* S4 */
*--p_stk = (OS_STK)0x40400000u; /* S3 */
*--p_stk = (OS_STK)0x40000000u; /* S2 */
*--p_stk = (OS_STK)0x3F800000u; /* S1 */
*--p_stk = (OS_STK)0x00000000u; /* S0 */
}
#endif
return (p_stk);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
我是在STM32F411上面移植的,不加1也是可以实现的,我是想知道为什么要加1?
一周热门 更多>