1/24/2022

ESP32 의 Memory 구성-2 (Internal Memory)

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 구성 
SRAM과 ROM의 구성보면 다음과 같이 구성되어있으며, 주로 SRAM부분을 파악하자
  1. 520 KB의 SRAM (0/1/2 분할 사용)
  2. 448 KB의 ROM (0/1 분할 사용)
  3. 1 Kbit eFuse : 주로 내부 정보로 이용되며, MAC Address 정보(WIFI/BT/EMAC) 
  4. 8KB RTC Fast Memory:    (PRO_CPU만 접근가능)
  5. 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 관련설명 
  1. Remap: Internal ROM0 과 Internal SRAM1 Remap 되면 Internal ROM0로 사용
  2. Cache:  두개의 CPU(PRO_CPU/APP_CPU)가 32KBx2=64  Cache 사용(MMU기반) 
  3. DMA:  Data로만 되어지며, MMU대신 MPU기반으로 동작 
  4. PRO_CPU Only: RTC FAST Memory 접근은 PRO_CPU만 가능 

** 착각하면 안되는 것이 상위 Internal Memory Size를 다 사용한다고 생각하면 안되며, 상위는 Address Map 일뿐 이다. 

  • ESP32의 ROM0/1(440KB) 구성 
  1. Internal ROM 0:: 384KB : Instruction Bus 사용 (두 CPU 접근가능) 
    1. Internal ROM 0: 32KB   : - 이 부분은 SRAM1 과 Remap 되어 SRAM처럼 사용  
    2. Inernal  ROM 0: 352KB 
  2. Internal ROM 1: 64KB : Data Bus 사용 (두 CPU 접근가능) 


  • ESP32의 SRAM(520KB) 구성정리  
SRAM0/1/2로 분할하여 사용하며 각각의 용도가 아래와 같이 다르며, 관련 Linker Scirpt도 확인
  1. SRAM0192 KB(64/128)  Instruction기반으로 사용 
    1. 64KB:  각 CPU의 Cache로 32KB 사용되며, MMU기반으로 External Memory연결 
    2. 128KB: Interrupt Vector/Text/Heap의 IRAM기반으로 사용  
  2. SRAM1128 KB ( DRAM: 128KB or IRAM: 64/32/32KB ) 둘다 사용 상위 Map참조 
  3. SRAM2200 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/DRAM 
  1. IRAM(Instruction RAM): 주로 text 를 위해서 사용되어질꺼며, 실제 동작Code
  2. DRAM(Data RAM)으로 bss/data/heap/init/noinit 을 위해서 사용 

IRAM/DRAM Adddress MAP
  1. IRAM  SRAM0:  0x4007_0000 - 0x4009_FFFF 
  2. IRAM  SRAM1:  0x400A_0000 - 0x400B_FFFF
  3. DRAM SRAM2:  0x3FFA_E000 - 0x3FFD_FFFF
  4. DRAM SRAM1:  0x3FFE_0000 - 0x3FFF_FFFF

  • Address를 중복되지 않게 IRAM 과 DRAM의 구분
아래와 같이 극단적으로 구성을 정해놓고 사용가능하겠지만, 추후 확장하여 변경도 가능할 것이다. 
  1. SRAM0을 IRAM 사용
  2. SRAM1을 DRAM 사용
  3. SRAM2을 DRAM 사용 
  4. 이외 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)의 구성의 예 
  1. Dual CPU이므로 각 개별 Cache마다 32KB사용하며, CPU1 Cache를 사용안하면, Heap 
  2. Interrupt Vector 사용
  3. Text  (실행가능한 Code영역, Flash , XIP도 여기서 )
  4. Heap IRAM 영역 
    1. FreeRTOS에서 Heap의 사용하며 재미있는것은 32bit Data로 사용가능  
    2. Linker Script와 같이 각 esp32 내부 malloc함수 같이 분석하면 결론이 나옴 

SRAM0의 IRAM의 구성 
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387



SRAM0의 구성 
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구성 
  1. SRAM2 의 ROM Function 위한 DATA Memory 영역 (8K Size, 0x2000)
  2. SRAM2 의 DATA 영역 (초기화된 전역변수)
  3. SRAM2 의 BSS  영역 (초기화가 안된 전역변수)
  4. SRAM1/2 의 Data 기반의 Heap 영역 
    1. Task의 TCB 와 Stack 정보가 이곳에 저장될 것이라고 생각됨 
    2. SRAM의 Heap은 BSS Size 다음부터 정해지므로, 사이즈는 부팅

https://blog.espressif.com/esp32-programmers-memory-model-259444d89387




SRAM2의 구성 
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으로 사용하자