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

📄 printf.c

📁 在三星的S3C44B0X上移植的uCOSII2.80的源程序
💻 C
字号:
/*
*********************************************************************************************************
* 文件: Printf.C.
* 描述: 串口输出函数.
* 编写: 深思 (001-12345@sohu.com).
*********************************************************************************************************
*/
#include "headers.h"
#include "uc_os.h"
#include <stdarg.h>
#include <stdio.h>

void Printf (const char *format, ...);
void PrintS (char *Str);
void PrintC (char Ch);
void PrintI (INT32U Data);

void Wr_Uart0_Buf (INT8U data);
void StartSend (void);

/*
********************************************************************************************************
* 函数: void Printf (const char *format, ...).
* 描述: 非规定参数输出函数, 与系统的 printf 相应.
********************************************************************************************************
*/
void Printf (const char *format, ...)
{
#define MAX_TBUF	100                             // 注意: 只允许接收改大小的字符串.
 char    tbuf[MAX_TBUF] = {0, };
 va_list v_list;
 char    *ptr;
 INT8U   err;

    OSSemPend (Uart0.Sem, 0, &err);

	va_start(v_list, format);                       // Initialize variable arguments. 
	vsprintf(tbuf, format, v_list ); 
	va_end(v_list);

	ptr= tbuf;
	while(*ptr !=  '\0') {
		Wr_Uart0_Buf(*ptr++);
	}

    StartSend ();

    OSSemPost (Uart0.Sem);

#undef MAX_TBUF
}

/*
********************************************************************************************************
* 函数: void PrintS (char *Str).
* 描述: 输出字符串.
********************************************************************************************************
*/
void PrintS (char *Str)
{
 INT8U   err;

    OSSemPend (Uart0.Sem, 0, &err);

    while (*Str != '\0') {
        Wr_Uart0_Buf (*Str++);
    }

    Wr_Uart0_Buf ('\0');
    StartSend ();

    OSSemPost (Uart0.Sem);
}

/*
********************************************************************************************************
* 函数: void PrintC (char Ch).
* 描述: 输出字符.
********************************************************************************************************
*/
void PrintC (char Ch)
{
 INT8U   err;

    OSSemPend (Uart0.Sem, 0, &err);

    Wr_Uart0_Buf (Ch);
    StartSend ();

    OSSemPost (Uart0.Sem);
}

/*
********************************************************************************************************
* 函数: void PrintI (INT32U Data).
* 描述: 输出 32 位整型数据.
********************************************************************************************************
*/
void PrintI (INT32U Data)
{
 INT8U   err;

    OSSemPend (Uart0.Sem, 0, &err);

    Wr_Uart0_Buf ((INT8U)(Data>>16));
    Wr_Uart0_Buf ((INT8U)Data);
    StartSend ();

    OSSemPost (Uart0.Sem);
}

/*
********************************************************************************************************
* 函数: void StartSend (void).
* 描述: 判断是否启动发送.
********************************************************************************************************
*/
void StartSend (void)
{
    if (UTRSTAT0 & (1<<2)) {                        // 启动发送.
        if (Uart0.Rd != Uart0.Wr) {
            UTXH0 = Uart0.Buffer[Uart0.Rd++];
            if (Uart0.Rd >= Uart0BufSize)
                Uart0.Rd = 0x00;
        }
    }
}

/*
********************************************************************************************************
* 函数: void Wr_Uart0_Buf (INT8U data).
* 描述: 将数据写入发送缓冲区.
********************************************************************************************************
*/
void Wr_Uart0_Buf (INT8U data)
{
    Uart0.Buffer[Uart0.Wr++] = data;
    if (Uart0.Wr >= Uart0BufSize) {
        Uart0.Wr = 0x00;
    }
}

/*
********************************************************************************************************
* End.
********************************************************************************************************
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -