3

我正在开发一个可以测试大量电线(最多 360 根)的嵌入式系统——本质上是一个连续性检查系统。该系统通过在测试向量中计时并从另一端读取输出来工作。然后将输出与存储的结果(将在 SD 卡上)进行比较,该结果告诉输出应该是什么。测试向量只是一个行走的向量,因此无需将它们存储在任何地方。该过程将如下所示:

  1. 打卡测试向量(行走的)
  2. 读入输出测试向量。
  3. 从 SD 卡读取相应的输出测试向量,它告诉输出向量应该是什么。
  4. 比较第 2 步和第 3 步的测试向量。
  5. 在单独的数组中记下错误/故障。
  6. 除非检查了所有电线,否则继续返回步骤 1。
  7. 将错误/故障输出到 LCD。

我的硬件由一个大的移位寄存器组成,它与 AVR 微控制器同步。对于每个测试向量(也将是 360 位),我需要读取 360 位。因此,对于 360 根线,数据总量将是 360*360 = 16kB 左右。我已经知道我不能一次性做到这一点(即读取整个数据然后比较),所以它必须是一个测试向量一个测试向量。

由于没有可以容纳如此大数字的固有类型,我打算使用长度为 360 位的位数组。现在,我的问题是,我应该如何将这个位数组存储在 txt 文件中?

一种方法是存储原始值,即在每一行存储我从移位寄存器读取的原始二进制数据。因此,对于 8 根线,它将是 0b10011010。但这对于多达 360 根线来说可能会变得很丑 - 每条线将包含 360 个字节。

另一种方法是存储十六进制值 - 这将只是 8 位的两个字符(以上为 9A)和 360 位的大约 90 个字符。但是,这将需要我逐行读取文本,并以某种方式将十六进制值转换为位数组中表示的值。

那么对于此类问题的最佳解决方案是什么?我需要完全“确定性”的解决方案——我不能调用 malloc 之类的。从我读过的内容来看,它们在嵌入式系统中有点禁忌。

概括

我需要存储任何传统变量类型都无法表示的大值。目前我打算将这些值存储在位数组中。将这些值存储在 SD 卡上的文本文件中的最佳方法是什么?

4

1 回答 1

6

这些不是整数值,而是位图;它们没有算术意义。您的建议只是一个长度为 360/8 的字节数组,根本与“大整数”无关。然而,一些更合适的数据结构或表示可能是可能的。

如果测试向量是 360 中的单个位,则为每个向量存储 360 位既低效又没有必要,0 到 359 的值足以明确定义每个向量。如果正确的输出也是单个位,那么也可以将其存储为位索引,如果不是,则可以将其存储为应设置的每个位的索引列表,其中一些标记值 >=360 或 < 0 表示列表结束。在大多数向量包含少于 22 个设置位的情况下,此结构将比存储 45 字节数组更有效。

根据任何位索引值,您可以通过以下方式确定单条线的地址和掩码:

byte_address = base_address + bit_index / 8 ;
bit_mask = 0x01 << (bit_index % 8) ;

您可以迭代地测试 360 位中的每一个,也可以从位列表中动态生成 360 位向量。

我认为不需要动态内存分配,但在嵌入式系统中是否可取在很大程度上取决于应用程序和目标资源。典型的 AVR 系统内存很少,动态内存分配会带来堆管理和块对齐的开销,您可能无法承受。动态内存分配不适用于需要硬实时确定性时序的情况。在所有情况下,您都应该有一个明确定义的策略或架构来避免内存泄漏问题(重复分配永远不会被释放的内存)。

于 2011-12-26T11:05:27.573 回答