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

标签 c embedded avr avr-gcc

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

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

我的硬件包含一个大型移位寄存器,该移位寄存器按时钟输入 AVR 微 Controller 。对于每个测试 vector (也将是 360 位),我需要读取 360 位。因此,对于 360 根线,数据总量将为 360*360 = 16kB 左右。我已经知道我不能一次完成此操作(即读取整个数据然后进行比较),因此它必须逐个测试 vector 。

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

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

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

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

总结

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

最佳答案

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

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

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

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

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

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

关于c - 在嵌入式系统中存储大整数/值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8632766/

相关文章:

c - uv_fs_open : flags and mode on Windows

c - 在代码中修改 __FILE__ 和 __LINE__ 以供引用?

linux - 没有 X 的硬件加速

c - 跳转到重置 vector

c - AVR 编程 - 如何在 C 中读取连续的按钮按下

assembly - 如何将AVR GCC风格的C内联汇编转换为Rust内联汇编?

c - 将输入存储到 malloc 数组(1d 和 2d)并打印

c++ - 部署一个用VS2010编译的C程序

embedded - 如何将静态库 CppUTests 添加到我的项目 atmel studio

Arduino Bootstrap