2016-12-06 46 views
0

我使用STM32F411RE。 因爲我的RAM中沒有更多內存。我決定在我的閃存中存儲大量變量。爲此,我在section.ld中創建了一個部分。STM32,存儲在閃存中的變量無法在其他文件中更新

.large_buffer: ALIGN(4) 
    { 
     . = ALIGN(4) ; 
     *(.large_buffer.large_buffer.*) 
     . = ALIGN(4) ; 
    } >FLASH 

main.c文件,我聲明變量如下:

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used)); 

此時一切都OK,緩衝未在RAM(BSS)放養,我可以訪問它,重寫它。

buffer[25] = 42; 
printf("%d\n", buffer[25]); // 42 

問題來了,當我想從其他文件編輯變量。

main.c

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used)); 

int main() 
{ 
    myFunc(buffer); 
} 

other.c

myFunc(uint8_t* buffer) 
{ 
    buffer[25] = 42; 
    printf("%d\n", buffer[25]); // 0 
} 

buffer在另一個文件(如參數傳遞)永遠不會改變。

我錯過了什麼嗎?

回答

2

由於閃存的物理設計,無法以與寫入RAM相同的方式寫入閃存。確切地說,你需要擦除扇區/頁面(比如〜1-4kB,它在你的MCU數據表中有詳細說明)。原因在於,即使閃存沒有通電,它們也會保留狀態,只要您想要從值0 - > 1中更改任何位,就需要擦除整個扇區(擦除所有位後將設置爲1) 。

所以你不能使用Flash作爲數據存儲器,你可以做的就是使用Flash作爲存儲常量(只讀)值的變量,因此任何查找表都可以完美地適用於那裏(通常是編譯器,當你stat變量爲const將它們放入flash中)。如何寫入閃存可以參閱MCU參考手冊。

+0

感謝您的回答。在閃存中存儲緩衝區(經常需要R/W)是一個很好的解決方案嗎? – Epitouille

+0

我不會推薦這個作爲可行的解決方案,首先是您需要保存RAM才能夠先讀取然後寫入閃存。寫入/擦除比讀取慢得多,並且與RAM寫入/擦除閃存相比更長。另外,你可以做多少次擦除週期是有限制的,通常約爲100k週期。 – koper89

+0

是的,我明白這個問題。在這一點上,我卡住了,因爲我無法保存ram。什麼可能是一個解決方案?什麼優化是相關的? – Epitouille