Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在嵌入式系统中存储大整数/值_C_Embedded_Avr_Avr Gcc - Fatal编程技术网

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

C 在嵌入式系统中存储大整数/值,c,embedded,avr,avr-gcc,C,Embedded,Avr,Avr Gcc,我正在开发一个嵌入式系统,可以测试大量的电线(多达360根)——本质上是一个连续性检查系统。系统通过在测试向量中计时并读取另一端的输出来工作。然后将输出与存储的结果(存储在SD卡上)进行比较,以确定输出应该是什么。测试向量只是一个移动向量,因此不需要将它们存储在任何地方。这个过程有点像如下所示: 时钟输出测试向量(步行向量) 读入输出测试向量 从SD卡读取相应的输出测试向量,告诉输出向量应该是什么 比较步骤2和步骤3中的测试向量 在单独的数组中记录错误/故障 除非检查了所有导线,否则继续返回步骤

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

  • 时钟输出测试向量(步行向量)
  • 读入输出测试向量
  • 从SD卡读取相应的输出测试向量,告诉输出向量应该是什么
  • 比较步骤2和步骤3中的测试向量
  • 在单独的数组中记录错误/故障
  • 除非检查了所有导线,否则继续返回步骤1
  • 将错误/故障输出到LCD
  • 我的硬件由一个大的移位寄存器组成,它被计时到AVR微控制器中。对于每个测试向量(也将是360位),我将需要读取360位。因此,对于360线,数据总量将是360*360=16kB左右。我已经知道我不能一次完成(即读取整个数据,然后进行比较),因此必须逐个测试向量

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

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

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

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

    摘要


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

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


    如果测试向量是360中的单个位,那么为每个向量存储360位既低效又不必要,值0到359足以明确定义每个向量。如果正确的输出也是单个位,那么也可以将其存储为位索引,如果不是,则可以将其存储为应设置的每个位的索引列表,具有一些sentinel值>=360,或者为什么首先要将二进制数据存储为文本?没有可移植性或可读性要求。例如,
    fwrite(array,sizeof(array),file)
    有什么问题吗?如果我错了,请纠正我:您需要从SD读取测试样本,将其打卡,重新打卡,并将打卡结果与初始样本进行比较?另外,您将如何生成测试向量(存储在SD卡上的向量)?因为,如果您有一组固定的测试数据,那么将数据存储在程序内存中的一个简单数组中可能会更容易。您希望输入中同时有多少个“1”位?如果预期的输入是稀疏的,则只需存储“1”位的位置。因此,当我读入移位寄存器的全部内容时,我应该简单地记下“1”的位置并丢弃位数组?位数组中不会有太多的“1”,因此这种方法将非常有益。
    byte_address = base_address + bit_index / 8 ;
    bit_mask = 0x01 << (bit_index % 8) ;