2017-04-13 81 views
0

我正在使用IAR 7.80開發STM32 mC。 我需要在Flash中將特定的內存塊表示爲不同大小的變量。 例如從位置0x0800B00開始我有以下數據: 4個字節,它們是一個浮點數,一個大小爲4的字符數組,然後是一個uint32_t的4個字節數組。 目前我指定的每個變量的特定位置,使得對於上面的例子我寫:在閃存中定義一塊內存作爲IAR中的變量

_Pragma("location=0x0800B000") const float first_var = 5.0; 
_Pragma("location=0x0800B004") const char[4] second_var = {1,2,3,4}; 
_Pragma("location=0x0800B008") const uint32_t third_var = 1000; 

在現實中我有超過100個這樣的變量和添加/移除的變量是在這個發展階段頻繁,因此,每次我移除一個變量時,我需要重新排列所有變量的位置。 有沒有更好的方法來表示這些變量? 注意:我需要能夠將內存塊解析並在PC應用程序中進行解析,因此,我需要每個變量都佔用它的大小,而不是更多!

回答

1

解決這個問題最方便的方法是使用一個帶有多個單獨字段的結構,每個變量一個結構,而不是一組單個變量。使用此解決方案,您只需指定一次位置,即可保證字段按您想要的順序放置,如果使用打包結構,則可以混合不同大小的字段,並且仍然可以確保沒有填充他們。您唯一支付的價格是將變量訪問轉換爲結構訪問所需的前綴。

0

替代方法是以非常容易解析的文件格式指定變量。例如,您可以使用CSV,並在不同列中定義類型,名稱和默認值。

然後使用腳本語言來讀取CSV,並生成C源文件並自動計算偏移量。這對於像Python這樣的標準庫中具有CSV文件例程非常簡單。

作爲額外的好處,您還可以使用PC軟件可以使用的計算偏移量生成新的CSV文件。 PC應用程序更容易解析,如果必須更改使用不同編譯指示語法的嵌入式編譯器,則不必修改解析器。

您可以使用其他文件格式或腳本語言,但基本概念保持不變。您獲得了新的工具要求,但獲得了很大的靈活性。

相關問題