2017.07.10 星期一

    在研究或使用MCU時很多文章都會談論到記憶體管理機制,但我找了很多資料,發現為什麼ESP8266的使用者或文章很少提到ES8266內部的記憶體使用結構,可能大家都偏重在應用面很多少會去管系統面的東西,反正程式可以執行,結果正確就好,何必去管它記憶體如何分配,程式如何消耗。或許這不是一個很值得研究的議題,但我是資工背景所以個人卻對這塊黑盒子有點興趣及好奇,所以做些研究記錄。至於各位看倌有没有興趣,我是不知道,但說不定這篇文章可以幫助我們對ESP8266的操控能有些了解。
要探討記憶體的使用,我們總要複習一下記憶體位址的表示方式
假如
ESP8266的記憶體體內量為512K Bytes=4194304 bits 則可用的記憶體範圍利使用16進示則從0x000000~0x3FFFFF。

ESP8266的記憶體體內量為1M Bytes=  8388608 bits 則可用的記憶體範圍利使用16進示則從0x000000~0x7FFFFF。
ESP8266的記憶體體內量為4M Bytes= 33554432 bits 則可用的記憶體範圍利使用16進示則從0x000000~0x1FFFFFF。
ESP8266的記憶體體內量為8M Bytes= 67108864 bits 則可用的記憶體範圍利使用16進示則從0x000000~0x3FFFFFF。

所以假如我們買的是ESP-12E或F有4MBytes的記憶體空間,則在進行燒錄作業時要指定作業系統及程式要放在什麼區域。例如我們作業系統通常會從0x000000開始存放,而當晶片開機或Reset時,晶片則從記憶區0x000000開始載入作業系統程式直到控制權移轉給使用者為止。
一個ESP8266應用程式是由二部份映像檔組成,而這二個檔案是被儲存在flash memory內,第一部份位址儲存在0x0000且內容包括boot code(指令RAM碼,RAM資料),而這個檔案最大為64KB。
而第二部份包含ROM code(指令ROM碼及唯讀資料),這二個部份最大的不同在於第一個映像檔在開機期間會從flash 放入晶片內的RAM,而在第二部份內的常式會在需要時才從第二個映像檔載入至RAM指令區的快取記憶體內或直接到flash memory讀取唯讀資料。

因為不同的firmware有不同的記憶體規劃方式,底下為一個ESP8266 Memory Map for 512K Flash Chip 的例子,

位址 大小 描述
0x000000 
0x010000 (64K)
Application boot image
0x010000
0x001000 (4K)
Basic Persistent memory
0x011000
0x06b000 (428K)
Application ROM code/data
0x07c000
0x004000 (16K)
ESP8266 system parameters

 雖然大部份ESP8266晶片最都有512KB的flash memory ,但是其他大容量的晶片例如1MB, 2MB, 4MB or 8MB都有類似的記憶體架構,而前面三個區域的位址是固定的,只有第四個區域大小會晶片容量不同而不同。另外Basic Persistent memory和ESP8266 system parameters 可以被應用程式使用。而Application ROM code/data的其他空的區域可以任意被使用,例如SPIFFS (SPI Flash File System)。

我們再回顧且對應一下規格書上所寫的文件。

  • Architecture: Xtensa lx106
  • CPU frequency: 80MHz overclockable to 160MHz
  • Total RAM available: 96KB (part of it reserved for system)
  • BootROM: 64KB
  • Internal FlashROM: None
  • External FlashROM: code and data, via SPI Flash. Normal sizes 512KB-4MB.
  • GPIO: 16 + 1 (GPIOs are multiplexed with other functions, including external FlashROM, UART, deep sleep wake-up, etc.)
  • UART: One RX/TX UART (no hardware handshaking), one TX-only UART.
  • SPI: 2 SPI interfaces (one used for FlashROM).
  • I2C: No native external I2C (bitbang implementation available on any pins).
  • I2S: 1.
  • Programming: using BootROM bootloader from UART. Due to external FlashROM and always-available BootROM bootloader, ESP8266 is not brickable.

 

 

回ESP8266文件主目錄

 

 參考資料

https://www.zbasic.net/doc/ZBasicESP8266/ZBasicESP826661.html

 

    文章標籤

    ESP8266 記憶體管理 memory map

    全站熱搜

    stanley 發表在 痞客邦 留言(0) 人氣()