打印

只要使用printf函数,硬件仿真就不正常

[复制链接]
10573|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luxinsun|  楼主 | 2007-12-18 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么我只要使用printf函数,硬件仿真就不正常,死在汇编“0x080016AC BEAB      BKPT     0xAB”位置不动。怎么也想不明白啊。
请教各位啊,两天了卡在这里。
评分
参与人数 1威望 +1 收起 理由
ttl_web + 1 很给力!
沙发
hotpower| | 2007-12-18 21:01 | 只看该作者

俺觉得还是自己做个串口的驱动来代替printf()~~~

虽然俺还没开始用,但俺从不用它~~~

使用特权

评论回复
板凳
mohanwei| | 2007-12-18 21:23 | 只看该作者

记得在C51里使用printf的时候,需要先将TI置1

这个“TI = 1;”可是很精妙的。

至于你用的环境……看看putchar()的实现就知道了。也可以参考一下例程。

使用特权

评论回复
地板
hotpower| | 2007-12-18 21:28 | 只看该作者

"手动激活发送"~~~几乎所有的MCU/ARM都可以实现~~~

使用特权

评论回复
5
mohanwei| | 2007-12-19 10:41 | 只看该作者

printf是通过putchar函数来输出字符流的。

printf是通过putchar函数来输出字符流的。
以下是putchar的最简单实现:
char putchar (char c)
{
    while (!TI)//等待前一个字符发送完成
        ;
    TI = 0;
    return (SBUF = c);//发送当前字符
    //然后在串口发送字符的时间里,printf继续处理后续字符……运用了统筹方法
}

所以,开机初始化的时候,要先“TI = 1;”,让printf能工作起来。

使用特权

评论回复
6
mohanwei| | 2007-12-19 10:47 | 只看该作者

不建议自己去做太多重复劳动……

对于格式化输出来说,printf是最好的;

其次是sprintf+Send_String(Buff,Len)

printf不占用过多的缓冲区,它是边处理边输出的。

那种输出一个整数还要:
i=Num/1000;//千位
j=Num%1000;
……
的方法是很蠢而且很浪费激情的。


使用特权

评论回复
7
hotpower| | 2007-12-19 12:21 | 只看该作者

sprintf确实是最方便的~~~但printf并不适用于中断发送方式

使用特权

评论回复
8
McuPlayer| | 2007-12-19 14:50 | 只看该作者

mohanwei说的对

printf会调用putchar函数
可以通过修改这个函数使输出转到串口或者LCD或者其它。

使用特权

评论回复
9
hotpower| | 2007-12-19 19:02 | 只看该作者

虽然很好,但while (!Uart0_Send_Ready)就不完美了~~~

发送实际还是查询方式~~~

使用特权

评论回复
10
mohanwei| | 2007-12-19 19:51 | 只看该作者

要想做到自动发送,就要用sprintf+缓冲区的方式了

边处理边输出恰好是printf的优势。实际用到显示的地方都是人机交互的,速度如果太快,反而不好了……

假设波特率是9600bps,printf和中断自动发送的整体速度是几乎一摸一样,因为在等待前一个字符发送的时间里,printf已经处理好了下一个字符。

使用特权

评论回复
11
hotpower| | 2007-12-19 19:59 | 只看该作者

不能这么说~~~在多任务处理时,"寸金寸光阴"~~~

使用特权

评论回复
12
mohanwei| | 2007-12-20 11:55 | 只看该作者

假设波特率是9600bps,那么发送一个字节是1.1ms

发送1000个字节就是1.1s

Send_Array(Buff,Len);约1.1s,偏差几十us;CPU不能干别的事,占用Buff

printf约1.1s,偏差几十us;CPU不能干别的事,不占用Buff

Auto_Send=1(在串口中断+全局变量,自动发送);约1.1s,偏差几十us;CPU可以干别的事,占用Buff

如果有OS,以上三种情况CPU都可以干别的事。

使用特权

评论回复
13
香水城| | 2007-12-20 18:24 | 只看该作者

ST的STM32固件库中就有一个这方面的例子


https://bbs.21ic.com/upfiles/img/200712/20071216192222218.pdf
请看USART下的Example7
 
9楼的帖子不错,虽然是51下面的,但有借鉴作用。相信结合STM32固件库中的例子,应该很容易在STM32上实现的。鉴于天冷了,9楼要裤子穿,就送一条吧(潜台词:下不为例),嘿嘿。
 
现在希望楼主现身,说说你问的是什么芯片,根据你给的信息我猜不出来。

使用特权

评论回复
14
s99060| | 2007-12-21 01:17 | 只看该作者

工作在中断方式下干嘛呢?putchar还是在查询等待中啊...

printf能不能改造得不等待呢?

使用特权

评论回复
15
hotpower| | 2007-12-21 01:20 | 只看该作者

哈哈~~~这种方法...没话说~~~

使用特权

评论回复
16
mohanwei| | 2007-12-21 19:21 | 只看该作者

不等待就是sprintf+Auto_Send=1了,需要占用大量缓冲区

要不就上OS。

使用特权

评论回复
17
wormchen| | 2008-4-14 11:29 | 只看该作者

我是这样解决的

我也遇到这样的情况,用printf()需要重定向fputc()函数
只要在程序加入以下代码就可以了。
/*************************************************
函数: PUTCHAR_PROTOTYPE
功能: 重定向C库prinf函数
参数: 无
返回: 无
**************************************************/
int fputc(int ch, FILE *f)
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART2, (u8) ch);

  /* Loop until the end of transmission */
  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
  {
  }
  return ch;
}

使用特权

评论回复
18
insect2006| | 2013-6-24 17:47 | 只看该作者
我也遇到了同样的问题...

使用特权

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

本版积分规则

11

主题

102

帖子

1

粉丝