【发布时间】:2015-06-23 11:28:48
【问题描述】:
我有一个嵌入式系统(没有任何操作系统的 MCU),最终用户应该能够定义一年的系统级别(范围:0-100)。举个例子(时间×天矩阵):
| 1st Jan | 2nd Jan | 3rd Jan | .. | 31 Dec |
00:30 | 40 (%) | 40 | 45 | .. | 50 |
01:48 | 48 | 47 | 55 | .. | 33 |
02:26 | 64 | 64 | 60 | .. | 68 |
.. | .. | .. | .. | .. | .. |
22:15 | 79 | 82 | 89 | .. | 100 |
23:37 | 100 | 100 | 97 | .. | 100 |
我的想法是将数据存储为:time [in minutes], sysLevel
所以上表是这样的:
typedef struct{
uint16_t minute; //scale: 0 - 1440 min
uint8_t level; //scale 0 - 100 (%)
}timeLevel_t; //3 byte
然后将每一天存储为
timeLevel_t firstJan[24] = { .. }; //it stores level changes, the array length doesn't have to be 24
timeLevel_t secJan[17] = { .. };
timeLevel_t thirdJan[20] = { .. };
...
(我将从 CSV 文件中获取数据,现在在这个问题上考虑它可能超出主题)。
系统期望在最坏的情况下有一个每小时任务定义,因此 24 小时的 timeLevel_t(3 字节)定义将是每天 72 字节数据,那么 365 天的数据将是 26280 字节数据。
您是否会建议一种内存效率更高的算法来存储日历年的信息(程序将每年更新它,以便考虑到 2 月 29 日)?
另外?做一个二维数组,一维存储日期信息,另一维存储timeLevel_t会更好吗?
【问题讨论】:
-
在我看来,数据的来源(你提到了一个 CSV 文件)是系统设计中非常重要的一部分。我认为您需要更具体地了解数据的存储位置(闪存/内存/网络驱动器)以及数据的访问方式。
-
0-1440 需要 11 位,0-100 需要 7 位,因此每个条目需要 18 位。也许您可以通过将分辨率降低到 2 分钟和 2 个百分点来将其压缩到 16 位?您还可以将四个 18 位条目打包成 9 个字节,但这会使代码复杂一些。
-
我将信息存储在MCU的内存中(超过2.62 kB),并通过网络更新数据(可以逐块更新(月))。我认为理想的数据来源应该考虑到不失去问题的重点(每年一次的过程)。
-
我也在考虑挤压比特,但找不到一种聪明的方法。我想知道是否可以压缩(编码)数据并仅解压缩(解码)当天的数据并删除旧数据
-
如果您有 26280 字节的未压缩数据和 2620 字节用于存储该数据,则需要 10:1 的压缩比。或者换句话说,您需要能够以平均 2 位/事件对每个事件进行编码。这不太可能发生。如果 2.62kB 的内存也被用于代码和其他数据,那么情况会更糟。
标签: c algorithm memory-efficient