嵌入式开发中logout两种实现方式与原理
2018-03-27 15:04
246 查看
1)如果没有logout头文件,利用#include <stdio.h>库中的printf函数实现
so文件需添加
#include <stdio.h>
然后定义logout函数如下:
#ifndef __LogOut__
#define LogOut(format,...) printf(format, ##__VA_ARGS__)
#endif
printf函数是在windows平台下的库函数,如果要在嵌入式设备中printf是通过串口的方 式,需要重写fputc()和fgetc()函数:
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
2)添加logout.h文件,直接编辑好串口函数
宏定义logout函数为uart_printf
void UART1_printf(char * format, ...);
#define TRACE_FUNC UART1_printf("[%s-%d]->%s Begin\r\n",__MODULE__,__LINE__,__func__)
#define TRACE_FUNC_END UART1_printf("[%s-%d]->%s End\r\n",__MODULE__,__LINE__,__func__)
#define TRACE_LINE UART1_printf("[%s]->%d\r\n",__func__,__LINE__)
#define LogOut UART1_printf
#define TRACE_FUNC UART1_printf("[%s-%d]->%s Begin\r\n",__MODULE__,__LINE__,__func__)
#define TRACE_FUNC_END UART1_printf("[%s-%d]->%s End\r\n",__MODULE__,__LINE__,__func__)
#define TRACE_LINE UART1_printf("[%s]->%d\r\n",__func__,__LINE__)
#define LogOut UART1_printf
//并写好串口函数 uart1_printf,根据需要写对应的串口号
void UART1_printf(char * format, ...)
{
char * s = 0;
int d = 0, i = 0;
unsigned char ch[sizeof(int) * 2 + 2] = {0};
uart_va_list ap = 0;
uart_va_start(ap, format);
while (* format)
{
if (* format != '%')
{
UART_SEND_BYTE(format++);
continue;
}
switch (*(++format))
{
case 's':
case 'S':
s = uart_va_arg(ap, char *);
for ( ; *s; s++)
{
UART_SEND_BYTE(s);
}
break;
case 'c':
case 'C':
UART_SEND_BYTE(uart_va_arg(ap, char));
break;
case 'x':
case 'X':
d = uart_va_arg(ap, int);
for(i = 0; i < sizeof(int) * 2; i++)
{
ch[i] = (unsigned char)(d&0x0f) + '0';
if(ch[i] > '9')
ch[i] += 7;
d >>= 4;
}
ch[i++] = 'x';
ch[i] = '0';
for(i = sizeof(int) * 2 + 2; i > 0; i--)
UART_SEND_BYTE(&ch[i -1]);
break;
case 'd':
case 'D':
d = uart_va_arg(ap, int);
i=0;
//ch[i++] = d/10000+'0';
ch[i++] = (d%10000)/1000+'0';
ch[i++] = (d%1000)/100+'0';
ch[i++] = (d%100)/10+'0';
ch[i++] = (d%10)+'0';
for(d=0; d<i; d++)
UART_SEND_BYTE(&ch[d]);
break;
default:
UART_SEND_BYTE(format);
break;
}
format++;
}
uart_va_end(ap);
}
1)或者2)做好后就可以调用LogOut("[%s->%s=%d]\r\n",__MODULE__,__func__,__LINE__);来看程序运行在哪里了!
so文件需添加
#include <stdio.h>
然后定义logout函数如下:
#ifndef __LogOut__
#define LogOut(format,...) printf(format, ##__VA_ARGS__)
#endif
printf函数是在windows平台下的库函数,如果要在嵌入式设备中printf是通过串口的方 式,需要重写fputc()和fgetc()函数:
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
2)添加logout.h文件,直接编辑好串口函数
宏定义logout函数为uart_printf
void UART1_printf(char * format, ...);
#define TRACE_FUNC UART1_printf("[%s-%d]->%s Begin\r\n",__MODULE__,__LINE__,__func__)
#define TRACE_FUNC_END UART1_printf("[%s-%d]->%s End\r\n",__MODULE__,__LINE__,__func__)
#define TRACE_LINE UART1_printf("[%s]->%d\r\n",__func__,__LINE__)
#define LogOut UART1_printf
#define TRACE_FUNC UART1_printf("[%s-%d]->%s Begin\r\n",__MODULE__,__LINE__,__func__)
#define TRACE_FUNC_END UART1_printf("[%s-%d]->%s End\r\n",__MODULE__,__LINE__,__func__)
#define TRACE_LINE UART1_printf("[%s]->%d\r\n",__func__,__LINE__)
#define LogOut UART1_printf
//并写好串口函数 uart1_printf,根据需要写对应的串口号
void UART1_printf(char * format, ...)
{
char * s = 0;
int d = 0, i = 0;
unsigned char ch[sizeof(int) * 2 + 2] = {0};
uart_va_list ap = 0;
uart_va_start(ap, format);
while (* format)
{
if (* format != '%')
{
UART_SEND_BYTE(format++);
continue;
}
switch (*(++format))
{
case 's':
case 'S':
s = uart_va_arg(ap, char *);
for ( ; *s; s++)
{
UART_SEND_BYTE(s);
}
break;
case 'c':
case 'C':
UART_SEND_BYTE(uart_va_arg(ap, char));
break;
case 'x':
case 'X':
d = uart_va_arg(ap, int);
for(i = 0; i < sizeof(int) * 2; i++)
{
ch[i] = (unsigned char)(d&0x0f) + '0';
if(ch[i] > '9')
ch[i] += 7;
d >>= 4;
}
ch[i++] = 'x';
ch[i] = '0';
for(i = sizeof(int) * 2 + 2; i > 0; i--)
UART_SEND_BYTE(&ch[i -1]);
break;
case 'd':
case 'D':
d = uart_va_arg(ap, int);
i=0;
//ch[i++] = d/10000+'0';
ch[i++] = (d%10000)/1000+'0';
ch[i++] = (d%1000)/100+'0';
ch[i++] = (d%100)/10+'0';
ch[i++] = (d%10)+'0';
for(d=0; d<i; d++)
UART_SEND_BYTE(&ch[d]);
break;
default:
UART_SEND_BYTE(format);
break;
}
format++;
}
uart_va_end(ap);
}
1)或者2)做好后就可以调用LogOut("[%s->%s=%d]\r\n",__MODULE__,__func__,__LINE__);来看程序运行在哪里了!
相关文章推荐
- (七)android开发中两种方式监听短信的原理和实现
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- FORM开发两种方式实现动态LIST
- 【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果
- ArcGlobe组件开发之动画1——动画的两种实现方式
- 【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果
- 【Android应用开发】-(19)Android 串口编程原理和实现方式
- 【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果
- 【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果
- FORM开发两种方式实现动态LIST
- 【Android开发】图形图像处理技术-实现Android动画的两种方式
- AsyncTask和Handler两种异步方式实现原理和优缺点比较
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- SpringJDBC调用存储过程的两种方式(先记录下来,日后在细细研究实现原理)
- Android开发教程:底部Tab的两种实现方式
- ArcEngine 3D开发之动画1——动画的两种实现方式
- 嵌入式Linux网络驱动程序的开发及实现原理
- ArcGlobe三维开发之七————动画的两种实现方式
- Java第七课 Java的多线程程序进程和线程的概念,实现多线程的两种方式,线程同步的原理,线程的死锁,运用wait和notify来实现producer - consumer关系,线程终止的两种情况。