【发布时间】:2020-03-14 22:23:49
【问题描述】:
我正在为一些设备开发固件,每个设备都包含配置对象,这些配置对象的值可以被外部应用程序更改。这是此类对象的示例:
struct TObjectParams
{
ObjectId ID; // enum
void* Data; // pointer to configuration data
unsigned short Length; // size of data
TAccessControl AccessControl; //object access control
};
TObjectParams 的每个实例都是 const 且在运行时无法更改。
固件由多个模块组成,每个模块都有自己的配置对象。这样做是因为不同的设备可以包含不同的模块,并且强制每个设备包含所有关闭的对象将浪费资源。
我的目标是将所有对象分组到一个位置(数组或单个部分),并按ID 编号对它们进行排序(排序将显着降低从O(n) 到O(log n) 的搜索复杂性。
我的第一个想法是使用constexpr 注册对象(在对象的构造函数中),并在编译期间创建包含所有对象的constexpr 数组。但据我所知,只有当所有对象都在同一个翻译单元中时它才会起作用。
我的第二个想法是使用__attribute__((used, section("objects_section"))),现在我确保链接器不会删除任何已定义的对象并且它们都将位于同一部分。问题是排序。有没有办法强制链接器对这些对象进行排序?或者也许可以通过编辑.elf 文件?我知道我可以轻松转储objects_section,对其进行排序(通过自己的应用程序)并通过objcopy 进行更新,但它会完全弄乱调试体验和直接调用任何对象,因为更新部分内容不会更新符号地址(或者可能我错了)。
您知道如何更新部分内容和符号地址吗?或者,也许您知道解决此类问题的更好方法?我愿意接受所有建议。
【问题讨论】: