1. ESP32 Internal Memory 구성
- ESP32 Memory Address MAP
CPU에서 Internal Memory 접근은 Cache를 이용하지 않는다.
ESP32에서는 Internal Memory or Embedded Memory라고 하며, ROM과 RAM부분으로 구성되어있다.
- ESP32-WROVER-B의 Internal Memroy 구성
https://www.espressif.com/sites/default/files/documentation/esp32-wrover-b_datasheet_en.pdf |
- ESP32의 Internal Memory Size 구성
- 520 KB의 SRAM (0/1/2 분할 사용)
- 448 KB의 ROM (0/1 분할 사용)
- 1 Kbit eFuse : 주로 내부 정보로 이용되며, MAC Address 정보(WIFI/BT/EMAC)
- 8KB RTC Fast Memory: (PRO_CPU만 접근가능)
- 8KB RTC SLOW Memory: (PRO_CPU/APP_CPU/ULP 접근가능)
상위의 RTC Slow Memory의 경우 거의 ULP가 사용하며, 나의 경우는 거의 제외
(DeepSleep모드는 ULP 내부 별도 Core사용)
- ESP32의 Internal Memory Address Map
Bus Type 기준으로 Data/Instruction에 따라 각 나누어 사용하므로 각 Address Map를 주의해서 보도록하자.
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf |
- Table 2 의 Comment 관련설명
- Remap: Internal ROM0 과 Internal SRAM1 Remap 되면 Internal ROM0로 사용
- Cache: 두개의 CPU(PRO_CPU/APP_CPU)가 32KBx2=64 Cache 사용(MMU기반)
- DMA: Data로만 되어지며, MMU대신 MPU기반으로 동작
- PRO_CPU Only: RTC FAST Memory 접근은 PRO_CPU만 가능
** 착각하면 안되는 것이 상위 Internal Memory Size를 다 사용한다고 생각하면 안되며, 상위는 Address Map 일뿐 이다.
- ESP32의 ROM0/1(440KB) 구성
- Internal ROM 0:: 384KB : Instruction Bus 사용 (두 CPU 접근가능)
- Internal ROM 0: 32KB : - 이 부분은 SRAM1 과 Remap 되어 SRAM처럼 사용
- Inernal ROM 0: 352KB
- Internal ROM 1: 64KB : Data Bus 사용 (두 CPU 접근가능)
- ESP32의 SRAM(520KB) 구성정리
- SRAM0: 192 KB(64/128) Instruction기반으로 사용
- 64KB: 각 CPU의 Cache로 32KB 사용되며, MMU기반으로 External Memory연결
- 128KB: Interrupt Vector/Text/Heap의 IRAM기반으로 사용
- SRAM1: 128 KB ( DRAM: 128KB or IRAM: 64/32/32KB ) 둘다 사용 상위 Map참조
- SRAM2: 200 KB ( DRAM: 200KB )
SRAM-0/1/2의 구성은 상위와 같이 약간 복잡하게 구성되며 ,
기본적으로 Insrtuction/Data Type으로 사용하느냐에 따라 Address Map 조금씩 달라진다.
2. SRAM의 IRAM/DRAM 구분 및 구성
SRAM을 보면, SRAM0/1/2 와 RTC Flast RAM 와 RTC SLOW RAM 나뉘어진다.
그리고, SRAM0/1/2는 각 Bus Type에 따라 IRAM/DRAM 으로 나뉘어지며, 중복 Mapping도 가능하다.
이는 칩 설계자가 SRAM1 확장성을 염두해고 이렇게 중복 Mapping한 것으로 보이며, 실제로도 중간 부분은 I/DRAM을 혼용사용한다.
이부분은 추후 MMU/Cache의 부분을 보면 이해를 할수 있다.
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387 |
- IRAM(Instruction RAM): 주로 text 를 위해서 사용되어질꺼며, 실제 동작Code
- DRAM(Data RAM)으로 bss/data/heap/init/noinit 을 위해서 사용
IRAM/DRAM Adddress MAP
- IRAM SRAM0: 0x4007_0000 - 0x4009_FFFF
- IRAM SRAM1: 0x400A_0000 - 0x400B_FFFF
- DRAM SRAM2: 0x3FFA_E000 - 0x3FFD_FFFF
- DRAM SRAM1: 0x3FFE_0000 - 0x3FFF_FFFF
- Address를 중복되지 않게 IRAM 과 DRAM의 구분
- SRAM0을 IRAM 사용
- SRAM1을 DRAM 사용
- SRAM2을 DRAM 사용
- 이외 RTC RAM 8/8 KB사용
SRAM1은 상위에서 언급했듯이 항상 확장성을 위해서 I/D RAM으로 변경확장가능하다는 것을 잊지말자
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387 |
2.1 SRAM0의 IRAM 구성
SRAM0의 경우, IRAM 사용되어지며, 실행가능한 코드 혹은 현재 32byte align으로 구성(CPU가 32bit)되어있다.
- SRAM0 의 IRAM(Instruction RAM)의 구성의 예
- Dual CPU이므로 각 개별 Cache마다 32KB사용하며, CPU1 Cache를 사용안하면, Heap
- Interrupt Vector 사용
- Text (실행가능한 Code영역, Flash , XIP도 여기서 )
- Heap IRAM 영역
- FreeRTOS에서 Heap의 사용하며 재미있는것은 32bit Data로 사용가능
- Linker Script와 같이 각 esp32 내부 malloc함수 같이 분석하면 결론이 나옴
SRAM0의 IRAM의 구성
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387 |
192KB = 64KB + 128KB (I-MMU)
128KB = ISR/Text/Free IRAM 이 부분 전체가 I-MMU에 해당
이부분은 추후 Internal Memory를 위한 MMU
2.2. SRAM1/2의 DRAM 구성변화
SRAM1/2의 DRAM 구성은 Config에 따라 변경이 되어지며 각 경우에 따라 아래와 같이 구성
중요하게 봐야할 부분이 Heap Size이며, Heap 기반으로 Task의 TCB 와 Task의 Stack Size가 결정되므로, 중요하게 봐야한다.
- 일반적인 SRAM1/2의 DRAM구성
- SRAM2 의 ROM Function 위한 DATA Memory 영역 (8K Size, 0x2000)
- SRAM2 의 DATA 영역 (초기화된 전역변수)
- SRAM2 의 BSS 영역 (초기화가 안된 전역변수)
- SRAM1/2 의 Data 기반의 Heap 영역
- Task의 TCB 와 Stack 정보가 이곳에 저장될 것이라고 생각됨
- SRAM의 Heap은 BSS Size 다음부터 정해지므로, 사이즈는 부팅
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387 |
SRAM2의 구성
200KB = 72KB+ 128KB (D-MMU)
200KB = 72KB+ 128KB (D-MMU)
- BT를 사용할 경우 DRAM구성
BT를 사용할 경우, SRAM2에 BT Controller Memory(54Kb)영역 추가
나머지는 상위 일반적인것 과 동일
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387 |
상위부분은 Linker Script에서 0x3FFFB_0000 - 0x3FFB_DB5C로 DRAM으로 사용되어짐
- Trace를 사용할 경우 DRAM구성
APP TRACE를 사용할 경우, SRAM1의 Trace Memory(32KB) 추가
나머지는 상위 일반적인것 과 동일
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387 |
3. SRAM1의 Heap 구성확인
ESP32 SRAM의 실제 Heap 구성
ESP32를 처음 실행시 현재 사용하는 Heap을 다음과 같이 확인가능하며, 이는 _heap_start가 동적으로 변하기 때문에 각각의 Application에 따라 다름
각 Config에 의해서 변경되어지므로 주의하며, 상위그림이 다른 것도 다 Config가 다르며,
I (252) heap_init: Initializing. RAM available for dynamic allocation: I (259) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM I (265) heap_init: At 3FFB2EC8 len 0002D138 (180 KiB): DRAM I (272) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM I (278) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM I (284) heap_init: At 4008944C len 00016BB4 (90 KiB): IRAM
malloc 은 내부적으로 heap_cap_malloc으로 사용되어지며, 가급적 malloc 대신 heap_cap_malloc으로 사용하자