基于哈希的嵌入式应用程序记录器

时间:2013-07-21 14:30:31

标签: c logging hash embedded

目前我正在向UART发送我想要记录的字符串,并在任何终端的主机上读取它。

为了减少记录时间并希望图像大小(我的闪存很小),我发现嵌入式系统中的字符串未被使用,那么为什么要将它们存储在闪存中?

我想实现一个服务器,我可以发送任何字符串的哈希键(例如 - 它的ROM地址),字符串将输出到文件或屏幕。

我的问题是:

  1. 如何从图像文件中创建key2string转换器(操作系统是CMX,但一般可以回答)
  2. 是否有一种推荐的生成图像的方法,它会知道字符串地址但会将它们从ROM中排除?
  3. 是否有已知的通用(开源或其他)实现了类似的记录器?
  4. 由于

2 个答案:

答案 0 :(得分:2)

而不是持有硬编码的字符串,然后尝试散列答案并通过UART发送,然后以某种方式从结果图像中删除字符串,我建议如下。

只需发送错误代码的索引即可。 PC端可以查找该索引并确定该条件的字符串。如果您希望设备代码更清晰,则索引可以是枚举。

例如:

enum errorStrings
{
   ES_valueOutOfLimits = 1,
   ES_wowItsGettingWarm = 2,
   ES_randomError = 3,
   ES_passwordFailure = 4
};

因此,如果您通过printf向UART发送数据,则可以执行以下操作:

printf("%d\n",(int)ES_wowItsGettingWarm);

然后你的PC软件只需将UART上的“2”解码回一个有用的字符串“哇它变热了。”

这使固件保持较小,但您需要手动保存包含枚举的文件和包含字符串的文件。

答案 1 :(得分:0)

我的解决方案是发送文件名和行(应该是14-20字节)并在服务器端有一个源解析器,它将生成实际文本的映射。这样,实际代码将不包含“格式”字符串,但每个文件只包含一个“filename”字符串。此外,文件名可以很容易地用枚举替换(不像替换代码中的每个字符串),以减少COMM吞吐量。

我希望示例psaudo代码有助于澄清这个想法:

/* target code */
#define PRINT(format,...) send(__FILE__,__LINE__,__VA_ARGS__)
...

/* host code (c++) */
void PrintComm(istream& in)
{
    string fileName;
    int    line,nParams;
    int*   params;
    in>>fileName>>line>>nParams;
    if (nParams>0)
    {
        params = new int[nParams];
        for (int i=0; i<nParams; ++i)
            in>>params[i];
    }
    const char* format = FindFormat(fileName,line);
    ...
    delete[] params;
}