有时候,通过一个串行通讯口发送调试信息,并在一个终端模拟程序中捕捉调试信息,这一过程已经足够。然而,在很多情况下却产生以下的问题:
在这种情况下,考虑使用一个循环的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);
}
}
虽然很简单实用,但这一方法也包含着几个潜在的致命缺点。这些缺点包括: