我正在为 MCU(ARM Cortex-M3)开发固件。这些设备没有很多 RAM,所以无论如何你应该尝试将数据放在恒定内存(闪存)中。
问题是这样的:设备必须提供将由接口(MODBUS)读取的“寄存器”,因此操作员读取“地址”10并获得一些数字,他/她“写入”到“地址”101和它会导致一些动作等。将有数百个这样的“地址”并且访问它们会导致一些动作 - 例如,从 1-10 读取会导致传感器 1 到 10 上的温度测量,从 11-20 读取会导致读取在一些校准值中,写入这些地址会导致这些校准值存储在非易失性存储器等上 - 会有很多不同的功能(;
目前我已经实现了这样的:
有一个数组将地址绑定到回调函数以进行读写 - 一个回调函数可以绑定到多个地址(就像在上面的示例中,相同的回调将用于 1-10)
还有另一个数组将地址绑定到回调参数,有很多这样的数组,因为参数可能具有不同的类型/大小 - 在上面的示例中,将有一个结构数组 {int address; int sensor;} 用于 1-10 和结构数组 {int address; 内部标识;整数大小;最小; 最大整数;int 默认值;} 11-20。
每个回调都可以获取当前地址,在它的数组中找到相关的struct,并获取它需要的参数
这种方法有点重复,因为我必须多次声明地址 - 主数组中有一个条目 {1, readSensor, writeSensor},数组或传感器中有另一个地址为 1 的条目 {1, 0x5423} - 它只是没有'不符合 DRY 原则 (;
我考虑过的一个解决方案是一组多态对象,但是:
一个。虚函数导致对象被放置在 RAM 中(它不是 ROMable) 编辑:这似乎是由 GCC 错误引起的,在 4.6 constexpr 构造函数导致对象被放置在 RAM 中,但对于 4.7 它可以工作!
湾。这仍然有点麻烦,因为我必须在“某处”创建对象,并将其地址放入数组中(该数组实际上会放在闪存中)
我不能使用任何像向量这样的 STL 东西,因为它完全放在 RAM 中。
我考虑过一些模板魔法,但那是黑魔法(;
我也考虑过一个链表,但我只是看不到任何“好”的方式来以可读和连续的形式(如数组 [; )声明它,但我可能不熟悉一些好的解决方案这个问题。
最简单的解决方案是让回调接受另一个“void *”参数并将其转换为内部需要的任何内容,但这“不好”,还需要我创建带有“某处”参数的结构,然后将它们绑定到主大批。
任何关于优雅解决方案的想法?这必须在 ROM 中,会有数百个条目,每个条目都可以有多个不同的参数。