ucos中堆栈初始化函数OSTaskStkInit的疑问

2019-07-21 03:38发布

各位大牛好,小弟最近开始搞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);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。