目前我正在向UART发送我想要记录的字符串,并在任何终端的主机上读取它。
为了减少记录时间并希望图像大小(我的闪存很小),我发现嵌入式系统中的字符串未被使用,那么为什么要将它们存储在闪存中?
我想实现一个服务器,我可以发送任何字符串的哈希键(例如 - 它的ROM地址),字符串将输出到文件或屏幕。
我的问题是:
由于
答案 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;
}