系统调试信息的显示方法
实现
现在,可以编写自己的printf()函数了。以下给出TC20编译环境下的具体实现代码,在其他环境下,可以根据该原理进行移植。也可以按位显示二进制数。对于其他类型,读者可以根据需要增删。
在实际应用中,可以修改其中的putchar()函数,将字符发到串口,就可以达到上述目的了。这里我们编写的函数还增加了数字的二进制显示,这对于很多位域应用是很有用处的。
/*printf()函数的实现代码,为和库函数区别,特在各函数前增加前缀“my”*/
void myprintf(char *fmt,…)
{
void *p;
char ch;
p=fmt;p=(char**)p+1;/*指向堆栈中的下一个参数*/
while(1){
while((ch=*fmt++)!='%'{/*读入格式字符串*/
if(ch= ='0')return;
putchar(ch);
};
ch=*fmt++;
switch(ch){ /*格式字符分析*/
/*因为字符参数传递时也转换成整形参数传递,故同样处理*/
case 'c':
case'd':
case'x':
case'0':
case'b':
if(ch= ='c')myputchar(*(int *)p));
if(ch= ='d')myprintn(*((int *)p),10);
if(ch= ='x')myprintn(*((int *)p),16);
if(ch= ='o')myprintn(*((int *)p),8);
if(ch= ='b')myprintn(*((int *)p),2);
p=(int)p+1; /*指针移动*/
break;
case's':
myputs(*((char **)p));
p=(char **)p+1; /*指针移动*/
break;
default;
};
}
}
void myputs(char str) /*显示一个字符*/
{
while((*str)!='0')myputchar('str++);
}
/*显示任意进制的数值,b为二、八、十、十六等进制数*/
void myprintn(int,n,int b)
{
if(b= =16){ myprintx(n); return; }
if(n0){ myputchar('-'); n=-n; };
if(n/b)
myprintn(n/b,b);
myputchar(n%b+'0');
}
void myprintx(int n) /*以十六进制显示1个数字*/
{
signed char i;
for(i=3;i>=0;i--)
if(((n》i*4)0x0f)>=10)
/*当10,11…时,显示'a','b',…'f',*/
myputchar(((n》i*4)0x0f)-10+'a');
else myputchar(((n》i*4)0x0f)+'0');
}
/*
*在很多嵌入式系统中,并不存在PC一样的标准显示设备,
*通过修改该函数,可以将字符“ch”发送到串口,或者目
*标系统中的LED、LCD等显示器件。这样,就可以在脱
*离开发系统情况下显示调试信息,从而调试目标系统的软
*件或硬件。
*/
void myputchar(int ch)
{
……;/*此函数可供修改,将字符“ch”送到SBUF或其他显示器件就可以了*/
}
4 超级终端软件的使用
超级终端,即计算机显示终端,是计算机系统的输入、输出设备。计算机显示终端伴随主机时代的集中处理模式而产生,并随着计算技术的发展而不断发展。迄今为止,计算技术经历了主机时代、PC时代和网络计算时代这三个发展时期,终端与计算技术发展的三个阶段相适应,应用也经历了字符哑终端、图形终端和网络终端这三个形态。超级终端是一个通用的串行交互软件,很多嵌入式应用的系统有与之交换的相应程序,通过这些程序,可以通过超级终端与嵌入式系统交互,使超级终端成为嵌入式系统的“显示器”。
打开Windows的“超级终端”软件,再打开“hypertrm”,新建一个终端会话。在该会话的“属性u35774设置u32456终端仿真”菜单下,将终端仿真类型设置为VT100[5];在“属性u35774设置u32456终端设置u23383字符集”菜单下设置字符集为“ASCII”;在“属性u36830连接到u37197配置u24120常规u26368最快速度”下设置通信波特率和目录系统一致,并将该对话框下“仅以该速度连接打开”设置选中;在“属性u36830连接到u37197配置u36830连接u36830连接首选项”下设置传送数据位数、校验方式。
超级终端的原理是将用户输入随时发向串口(采用TCP协议时是发往网口,这里只说串口的情况),但并不显示输入。它显示的是从串口接收到的字符。所以,嵌入式系统的相应程序应该完成的任务便是:
1、将自己的启动信息、过程信息主动发到运行有超级终端的主机;
2、将接收到的字符返回到主机,同时发送需要显示的字符(如命令的响应等)到主机。
在用超级终端显示时,唯一要求发送的数据必须以ASCII码形式发送(上述printf()函数就是如此)。如果要求交互式双向数据传送,请参考VT100文档[5]。对于字符和控制的说明,这里不再描述。
- 基于FPGA的DSP设计方法(08-26)
- 专家指导:Linux操作系统密码恢复方法(05-16)
- 基于多核DSP Bootload代码加载方法研究(01-16)
- 基于DSP 的大容量无线传输技术中高性能的启动方法(03-16)
- 多核调试新方法探讨(10-22)
- 有备无患Linux操作系统备份方法介绍(06-06)