OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9755|回复: 3

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

[复制链接]

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-1-5
在线时间
21 小时
发表于 2015-3-19 12:42:46 | 显示全部楼层 |阅读模式
5金钱
各位大牛好,小弟最近开始搞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);
}

Micrium.rar

14.95 MB, 下载次数: 339

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-3-19 12:53:32 | 显示全部楼层
你这是在没M4的芯片上移植的UCOSII吧,我的没有加1,照样可以printf出浮点数据啊。
开往春天的手扶拖拉机
回复

使用道具 举报

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-1-5
在线时间
21 小时
 楼主| 发表于 2015-3-19 12:59:22 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
我是在STM32F411上面移植的,不加1也是可以实现的,我是想知道为什么要加1?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-3-19 18:06:32 | 显示全部楼层
回复【3楼】kfxy:
---------------------------------
按照我的移植思路,不需要加1,至于为什么加1我也不知道,我是没有加1操作的
开往春天的手扶拖拉机
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-27 12:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表