ESP32應用程式的記憶體布局

2022-05-25 07:12:09 字數 2143 閱讀 9524

esp32晶元具有靈活的記憶體對映功能。

本節介紹esp-idf在預設情況下如何使用這些功能。

esp-idf中的應用程式**可以放置在以下記憶體區域之一中。

esp-idf 

為指令ram 

分配內部sram0

區域的一部分

(在技術參考手冊中定義)。

0x400800000x400a0000)用於儲存需要從ram執行的應用程式部分。

使用鏈結描述檔案將esp-idf的幾個元件和wifi堆疊的一部分放入該區域。

如果一些應用程式**需要放入iram,可以使用iram_attrdefine 

來完成:

#include「esp_attr.h」

void iram_attr gpio_isr_handler (void * arg )

以下是應用程式的部分可能被放置到iram中的情況。

如果功能未明確放置到iram或rtc記憶體中,則將其置於快閃儲存器中。

技術參考手冊中描述了使用flash mmu來允許從快閃儲存器執行**的機制。

esp-idf從

區域開始處放置從flash開始執行的**

。啟動後,第二階段引導引導程式初始化flash mmu,將**所在的快閃儲存器中的位置對映到該區域的開頭。

這一地區的訪問中使用兩個32kb的塊透明快取

- 範圍。

0x400d0000 — 0x40400000

0x400700000x40080000

需要注意的是外面的**

區域可能不能到達與視窗abi 

如果指令,所以需要特別的照顧

或區域被應用程式使用。

預設情況下,esp-idf不使用這些區域。

0x40000000 — 0x40400000

callx0x40400000 — 0x40800000

0x40800000 — 0x40c00000

從深度睡眠模式喚醒後必須執行的**必須放置到rtc儲存器中。

請在深度睡眠

文件中檢視詳細說明

。鏈結器將非常數靜態資料和零初始化資料放入256 kb 

區域。請注意,

如果使用藍芽堆疊,則

該區域減少64kb(通過移位起始位址

)。如果使用跟蹤記憶,該區域的長度也減少16 kb或32kb。

將靜態資料放置在該區域後留下的所有空間用於執行時堆。

0x3ffb0000 — 0x3fff0000

0x3ffc0000

恆定資料也可以被放置到dram中,例如,如果它在isr中使用(參見上面的iram部分中的注釋)。

要做到這一點,

dram_attr可以使用定義:

dram_attr  const  char   format_string  =  「%p %x 」 ; 

char 緩衝區[ 64 ];

sprintf (buffer , format_string , ptr , val );

不用說,不建議printf在isr中

使用和其他輸出功能。

為了除錯目的,

esp_early_logx在從isr登入時

使用巨集。

確保在這種情況下

tag

兩個和格式的字串放在

dram一起。

預設情況下,鏈結器將常量資料放入4 mb區域(

),用於通過flash mmu和快取訪問外部快閃儲存器。

例外是編譯器嵌入到應用程式**中的文字常量。

0x3f400000 — 0x3f800000

從rtc儲存器執行的**使用的全域性和靜態變數(即深度休眠存根**)必須放置到rtc慢速儲存器中。

請在深度睡眠

文件中檢視詳細說明

C 程式 藍芽 ESP32

結合藍芽序列和gpio引腳,esp32可以增強windows機器的讀取能力。因此,使用esp32開發板,您可以將舊的windows計算機變成可以感知其執行環境的iot閘道器。鑑於以上幾點,讓我們看一下如何編寫c 程式以通過bluetooth serial與esp32開發板通訊。使您的esp32開發板...

ESP32 記憶體洩漏Debug方法

esp32 是espressif設計的,在物聯網應用中非常流行的 wi fi bluetooth ble 雙模晶元,其開源idf的方式也在開發者社群 github 具有重要的影響力。對於程式設計而言,也相當友好。而記憶體洩漏作為乙個非常常見的問題被相當多的朋友遇到,它關乎 邏輯是否正確 以及最重要的...

linux應用程式記憶體布局

對向高記憶體位址生長,棧想低記憶體位址生長 linux中所有的應用程式都是這個布局,每個應用程式都是從0x80480000這個位址開始的,這樣衝突嗎?不衝突,因為這個位址是乙個虛擬位址,linux中每個應用程式都有自己的虛擬位址空間。第二行是資料段的記憶體位址範圍。第三行是堆的記憶體位址範圍。最後一...