2011-12-26 30 views
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卡上的文本文件中的最佳方式是什麼?

+2

爲什麼要將二進制數據作爲文本存儲在第一位?沒有可移植性或可讀性要求。例如有什麼問題? '的fwrite(數組,的sizeof(陣列),文件)'? – 2011-12-26 04:11:59

+0

如果我錯了,請糾正我:您需要從SD讀取測試樣本,將其輸出,重新輸入時鐘並將結果與​​初始樣本進行比較?另外,你將如何生成一個測試向量(一個存儲在你的SD卡上)?原因是,如果您有一組固定的測試數據,將數據存儲在程序存儲器中的簡單數組中可能會更容易。 – 2011-12-26 06:02:12

+0

您希望在輸入中同時有多少個「1」位?如果預期的輸入是稀疏的,則只需存儲'1'位的*位*。 – wildplasser 2011-12-26 12:10:53

回答

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系統的內存非常少,動態內存分配帶來了堆管理和塊對齊的開銷,而這些開銷可能無法承受。動態內存分配不適用於需要硬實時確定性時序的情況。在所有情況下,您都應該有一個明確的策略或體系結構來避免內存泄漏問題(重複分配永遠不會釋放的內存)。

+0

所以當我讀到移位寄存器的全部內容時,我應該簡單地記下'1'和丟棄位數組的位置?位陣列中不會有太多的'1',所以這種方法非常有用。 – saad 2011-12-27 07:44:12