📄 print_f.c
字号:
/*********************************************************************
* Copyright (c) 2011-2012,李士伟
* All rights reserved.
*文 件 名:print_f.c
*描 述:一个简单的printf函数
*当前版本:V1.00
*作 者:李士伟
*创建日期:2012.01.17
**********************************************************************/
#include <lib\print_f.h>
#include <lib\ultoa.h>
#include <lib\ltoa.h>
#include <lib\ftoa.h>
#include <stdarg.h>
/* 字符输出终端 */
extern void UART0_puts(char *str);
/*********************************************************************
*函 数 名:vs_printf
*描 述:解析print_f的参数,并将参数转化为ascii码
*输入参数:fmt:参数类型格式控制串
* args:可变参数列表
*输出参数:buf: 存放ascii码缓冲区
*返 回 值:存储在buf中的字符数
*注 意:
**********************************************************************/
unsigned int vs_printf(char *buf, const char *fmt, va_list args)
{
char *str;
char *s;
int n;
unsigned long ul;
double f;
for ( str = buf ; *fmt; ++fmt)
{
if (*fmt != '%')
{
*str++ = *fmt;
continue ;
}
fmt++;
switch (*fmt)
{
case 'c':
{
*str++ = (unsigned char) va_arg(args, int);
break ;
}
case 's':
{
s = va_arg(args, char *);
while (*s != '\0')
{
*str++ = *s++;
}
break ;
}
case 'l':
/* long 和int 在Arm中都是一个字,执行case 'd': 的代码 */
case 'd':
{
n = va_arg(args, int);
str += (ltoa(n, 10, str)-1);
break ;
}
case 'u':
{
ul = va_arg(args, unsigned int);
str += (ultoa(ul, 10, str)-1);
break ;
}
case 'o':
{
ul = va_arg(args, unsigned int);
str += (ultoa(ul, 8, str)-1);
break ;
}
case 'x':
{
ul = va_arg(args, unsigned int);
str += (ultoa(ul, 16, str)-1);
break ;
}
case 'b':
{
ul = va_arg(args, unsigned int);
str += (ultoa(ul, 2, str)-1);
break ;
}
case 'f':
{
f = va_arg(args, double);
str += (ftoa(f, 6, str)-1);
break ;
}
case 'p':
{
ul = (unsigned int)va_arg(args, void *);
str +=(ultoa(ul, 16, str) - 1);
break;
}
default:
{
if (*fmt)
{
*str++ = *fmt;
}
else
{
--fmt;
}
break;
}
}
}
*str++ = '\0';
return (str-buf);
}
/*********************************************************************
*函 数 名:print_f
*描 述:格式化串行输出函数
*输入参数:fmt:参数类型格式控制串
* 可变的参数列表
*输出参数:无
*返 回 值:格式化输出字符数
*注 意:用户任务若使用该函数需考虑栈的大小是否足够!
* 该函数内部在运行时它将在栈中分配一定大小的临时缓冲区
* 另外vs_printf函数调用的数值转化ASCII码函数也要一定的栈缓冲区,
* 这些在新建任务时必须特别注意!!!
**********************************************************************/
unsigned int print_f(const char *fmt, ...)
{
va_list args;
char buf[256];
unsigned int i;
va_start(args, fmt);
i = vs_printf(buf, fmt, args);
va_end(args);
UART0_puts(buf);
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -