|
最近作一个项目,是基于ARM CPU + TI DSP的一个平台,由于DSP并不具备串口,只能通过仿真器调试DSP程序,非常麻烦,所以想到借助CPU的串口输出能力来完成DSP的调试信息打印,通过这种方式输出调试信息速度更快,对DSP系统影响更小,更有利于调试。为了能够方便编程,所以这个输出功能使用了printf的形式,具体就是通过了C的变长参数来实现这个功能。
下边是源代码 #include <stdio.h> #include <stdlib.h> #include <stdarg.h>
void vaprintf(const char * format, ...) { va_list arg_ptr; char tmpchar; int tmpint; float tmpfloat; char* tmpstr; int len; int i,j; char tmp[50] = {0}; char result[100] = {0}; int loc = 0; len = strlen(format); va_start(arg_ptr, format);
for(i=0;i<len;) { if(format[i] == '%') { switch(format[i+1]) { case 'd': case 'i': tmpint = va_arg(arg_ptr, int); sprintf(tmp, "%d", tmpint); strcat(result, tmp); break; case 'u': tmpint = va_arg(arg_ptr, int); sprintf(tmp, "%u", tmpint); strcat(result, tmp); break; case 'x': tmpint = va_arg(arg_ptr, int); sprintf(tmp, "0x%x", tmpint); strcat(result, tmp); break; case 'X': tmpint = va_arg(arg_ptr, int); sprintf(tmp, "0X%X", tmpint); strcat(result, tmp); break; case 'c': tmpchar = va_arg(arg_ptr, int); sprintf(tmp, "%c", tmpchar); strcat(result, tmp); break; case 's': tmpstr = (char *)va_arg(arg_ptr, char *); strcat(result, tmpstr); break; case 'f': tmpfloat = va_arg(arg_ptr, double); sprintf(tmp, "%.4f",tmpfloat); strcat(result, tmp); break; default: sprintf(tmp, "[error format: %%%c]",format[i+1]); strcat(result, tmp); break; } i += 2; loc = strlen(result); } else { result[loc] = format[i]; i ++; loc ++; } } va_end(arg_ptr); //printf("vaprintf::\t%s", result); /* 此处代码将result的数据传送给CPU,CPU再负责将接收到的数据输出到串口即可 */ }
|