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