Malloc,可变长度阵列还是静态阵列?

时间:2012-02-18 11:04:58

标签: c arrays embedded malloc

我正在为uC开发一个程序,它通过SPI读取一个40字节的位数组。这个40字节的数组是一个测试向量,与一个存储在SD卡上的“已知良好”测试向量进行比较。

为了找到异常/故障/错误,我将接收到的测试向量的每个字节与存储的数据进行异或。这会产生一个位数为1的故障位。我可以使用以下algorithm轻松找到这些'1的位置。

麻烦在于存储这些'1'的位置。目前,我正在使用可变长度阵列,但是在GCC4.2中对这些阵列的支持被打破了,因此我不确定它们在AVR-GCC中的可靠性。

我的下一个想法是使用malloc,但在嵌入式系统中通常不鼓励这样做。我应该只声明一个长度为320的unsigned char数组,并在找到一个位设置时存储一个'1'吗?示例:我在位数组中找到位4,8,10,42和250。然后我将相应的元素设置为'1',表示在这些位置检测到'1'。这将占用我的SRAM的320个字节。或者,我可以将数组声明为int并存储从数组顶部开始的实际位置。

为什么我需要设置位的位置? SD卡包含另一个文件,其中包含与位数组中的位置相对应的信息。因此,如果在位置24发现故障,程序可以去读取文件并显示有关它知道连接到位置24的所有信息。

注意:有些人可能想知道我是否需要立即读取整个测试向量。情况确实如此。

2 个答案:

答案 0 :(得分:3)

如果您知道存储的上限并且不繁琐,那么通常最好只创建一个固定大小的数组。

正如您所说,可变长度阵列支持在某些实现中是不稳定的,而在其他实现中完全不可用。并且malloc带来了额外的开销,并且可能会失败。

我会选择非可变长度的固定大小(static,我认为这是一个误导性术语,在这里使用)数组。


现在,关于你是否使用一个字符数组,其中每个值指定等效位是否错误,或者是一个整数数组,其中每个元素是坏位的顺序列表是另一回事。

首先,我尝试使用16位值来最小化第二种情况下的数据 - 无论是实现中的short还是int,我都不知道

但是,由于您有320位,因此8位字符不适用于位位置,因此需要16位值。

因此,对于第二种情况,您需要使用640字节而不是320字节,这是最糟糕的情况,即样本中的每个位都是坏的。通过在此数组的未使用的插槽中存储-1值,您可以避免不需要错误计数。

所以选择确实是(例如,对于42和314的坏位位置):

BytePos  BadBitFlag    or:     BytePos  BadBitPosition
0..41    0                     0/1      42
42       1                     2/3      314
43..313  0                     4/5      -1
314      1                     :
315..319 0                     638/9    -1

这实际上取决于存储的限制。

无论选择哪种方法,都必须计算数据,因为您在第一个解决方案中选择了基于字符的“位”,这意味着需要从40位字节的位数组中扩展XOR结果到320字节的字节数组。

如果您要处理坏位列表,并且可以节省额外的存储空间,我会选择第二种解决方案。

如果您要么只是处理列表几次,或者内存非常紧张,请选择第一个解决方案。

答案 1 :(得分:2)

如果空间如此高,为什么要一次将整个数组转换为索引?当你需要查找偏移量时,我会坚持使用40字节的xor数组并使用你的bitshift算法循环它。