欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ZStack-CC2530-2.5.1a开发(五)printf()函数移植学习

程序员文章站 2022-06-09 14:39:20
...

ZStack版本:ZStack-CC2530-2.5.1a
下载和调试器:SmartRF04EB
IDE开发软件:IAR Embedded Workbench IDE - 8051 10.20.1
开发平台:基于TI-CC2530的任意厂家的
一、printf函数简介
printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。printf()函数的挪用式样为: printf("<式样化字符串>",<参数表>);
一般程序开发都会使用该函数将调试信息打印到标准输出设备。
我们在上面几个工程中,标准输出设备是UART0,我们使用了uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len)函数来打印调试信息,该函数需要3个参数,并且所能实现的输出功能有限。
printf的函数,功能非常丰富,用起来也非常方便!
于是便想到如果可以将printf( )函数移植到我们的Z-Stack协议栈中,一定会给我们带来极大的便利!
二、printf函数的移植
本移植文件,非本人编写,文件来在博文https://blog.csdn.net/m0_38064214/article/details/77351759。
在上节KEY移植工程中,继续添加printf相关文件。
2.1 添加user_printf.h文件
头文件的代码如下:

#ifndef USER_PRINTF_H
#define USER_PRINTF_H

int printf(const char *format, ...);
int sprintf(char *out, const char *format, ...);

#endif

2.2 添加user_printf.c文件
在左侧工程文件分支的App分支,添加user_printf.c文件,文件代码如下:

#include "stdarg.h"
#include "user_printf.h"
#include "hal_uart.h"

void putchar(char c);
void putchar(char c){
  HalUARTWrite(HAL_UART_PORT_0,(uint8*)&c,1);
}

static void printchar(char **str, int c)
{
	extern void putchar(char c);
	
	if (str) {
		**str = c;
		++(*str);
	}
	else (void)putchar((char)c);
}

#define PAD_RIGHT 1
#define PAD_ZERO 2

static int prints(char **out, const char *string, int width, int pad)
{
	register int pc = 0, padchar = ' ';

	if (width > 0) {
		register int len = 0;
		register const char *ptr;
		for (ptr = string; *ptr; ++ptr) ++len;
		if (len >= width) width = 0;
		else width -= len;
		if (pad & PAD_ZERO) padchar = '0';
	}
	if (!(pad & PAD_RIGHT)) {
		for ( ; width > 0; --width) {
			printchar (out, padchar);
			++pc;
		}
	}
	for ( ; *string ; ++string) {
		printchar (out, *string);
		++pc;
	}
	for ( ; width > 0; --width) {
		printchar (out, padchar);
		++pc;
	}

	return pc;
}

/* the following should be enough for 16 bit int */
#define PRINT_BUF_LEN 6

static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
{
	char print_buf[PRINT_BUF_LEN];
	register char *s;
	register int t, neg = 0, pc = 0;
	register unsigned int u = i;

	if (i == 0) {
		print_buf[0] = '0';
		print_buf[1] = '\0';
		return prints (out, print_buf, width, pad);
	}

	if (sg && b == 10 && i < 0) {
		neg = 1;
		u = -i;
	}

	s = print_buf + PRINT_BUF_LEN-1;
	*s = '\0';

	while (u) {
		t = u % b;
		if( t >= 10 )
			t += letbase - '0' - 10;
		*--s = t + '0';
		u /= b;
	}

	if (neg) {
		if( width && (pad & PAD_ZERO) ) {
			printchar (out, '-');
			++pc;
			--width;
		}
		else {
			*--s = '-';
		}
	}

	return pc + prints (out, s, width, pad);
}

static int print(char **out, const char *format, va_list args )
{
	register int width, pad;
	register int pc = 0;
	char scr[2];

	for (; *format != 0; ++format) {
		if (*format == '%') {
			++format;
			width = pad = 0;
			if (*format == '\0') break;
			if (*format == '%') goto out;
			if (*format == '-') {
				++format;
				pad = PAD_RIGHT;
			}
			while (*format == '0') {
				++format;
				pad |= PAD_ZERO;
			}
			for ( ; *format >= '0' && *format <= '9'; ++format) {
				width *= 10;
				width += *format - '0';
			}
			if( *format == 's' ) {
				register char *s = (char *)va_arg( args, int );
				pc += prints (out, s?s:"(null)", width, pad);
				continue;
			}
			if( *format == 'd' ) {
				pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a');
				continue;
			}
			if( *format == 'x' ) {
				pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a');
				continue;
			}
			if( *format == 'X' ) {
				pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A');
				continue;
			}
			if( *format == 'u' ) {
				pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a');
				continue;
			}
			if( *format == 'c' ) {
				/* char are converted to int then pushed on the stack */
				scr[0] = (char)va_arg( args, int );
				scr[1] = '\0';
				pc += prints (out, scr, width, pad);
				continue;
			}
		}
		else {
		out:
			printchar (out, *format);
			++pc;
		}
	}
	if (out) **out = '\0';
	va_end( args );
	return pc;
}

int printf(const char *format, ...)
{
        va_list args;
        
        va_start( args, format );
        return print( 0, format, args );
}

int sprintf(char *out, const char *format, ...)
{
        va_list args;
        
        va_start( args, format );
        return print( &out, format, args );
}

三、测试
在用户任务初始化函数void GenericApp_Init( uint8 task_id )中,添加如下代码:

MT_UartInit ();
  MT_UartRegisterTaskID(GenericApp_TaskID);
  HalUARTWrite(0,"hello world!\r\n",strlen("hello world!\r\n"));
  printf("hello ucnano!\r\n");
  printf("decimal:%03d,hex:%0x\r\n",255,255);

在该文件中添加printf的头文件,如下:

#include "user_printf.h"

编译下载,测试发现,打印成功。
ZStack-CC2530-2.5.1a开发(五)printf()函数移植学习

相关标签: Zigbee