簡體   English   中英

在Arm Cortex M4 NRF52的局部Flash中重寫變量的初始化值

[英]Rewriting the initialised value of a variable in the local flash of a arm cortex m4 nrf52

我想在閃存中有一個變量,該變量在重置后將保留我想要的值。 我知道像int test_data = 3這樣的變量存儲在閃存的.data節中,然后在運行時復制到RAM中。 我想在運行時為變量test_data修改存儲在閃存中的值,以便在下次重新啟動時將加載不同的默認初始化值。

我知道可以在運行時編寫CPU上的閃存,但是我不知道如何在閃存中找到test_variable的地址。 你能給我這個方向的暗示嗎?

謝謝。

您提出的建議不太實際。 閃存是可寫的,塊擦除的。 不能重寫單個單詞; 您必須將整個擦除塊復制到RAM,修改副本中的值,擦除該塊,然后從修改后的RAM副本中寫入整個塊。 希望在此過程中不斷開電源。

這可能甚至不可能,因為您的RAM小於擦除塊的大小。 此外,如果SoC從閃存執行代碼,則塊擦除可能會擦除正在執行的代碼。

請檢查您零件的文檔,但nRF52840的頁面相對較小,為4Kb。 因此,更好的解決方案是為您的配置/初始化數據保留一個頁面並讀取代碼中的數據,並在啟動時將其分配給適當的變量,而不是嘗試重寫鏈接器生成的代碼/數據。 更好的是,為了保護自己免受電源故障的影響,請使用最后一頁寫有序列號和驗證的兩頁; 那么在啟動時,有效序號最大的頁面就是正在使用的頁面。 修改數據時,您將覆蓋較舊的數據-這樣,如果在寫入序列號和驗證之前失敗,則不會丟失所有數據。 如果數據頁為空白,則使用鏈接器生成的初始化。

這只是您需要做的事情的概述-復雜程度取決於您。

如果您的應用程序具有嚴格的實時約束; 您可能需要檢查在頁面擦除/寫入過程中內存總線是否未被阻塞-這可能會導致在擦除/寫入過程中中斷包括中斷處理程序在內的代碼的執行,並導致您錯過最后期限。 nRF52840的頁面擦除時間最長為85ms。 如果這是一個問題,那么最好使用外部EEPROM。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM