打印
[ZLG-ARM]

LM3S的奇怪问题

[复制链接]
1781|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
疯子8972|  楼主 | 2009-1-10 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚刚接触LM3S8962
想编个串口程序,方便以后调试程序,于是把以前的一小段拷贝过来
如下:
void UARTSendString(unsigned long ulBase, char* pt)
{
    while(*pt)
        UARTCharPut(ulBase, *pt++);
}

/*此函数无法使用,调用vsprintf、sprintf将引起硬件错误
void UARTPrintf (unsigned long ulBase, char* fmt, ...)
{
    va_list ap;
    char string[256];
    va_start(ap, fmt);
    vsprintf(string, fmt, ap);
    UARTSendString(ulBase, string);
    va_end(ap);
}*/

结果就是不能使用,使用就引起硬件错误,进入FaultISR中断,
在流明那瑞网站的BBS上也有这个问题,都是说多次调用vsprintf就出错,
在KEIL和IAR编译下都这样,请问有知道是怎么回事么?
我很喜欢用在字符串中“%d”之类的东西,很方便,现在咋整呢???

相关帖子

沙发
zlgmcu| | 2009-1-11 08:46 | 只看该作者

建议采用sprintf()

参考这里hello world例程:
周立功单片机(www.ZLGMCU.com)首页左边 → Luminary Micro 32位ARM系列 → 开发工具及开发指南

sprintf()跟printf()用法一致,唯一区别是增加了一个char *s参数,输出结果到s指向的缓冲区而不是标准输出设备,因此处理起来要灵活一些。

使用特权

评论回复
板凳
疯子8972|  楼主 | 2009-1-12 09:08 | 只看该作者

我以前在AVR单片机就是使用sprintf
但是这么使用就不能编写出类似void UARTPrintf (unsigned long ulBase, char* fmt, ...)
这样的函数了啊,难道对软件对M3的支持还不行?这个在ARM7上用好好的啊-_-!!!

使用特权

评论回复
地板
wahahaabc| | 2009-1-12 10:00 | 只看该作者

RE: 楼主

这是偶的在LM3S8962上的串口打印程序,在LM3S上运行没有出现过任何问题。估计问题是va_start() vsprintf() va_end()不可重入,用之前关中断即可。
int CommPrintf( INT8U ch, const char *fmt, ... )
{
      int i;
      va_list args;
      static char buf[128];

#if OS_CRITICAL_METHOD == 3
      OS_CPU_SR  cpu_sr;
#endif

      OS_ENTER_CRITICAL();
      va_start( args, fmt );
      i = vsprintf( buf, fmt, args );
      va_end(args);
      OS_EXIT_CRITICAL();

      CommSendData( ch, (const INT8U*)buf, i );

      return i;
}

使用特权

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

本版积分规则

32

主题

576

帖子

37

粉丝