[ZLG-ARM] LM3S的奇怪问题

[复制链接]
 楼主| 疯子8972 发表于 2009-1-10 15:52 | 显示全部楼层 |阅读模式
刚刚接触LM3S8962<br />想编个串口程序,方便以后调试程序,于是把以前的一小段拷贝过来<br />如下:<br />void&nbsp;UARTSendString(unsigned&nbsp;long&nbsp;ulBase,&nbsp;char*&nbsp;pt)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*pt)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UARTCharPut(ulBase,&nbsp;*pt++);<br />}<br /><br />/*此函数无法使用,调用vsprintf、sprintf将引起硬件错误<br />void&nbsp;UARTPrintf&nbsp;(unsigned&nbsp;long&nbsp;ulBase,&nbsp;char*&nbsp;fmt,&nbsp;...)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;ap;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;string[256];<br />&nbsp;&nbsp;&nbsp;&nbsp;va_start(ap,&nbsp;fmt);<br />&nbsp;&nbsp;&nbsp;&nbsp;vsprintf(string,&nbsp;fmt,&nbsp;ap);<br />&nbsp;&nbsp;&nbsp;&nbsp;UARTSendString(ulBase,&nbsp;string);<br />&nbsp;&nbsp;&nbsp;&nbsp;va_end(ap);<br />}*/<br /><br />结果就是不能使用,使用就引起硬件错误,进入FaultISR中断,<br />在流明那瑞网站的BBS上也有这个问题,都是说多次调用vsprintf就出错,<br />在KEIL和IAR编译下都这样,请问有知道是怎么回事么?<br />我很喜欢用在字符串中“%d”之类的东西,很方便,现在咋整呢???
zlgmcu 发表于 2009-1-11 08:46 | 显示全部楼层

建议采用sprintf()

参考这里hello&nbsp;world例程:<br />周立功单片机(<a href="http://www.ZLGMCU.com" target=_blank>www.ZLGMCU.com</a>)首页左边&nbsp;→&nbsp;Luminary&nbsp;Micro&nbsp;32位ARM系列&nbsp;→&nbsp;开发工具及开发指南<br /><br />sprintf()跟printf()用法一致,唯一区别是增加了一个char&nbsp;*s参数,输出结果到s指向的缓冲区而不是标准输出设备,因此处理起来要灵活一些。
 楼主| 疯子8972 发表于 2009-1-12 09:08 | 显示全部楼层

我以前在AVR单片机就是使用sprintf<br />但是这么使用就不能编写出类似void&nbsp;UARTPrintf&nbsp;(unsigned&nbsp;long&nbsp;ulBase,&nbsp;char*&nbsp;fmt,&nbsp;...)<br />这样的函数了啊,难道对软件对M3的支持还不行?这个在ARM7上用好好的啊-_-!!!
wahahaabc 发表于 2009-1-12 10:00 | 显示全部楼层

RE: 楼主

这是偶的在LM3S8962上的串口打印程序,在LM3S上运行没有出现过任何问题。估计问题是va_start()&nbsp;vsprintf()&nbsp;va_end()不可重入,用之前关中断即可。<br />int&nbsp;CommPrintf(&nbsp;INT8U&nbsp;ch,&nbsp;const&nbsp;char&nbsp;*fmt,&nbsp;...&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;args;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;char&nbsp;buf[128];<br /><br />#if&nbsp;OS_CRITICAL_METHOD&nbsp;==&nbsp;3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_CPU_SR&nbsp;&nbsp;cpu_sr;<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_start(&nbsp;args,&nbsp;fmt&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;vsprintf(&nbsp;buf,&nbsp;fmt,&nbsp;args&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_end(args);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommSendData(&nbsp;ch,&nbsp;(const&nbsp;INT8U*)buf,&nbsp;i&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;i;<br />}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

576

帖子

37

粉丝
快速回复 在线客服 返回列表 返回顶部

32

主题

576

帖子

37

粉丝
快速回复 在线客服 返回列表 返回顶部