本帖最后由 SUPER_CRJ 于 2018-2-27 16:36 编辑
如下:在STM32F1编程中使用了类似下面的函数:
char Value[30];
sprintf( Value,"%3.1lf",19.0);
格式化后Value里面为0.0。但是之前是OK的,突然有一天不可以了,之前没有解决,查看网上的解决办法,说是8字节对齐,但是看了μc/OS-Ⅲ中的堆栈都是8的整数倍,怀疑是使用了:#para强制对齐造成的结果(项目其它地方使用的!)。现在要如何解决这个问题呢?我当前的方法是:sprintf( Value,"%d.%d",190/10,190%10);请问大家有没有更好的方法?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
ARM-GCC下sprintf()不支持%f格式化输出
- 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; /* 'opt' is not used, prevent warning */
-
- p_stk = &p_stk_base[stk_size]; /* Load stack pointer */
- p_stk = (CPU_STK *)((CPU_STK)(p_stk) & ~7u); /* Align the stack to 8-bytes. */
- /* Registers stacked as if auto-saved on exception */
- *(--p_stk) = (CPU_STK)0x01000000uL; /* xPSR */
- *(--p_stk) = (CPU_STK)p_task; /* Entry Point */
- *(--p_stk) = (CPU_STK)OS_TaskReturn; /* R14 (LR) */
- *(--p_stk) = (CPU_STK)0x12121212uL; /* R12 */
- *(--p_stk) = (CPU_STK)0x03030303uL; /* R3 */
- *(--p_stk) = (CPU_STK)0x02020202uL; /* R2 */
- *(--p_stk) = (CPU_STK)0x01010101uL; /* R1 */
- *(--p_stk) = (CPU_STK)p_arg; /* R0 : argument */
- *(--p_stk) = (CPU_STK)0x11111111uL; /* R11 */
- *(--p_stk) = (CPU_STK)0x10101010uL; /* R10 */
- *(--p_stk) = (CPU_STK)0x09090909uL; /* R9 */
- *(--p_stk) = (CPU_STK)0x08080808uL; /* R8 */
- *(--p_stk) = (CPU_STK)0x07070707uL; /* R7 */
- *(--p_stk) = (CPU_STK)0x06060606uL; /* R6 */
- *(--p_stk) = (CPU_STK)0x05050505uL; /* R5 */
- *(--p_stk) = (CPU_STK)0x04040404uL; /* R4 */
- #if defined(__ARMVFP__)
- *(--p_stk) = (CPU_STK)0xFFFFFFFDuL; /* EXEC_RETURN; See Note 5 */
- #endif
- return (p_stk);
- }
复制代码什么意思?没有看懂,是不是要改μc/OS-Ⅲ中的这些?问题是:这个更改有什么优点和缺点?
我遇到的问题跟你描述的一模一样。确实是堆栈8字节对齐问题所致!
上面代码确保了任务堆栈的8字节对齐
应该是8字节堆栈问题,我可能是之前用了#para强制对齐,才导致的,那你现在是怎么解决的呢?分享一下,让更多的人知道解决方法。
一周热门 更多>