esp32晶元具有靈活的記憶體對映功能。
本節介紹esp-idf在預設情況下如何使用這些功能。
esp-idf中的應用程式**可以放置在以下記憶體區域之一中。
esp-idf
為指令ram
分配內部sram0
區域的一部分
(在技術參考手冊中定義)。
0x40080000
到0x400a0000
)用於儲存需要從ram執行的應用程式部分。
使用鏈結描述檔案將esp-idf的幾個元件和wifi堆疊的一部分放入該區域。
如果一些應用程式**需要放入iram,可以使用iram_attr
define
來完成:
#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
0x40070000
0x40080000
需要注意的是外面的**
區域可能不能到達與視窗abi
如果指令,所以需要特別的照顧
或區域被應用程式使用。
預設情況下,esp-idf不使用這些區域。
0x40000000 — 0x40400000
callx
0x40400000 — 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中每個應用程式都有自己的虛擬位址空間。第二行是資料段的記憶體位址範圍。第三行是堆的記憶體位址範圍。最後一...