我试图在加载时生成一个递增值,以用于使用唯一的代码值“序列化” PCB。不是ld或预处理器命令方面的专家,请寻求帮助。
该值将在加载代码的每个板的唯一ID中使用,并且还将用作现场板的计数器。
我对如何实现此目标没有先入为主的想法,因此,任何可行的答案都可以使我入门,包括预处理器宏就可以了。在过去,我记得在链接器文件中添加几行代码即可完成此操作,但是我无法在任何地方(包括大脑的记忆细胞)恢复该信息。
答案越简单越好。
答案 0 :(得分:0)
我对这个问题的解决方法非常简单。
包含的二进制文件
const char *serial = "XY-00000";
然后我写了一个简短的程序,归结为:
char uniqueserial [8];
/* Generate serial - this was an SQL call to the manufacturing DB */
char *array;
/* Read binary into array */
memcpy(memmem(array, "XY-00000",8), uniqueserial,8);
/* Write array to temp bin file for flashing */
取决于串行模板字符串在二进制文件中是否唯一。使用字符串命令进行检查。由于品味,我禁用了受crc保护的目标文件。我喜欢我的嵌入式二进制文件是确切的内存转储。
答案 1 :(得分:0)
链接器的位置不正确有两个原因:
最好的方法是在加载时使用序列号修补可执行文件。
选择一个数据模式作为令牌,以使用设备ID初始化变量(这种模式很难在程序二进制文件中的其他地方发生),并将序列号变量初始化为该数据模式(如果您以静态方式初始化数组变量,则更好)或类似的东西)
制作一个要在每次下载到设备上执行的程序,以在可执行文件中搜索模式,然后再将二进制程序加载到设备中,并将要编程的正确值写入设备中(请注意,您正在修补二进制文件,因此您不能考虑可变长度的字符串等,这样会浪费链接程序的所有工作)
修补二进制可执行文件后,您可以将其下载到设备中。
另一种解决方案是在链接程序脚本中为所有此类信息保留一个固定区域。然后,将所有设备信息变量放在此处。然后获得各个变量在rom中的确切位置,并在加载的图像中包含正确的数据。在这种情况下,链接器是您的朋友,在设备的rom中保留一些固定的段,用于存储设备的各个数据(您可以在其中放置mac地址,序列号,默认配置等)