在嵌入式系统中存储大整数/值

时间:2011-12-26 03:37:44

标签: c embedded avr avr-gcc

我正在开发一种可以测试大量电线(最多360个)的嵌入式系统 - 实质上是一个连续性检查系统。系统通过在测试向量中计时并从另一端读取输出来工作。然后将输出与存储结果(将在SD卡上)进行比较,该结果告诉输出应该的输出。测试向量只是一个步行,所以没有必要将它们存储在任何地方。这个过程有点像:

  1. 退出测试矢量(走路的)
  2. 读入输出test-vector。
  3. 从SD卡读取相应的输出测试向量,告诉输出向量应该是什么。
  4. 比较步骤2和3中的测试向量。
  5. 记下单独数组中的错误/错误。
  6. 除非检查所有电线,否则继续返回步骤1。
  7. 将错误/故障输出到LCD。
  8. 我的硬件包含一个移入AVR微控制器的大型移位寄存器。对于每个测试向量(也可能是360位),我需要读取360位。因此,对于360线,数据总量将是360 * 360 = 16kB左右。我已经知道我不能在一次传递中做到这一点(即读取整个数据然后进行比较),因此它必须是测试向量的测试向量。

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

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

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

    那么这类问题的最佳解决方案是什么?我需要解决方案完全“确定性” - 我不能调用malloc等。在我所阅读的嵌入式系统中,它们有点禁忌。

    概要

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

1 个答案:

答案 0 :(得分: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系统具有非常少的内存,动态内存分配会带来堆管理和块对齐的开销,而这些开销可能无法承受。动态内存分配不适用于需要硬实时确定性时序的情况。在所有情况下,您都应该有一个明确定义的策略或体系结构,以避免内存泄漏问题(重复分配永远不会释放的内存)。