原创 S3C2410中使用的printf函数

2009-9-21 09:20 3384 4 4 分类: MCU/ 嵌入式

在调试北京蓝海微芯的2410开发板的时候,有如下函数,该函数通过串口可以向PC机打印
一些数据。


printf("* http://www.bluemcu.com *\n");


函数原型如下:
/***************************************************************************
Function name: printf
Parameter    : *fmt : 数据显示的格式
Description  : 根据提供的格式显示变量的数值
Return      : void
Argument     : 调用了ADS的库函数
Autor & date :
****************************************************************************/
//If you don't use vsprintf(), the code size is reduced very much.
假如你不调用vsprintf()这个函数,那么代码大小会减小很多
typedef int *__va_list[1];
int vsprintf(char * /*s*/, const char * /*format*/, __va_list /*arg*/);


void printf(char *fmt, ...)
{
 va_list ap;
 char string[1024];
 
 va_start(ap,fmt);
 vsprintf(string,fmt,ap);
 puts(string);
 va_end(ap);
}


va_start(ap,fmt);


这个函数如下:
#define va_start(ap, parmN) (void)(*(ap) = __va_start(parmN))


关于va_start,va_end这两个函数,以及printf这种c语言中的可变参数用法,在另一个
日记中进行分析。


可以理解应该是经过vsprintf(string,fmt,ap);之后,要打印的数据已经转换为字符串格式
并存储在了string数组中。


接着调用puts(string);


该函数原型


/***************************************************************************
Function name: puts
Parameter    : *str : 要发送的字符串指针变量
Description  : 向串口发送字符串
Return      : void
Argument     :
Autor & date :
****************************************************************************/
void puts(char *str)
{
 SerialTxString(str);
}


调用SerialTxString(str); 函数原型:


/***************************************************************************
Function name: SerialTxString
Parameter    : *s : 要发送的字符串变量
Description  : 向串口发送字符串
Return      : void
Argument     :
Autor & date :
****************************************************************************/
void SerialTxString(char *s)
{
  while(*s)
  SerialTxChar(*s++);
}



继续调用SerialTxChar(*s++);函数原型:


/***************************************************************************
Function name: SerialTxChar
Parameter    : data :要发送的数据
Description  : 主要进行串口发送
Return      : void
Argument     : 通过SerialPortSel变量来选择是哪个串口发送数据 
Autor & date :
****************************************************************************/
void SerialTxChar(char data)
{
 if(SerialPortSel) {
  if(data=='\n') {
   while(!(rUTRSTAT1 & 0x4));
      //Delay(1); //because the slow response of hyper_terminal
   WrUTXH1('\r');
  }
  while(!(rUTRSTAT1 & 0x4)); //Wait until THR is empty.
//  Delay(1);
  WrUTXH1(data);
    } else {
  if(data=='\n') {
   while(!(rUTRSTAT0 & 0x4));
   //Delay(1); //because the slow response of hyper_terminal
   WrUTXH0('\r');
  }
  while(!(rUTRSTAT0 & 0x4));  //Wait until THR is empty.
  WrUTXH0(data);
    }
}


这里面通过SerialPortSel这个变量来确定是串口0,还是串口1
程序加了判断回车字符的代码
自此printf执行完毕。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /4 下一条