继续裸奔,但是vsprintf为什么到这就不执行了?

[复制链接]
 楼主| Mars.CN 发表于 2012-10-16 09:50 | 显示全部楼层 |阅读模式


  1. /**************************************

  2. 通过串口0发送数据

  3. **************************************/

  4. void Uart0_Put(int data)

  5. {

  6. while(!(rUTRSTAT0 & (1<<2)));

  7. if(data=='\n')

  8. {

  9. rUTXH0='\r'; //替换发送

  10. }

  11. else

  12. {

  13. rUTXH0=data; //发送数据

  14. }



  15. }





  16. void Uart0_SendString(char *pt)

  17. {

  18. while(*pt)

  19. Uart0_Put(*pt++);;

  20. }



  21. /**************************************

  22. 批量发送数据

  23. **************************************/

  24. void Uart0_Printf(const char *fmt,...)

  25. {

  26. va_list ap;

  27. char string[256];

  28. Led_On(1);

  29. va_start(ap,fmt);

  30. Led_On(2);

  31. vsprintf(string,fmt,ap);

  32. Led_On(3);

  33. Uart0_SendString(string);

  34. Led_On(4);

  35. va_end(ap);

  36. }


为什么执行到vspringf就直接报错了?
LED_On()是我测试的,点亮第几个Led
但是led只亮了两个,意思就是到了vspringf就报错重新执行了
什么情况?
为什么测试程序中的就能执行过?代码一样的
如果我用Uart0_SendString(string);直接发送数据是没有问题的,可以发送
vspringf用到了缓冲区,是不是得设置堆栈什么的??
启动代码中我没有做设置,请问一下启动代码中哪些是必须的代码?对于我这个程序来说
sedatefire 发表于 2012-10-16 10:47 | 显示全部楼层
为什么执行到vspringf就直接报错了?
怎么个报错法
sedatefire 发表于 2012-10-16 10:49 | 显示全部楼层
你如何确定 vsprintf 最终就是链接到uart0那边去

你要研究一下你那个系统的C编译器关于printf的说明

看看库里面有没有retarget.c之类的代码需要修改
 楼主| Mars.CN 发表于 2012-10-16 11:54 | 显示全部楼层
2# sedatefire

我里面加了四个LED灯,只亮了前两个就不再亮了,然后重新开始Main的执行(应该走引导了),肯定是vsprintf报错了
sfpxfpcfp 发表于 2012-10-16 11:59 | 显示全部楼层
printf 书上有专门讲的,好是谭老师那本
sedatefire 发表于 2012-10-17 14:31 | 显示全部楼层
在mcu里面,printf是需要重映像连接的
c51是链接到putchar,就是自己要重写putchar
keil的armcc是链接到fputc那里,
如果是STM32的话,他的库有个retarget让你修改
 楼主| Mars.CN 发表于 2012-10-17 17:30 | 显示全部楼层
6# sedatefire

能说具体点吗?我用的是ARM9的S3C2440芯片,开发板是TQ2440
我要怎么做才能用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

43

帖子

0

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

9

主题

43

帖子

0

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