保存最近的调试信息的历史记录

ZDNet软件频道 时间:2003-10-27 作者:ZDNet China |  我要评论()
本文关键词:embedded
在很多情况下,保存一个最近的调试信息是非常有好处的。尤其是对于跟踪导致系统崩溃和软件冲突的事件,这一功能显得特别的方便。
本文译自Builder.com,未经许可请勿转载在很多情况下,保存一个最近的调试信息是非常有好处的。尤其是对于跟踪导致系统崩溃和软件冲突的事件,这一功能显得特别的方便。

有时候,通过一个串行通讯口发送调试信息,并在一个终端模拟程序中捕捉调试信息,这一过程已经足够。然而,在很多情况下却产生以下的问题:

  • 串行口通讯可以降低嵌入式系统的速度,并导致对时间敏感的错误产生。
  • 让你的嵌入式装置通过一根调试电缆永久地与远程PC连接也是不实际的,尤其是你在一个站点之外的系统调试。

在这种情况下,考虑使用一个循环的RAM缓冲器来记录最近的调试信息,并将它们在错误产生之后存储起来。这将会给你提供非常有用的信息列表。

执行一:在一个循环缓冲器中捕捉字符

一个简单的执行能够从printf(),或者类似的调试函数输出字符到一个循环的字体缓冲器,而不是直接地将字符发送到串行调试接口。这一方法通常用于捕捉调试文本中最近的字符,以下是这方面的范例代码。

/**************************************************************/
char Buffer[1024];    /* character buffer */
intIRead, IWrite;    /* read/write index into buffer */

/* Macro to increment circular buffer index. Uses fast non-modulo arithmetic
 * (no division) */


#define inc(i) ((i) = ((i) < sizeof(Buffer)-1) ? ((i)+1) : 0)

/* Function to store characters from printf() in fast circular RAM
 * buffer instead of sending to serial port.
 * Note: Rename this to work with your implementation of printf()*/


void put_ch(char ch)
{
    Buffer[IWrite] = ch;
    inc(IWrite);
    if (IRead == IWrite) {
        inc(IRead);
    }
}

/* Dump the most recent characters to serial port (or other device).
 * Typically called after system crash or other software problem. */


void LogDump(void)
{
    while (IRead != IWrite) {
        putserial(Buffer[IRead]);
        inc(IRead);
    }
}

虽然很简单实用,但这一方法也包含着几个潜在的致命缺点。这些缺点包括:

  • 在一个多线程环境中,你将需要使用一个相互排除的方法(比如信号)实时监测来自多线程的即时访问。
  • 对于调试关键时间的操作,即使一个高水平的printf()函数也显得速度太慢,虽然写入循环RAM缓冲器比较快。
  • 中断服务程序(ISRs)通常是很多错误的根源。并且,很多环境不允许使用printf()函数或者相互排除方法来调用ISRs,这会使这一方法不相互匹配。
  • 这一简单方法不支持信息时间标志,所以你无法知道调试事件发生的位置。

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134