⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 print_f.c

📁 Rabbit 32Bit RTOS源代码
💻 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 + -