目前,在我的嵌入式系统(用 C 语言编码)上,我有很多调试辅助打印语句,当远程工具连接到可以向 PC 显示消息的系统时,这些语句会被执行。这些有助于了解一般系统状态,但由于消息通过缓慢的 CAN 总线,我相信它们可能会堵塞管道并导致其他问题,试图记录任何有用的数据。
它的基本要点是:
它就像一个 printf,但最终以一种特殊的消息格式通过 CAN 总线从嵌入式系统发送到工具。为此,我可以用特殊的调试消息替换这个通用的打印消息,这些调试消息向它发送一个唯一的 ID,后跟只有可变参数(即 argc/argv)。我想知道这是否是正确的方法,或者是否有我错过的灵丹妙药,或者我没有想到的其他东西。
所以,我发现这个问题一开始就适合我的目的:
但我没有让它像 printf 一样简单的约束。我可以在远程工具端维护一个字符串表(因为它是 Windows 可执行文件,因此不受代码大小限制)。我是该代码的唯一负责人,并且更愿意在调试时尝试减轻代码大小以及 CAN 总线流量。
我目前的想法是这样的:
printf("[%d] User command: answer call\n", (int)job);
这变成
debug(dbgUSER_COMMAND_ANSWER_CALL, job);
dbgUSER_COMMAND_ANSWER_CALL
作为可能的调试消息枚举的一部分
远程端有类似的东西
switch(messagetype)
{
case dbgUSER_COMMAND_ANSWER_CALL:
/* retrieve an integer from the data portion of the message and put it into a variable */
printf("[%d] User command: answer call\n", (int)avariable);
}
这相对简单,如果我所有的消息都采用相同的格式,那就太好了。然而,棘手的地方是我的一些语句必须打印非恒定的字符串(例如设备的名称)。
printf("[%d] %02X:%02X:%02X:%02X:%02X:%02X (%s)\n", /* a bunch of parameters here */);
那么,我是否应该使调试消息的内容为 1)消息类型,2)第一个参数的长度,3)参数,4)下一个参数的长度,5)参数,等等和以此类推
还是我忽略了一些更明显或更容易的事情?
谢谢