打印
[ZLG-ARM]

由vsprintf引起的M3内存分配问题思考

[复制链接]
2682|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
疯子8972|  楼主 | 2009-1-14 14:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近才上手M3,出了不少奇怪的问题:)
也发过帖子问为什么不能使用vsprintf
周立功给的答案是不要用vsprintf,改用sprintf
但是在使用sprintf时还是有奇怪问题
代码如下
void OnTimer1 (void)
{
    static int OldTemperature;
    int NowTemperature;
    float a;
    NowTemperature = ReadTemperature();
    if(OldTemperature != NowTemperature)
    {
        OldTemperature = NowTemperature;
        a = (float)NowTemperature / 8;
        sprintf(UARTString, "现在的温度是%.3f摄氏度 ", a);
        UARTPrintf(UART0_BASE, UARTString);
    }
    SetTimer(1, 1000);
}
SetTimer(1, 1000)的意思是1秒后让系统回调OnTimer1(),(呵呵自己写的小系统)。这样就相当于每1秒钟调用一次 OnTimer1(),一直循环下去,
照理说只有温度发生变化的时候才从串口打印出数据,但是实际情况是即使温度不变,每秒都有数据从串口打印出来。
改动代码为
if(OldTemperature != NowTemperature)
{
    a = (float)NowTemperature / 8;
    sprintf(UARTString, "现在的温度是%.3f摄氏度 ", a);
    UARTPrintf(UART0_BASE, UARTString);
    OldTemperature = NowTemperature;
}
问题解决。
说明代码:
a = (float)NowTemperature / 8;
sprintf(UARTString, "现在的温度是%.3f摄氏度 ", a);
UARTPrintf(UART0_BASE, UARTString);
改变了OldTemperature的值。
于是猜想局部变量冲出堆栈了。
将STACK_SIZE改为1024,代码回复原来,问题解均。
试着使用vsprintf,也没有问题。
在我上个询问vsprintf的帖子中,有个大大在ucOS下使用vsprintf就没有问题,应该是那个模板STACK_SIZE为64,和重入没有关系。
猜想M3中堆和栈的生长方向相同,和以前使用的AVR不一样。
AVR即使设置错了,局部变量也不一定会冲到全局里面。
分析完毕,大大们看看对不对啊。


相关帖子

沙发
computer00| | 2009-1-14 14:55 | 只看该作者

在编译器中,只有栈,没有堆。堆是操作系统的概念

这里的临时变量都是分配在栈上面的。

使用特权

评论回复
板凳
疯子8972|  楼主 | 2009-1-14 19:01 | 只看该作者

呵呵

概念错误
应该把堆改称为静态区
应该不影响我对于意思的表达:)

使用特权

评论回复
地板
Swd21ic| | 2009-1-15 22:06 | 只看该作者

re

在编译器中,只有栈,没有堆。堆是操作系统的概念

00你没用过IAR么? heap = 堆 

使用特权

评论回复
5
by674868212| | 2011-1-12 17:12 | 只看该作者
今天遇到这个问题~~~改了堆栈大小,问题解决了~~~~

难道 vprintf 会申请很多堆栈空间?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

576

帖子

37

粉丝