位置:51电子网 » 技术资料 » 其它综合

ROM版本下系统调试信息的一种显示方法

发布时间:2007/8/28 0:00:00 访问次数:529

    摘要:提出在目标系统脱离开发系统运行时,如何通过串口在Windows的超级终端软件中显示调试信息的一个具体方法。该方法有助于改进调试质量、缩短调试周期。

    关键词:脱机调试 超级终端 可变参数函数 输出函数

1 ROM版本目标系统的调试问题

一般的目标系统在开发工具环境下的调试并不困难,但最终系统必须脱离开发工具独立运行,即使在开发工具环境下完全正常的系统,ROM版本也往往会出现各种问题。原因有两人:一是开发工具硬件环境和最终的目标硬件环境不完全相同;二是外部因素不同,实验室中无法模拟现场的很多外部条件。因此,在脱离开发工具后的现场运行中,也能进行调试,这在产品开发的初期是十分重要的。对于硬件的调试,可以使用示波器等仪器;对于软件的调试,一般方法则是显示软件运行中的各种信息(如变量)。

    我们知道,C语言中的“printf()”函数是学习C语言的人最了解和熟悉的一个函数。很多C语言教材一开始就以显示“hello word”字符串来描述C语言的基本特片,其中唯一的语句就是调用“printf ()”函数。虽然该函数可以在屏幕上输出信息,但一般的用户软件中只在调试时用它来显示某些中间变量的结果,一旦程序调试完成,就将其删除了,真正的应用信息(如菜单字符等)显示往往其他的输出函数,如puts(),cputs()等。实际上,在C语言编写的第一个软件-UNIX操作系统中,该函数也是用于输出调试信息或系统错误提示信息的。对于使用和学习C语言的程序员来说,printf()由于可以同时输出不同类型的数据,因此,它的使用是软件调试的重要手段之一。

在TURBO C2.0编译器中,printf()函数的实现依赖于操作系统。在嵌入式系统中,往往没有操作系统或者操作系统不提供这个功能,也可能没有显示输出部件,或显示设备的空间有限,只能用于显示应用信息。因此,必须用其他的方法来解决调试信息的输出问题。最常用的方法是通过目标系统的一个串口将信息发送给PC机来显示,PC机上可以使用Windows的“超级终端”软件接受和显示信息,如图1所示。

这种系统的硬件很简单,我们只说明软件的实现方法。为此,我们必须设计专用的、可以显示各种数据类型的printf()函数,以达到从串口或其他途径输出信息的目的。在一些C开发工具(如C51)中,系统提供了printf()库函数,但没有提供源代码[1],LINUX和UNIX的源代码中虽然也包含printf()的函数源代码,但过于复杂[2,3]。和一般的C函数不同,printf()函数的参数数量和类型是可变的,这是编写该函数的难点。要解决这个难是,必须先了解C函数参数传递的原理。

2 C函数的参数传递原理

在大部分情况下,C语言是通过堆栈存储器来传递参数(也有例外,C51的小模式则通过寄存器传递参数)。对于非指针类型,传递的不是原来类型的数据,而是对参数进行了类型转换,如字符类型(char)变成整型(int)拷贝到堆栈中、浮点类型(float)变成双精度类型(double),如表1所列。表1中未列出的,则没有转换[4]。

表1 

调用类型 转换类型 字节数

    摘要:提出在目标系统脱离开发系统运行时,如何通过串口在Windows的超级终端软件中显示调试信息的一个具体方法。该方法有助于改进调试质量、缩短调试周期。

    关键词:脱机调试 超级终端 可变参数函数 输出函数

1 ROM版本目标系统的调试问题

一般的目标系统在开发工具环境下的调试并不困难,但最终系统必须脱离开发工具独立运行,即使在开发工具环境下完全正常的系统,ROM版本也往往会出现各种问题。原因有两人:一是开发工具硬件环境和最终的目标硬件环境不完全相同;二是外部因素不同,实验室中无法模拟现场的很多外部条件。因此,在脱离开发工具后的现场运行中,也能进行调试,这在产品开发的初期是十分重要的。对于硬件的调试,可以使用示波器等仪器;对于软件的调试,一般方法则是显示软件运行中的各种信息(如变量)。

    我们知道,C语言中的“printf()”函数是学习C语言的人最了解和熟悉的一个函数。很多C语言教材一开始就以显示“hello word”字符串来描述C语言的基本特片,其中唯一的语句就是调用“printf ()”函数。虽然该函数可以在屏幕上输出信息,但一般的用户软件中只在调试时用它来显示某些中间变量的结果,一旦程序调试完成,就将其删除了,真正的应用信息(如菜单字符等)显示往往其他的输出函数,如puts(),cputs()等。实际上,在C语言编写的第一个软件-UNIX操作系统中,该函数也是用于输出调试信息或系统错误提示信息的。对于使用和学习C语言的程序员来说,printf()由于可以同时输出不同类型的数据,因此,它的使用是软件调试的重要手段之一。

在TURBO C2.0编译器中,printf()函数的实现依赖于操作系统。在嵌入式系统中,往往没有操作系统或者操作系统不提供这个功能,也可能没有显示输出部件,或显示设备的空间有限,只能用于显示应用信息。因此,必须用其他的方法来解决调试信息的输出问题。最常用的方法是通过目标系统的一个串口将信息发送给PC机来显示,PC机上可以使用Windows的“超级终端”软件接受和显示信息,如图1所示。

这种系统的硬件很简单,我们只说明软件的实现方法。为此,我们必须设计专用的、可以显示各种数据类型的printf()函数,以达到从串口或其他途径输出信息的目的。在一些C开发工具(如C51)中,系统提供了printf()库函数,但没有提供源代码[1],LINUX和UNIX的源代码中虽然也包含printf()的函数源代码,但过于复杂[2,3]。和一般的C函数不同,printf()函数的参数数量和类型是可变的,这是编写该函数的难点。要解决这个难是,必须先了解C函数参数传递的原理。

2 C函数的参数传递原理

在大部分情况下,C语言是通过堆栈存储器来传递参数(也有例外,C51的小模式则通过寄存器传递参数)。对于非指针类型,传递的不是原来类型的数据,而是对参数进行了类型转换,如字符类型(char)变成整型(int)拷贝到堆栈中、浮点类型(float)变成双精度类型(double),如表1所列。表1中未列出的,则没有转换[4]。

表1 

调用类型 转换类型 字节数
相关IC型号
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!