arzhiy的笔记 https://passport2.21ic.com/?54316 [收藏] [复制] [RSS] 欢迎大家来到我的blog http://arzhiy.21ic.org 希望大家共同讨论电子电路、MCU、嵌入式系统相关的问题,也可以交流生活感悟。

日志

Keil MDK中使用ucOSII时,sprintf出错问题

热度 2已有 2745 次阅读2013-11-2 11:10 |个人分类:应用手记|系统分类:ARM| MDK, Sprintf, Vsprintf, Keil, Cortex


在MDK中使用sprintf()无**常输出浮点数问题



用到ucos这个操作系统,简单容易移植,占用资源少。一般来说,在ucos上运行标准C函数应该是没有什么问题的。这时候问题就出现了 当ucos运行到Cortex-M3上时候,这个时候使用sprintf进行浮点数格式化输出的时候就会有些问题,无**常输出浮点数,操作系统也会停止运行,处于崩溃状态。 操作系统崩溃有很多原因,我遇到的两个原因是:堆栈溢出和数据对齐。不知道首先遇到的是哪个问题,如果使用MDK编译器的话请在系统任务堆栈前面进行数据对齐声明,示例:__align(8) static OS_STK TaskStartStk[TASK_START_STK_SIZE];如果你没有修改过arm的启动代码可能就会出现这个问题,启动代码默认使用4字节对齐,而且ARM支持非对齐状态方式(便于在网络通信中优化效率)。而sprintf函数若是使用格式化浮点数就需要进行8字节对齐,这就是问题的所在,只要堆栈声明成8字节对齐就可以了。随后注意sprintf函数需要较大内存空间,任务堆栈也要声明足够的空间来运行程序。


http://hi.baidu.com/changzheng_w/item/491020769f7dbd32704423d2




使用Cortex-M3 uCOS-II LPC1700工程模板时sprintf 浮点数打印错误  发帖心情 Post By:2010-12-18 10:22:00







使用Cortex-M3 uCOS-II LPC1700工程模板时sprintf浮点数打印错误


网上看因为是8字节对齐的问题,我是在OS任务中调用的sprintf的,这时sprintf是用的什么存储空间呢


系统堆 系统主堆栈 系统特权堆栈 任务堆栈


在任务堆栈数组申明时已经用了关键字 __align(8)修饰,但是并未解决问题,我想应该是在初始化部分的问题,但是ZLG的和KEIL工程生成的不一样,麻烦详述改什么地方



现在问题已经解决,解决方法是将文件 Os_cpu_c.c 的 394 行:




以下内容为程序代码:

1  pstk = (OS_STK *)(((unsigned long)ptos) & ~0x07ul);      /* 获取堆栈指针,8字对齐 */  



更改为:




以下内容为程序代码:

1  pstk = ptos;



看来是移植的程序员画蛇添足了。


http://bbs.zlgmcu.com/dispbbs.asp?boardid=41&id=16636&page=1&star=1



路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (6 个评论)

回复 arzhiy 2013-11-2 11:10
具体哪个可用,还要去试验。
回复 arzhiy 2013-11-4 16:42
按照说明方法,终于可以实现了:)......................
回复 楚地潮人 2014-12-5 11:15
搜了N久N多资料没有解决我的问题,你的这篇贴帮我解决了。太感谢你了。
回复 楚地潮人 2014-12-5 11:17
好贴如甘泉。