最近才上手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即使设置错了,局部变量也不一定会冲到全局里面。 分析完毕,大大们看看对不对啊。
|