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.
參考資料
https://www.zbasic.net/doc/ZBasicESP8266/ZBasicESP826661.html
留言列表