ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ESP-IDF 메모리 - SRAM (vscode)
    소프트웨어 2023. 3. 28. 10:25

    #esp32 윈도우 vscode 환경
    #선행(필수) ESP-IDF 윈도우 개발환경 세팅(vscode)
    #선행(필수) ESP-IDF 외부 폴더에서 예제 파일 실행(vscode)


    1) 저장 장치 3종류 (물리적 분류)

    FLASH Memory   SRAM   ROM
    ESP32의 메모리는 물리적으로 아래 세 종류로 분류 됩니다.
    FLASH Memory의 위치는 위 사진에서 확인 가능하고,
    SRAM과 ROM 은 ESP32 패키지 안에 있어 볼 수 없습니다.

    FLASH Memory 는 비휘발성 저장장치 입니다.
    프로그램은 플래시 메모리에 저장됩니다.
    ESP32가 부팅되면, CPU는 코드를 램이 아닌 FLASH Memory에서 직접 읽으며 실행 합니다.
    변수 값과 같은 데이터들은 SRAM에 저장 됩니다.
    ROM 포스트 예정.

    #include  <stdio.h>

    int a = 10;
    void app_main()
    {
      printf("a value = %d\n",a);
    }

    위 코드의 프로그램이 실행 되면,  
    첫 줄인 int a = 10; 의 명령을 FLASH Memory 에서 읽어와서
    SRAM에 int형 4바이트를 할당하고 10을 저장합니다. 
     
     

    2) SRAM의 용도에 따른 분류 (논리적 분류)

    IRAM , DRAM , RTC RAM 

    int a = 10;
    
    void  app_main()
    {
      printf("a value = %d\n",a);
    }

    int a = 10; 데이터는 SRAM에 저장 되는데,
    SRAM 중에서도 데이터가 저장 되는 영역은 DRAM 입니다.
    코드는 FLASH Memory에서 읽어 들이지만,
    용량이 큰 데이터는 프로그램 속도를 위해 DRAM에 저장되고 읽어 들입니다. 
    속도의 문제도 있지만 쓰기 수명이 짧은 FLASH Memory에 바뀌는 변수 값을 계속 넣는다면
    금방 고장 날 것입니다. ESP-IDF 메모리 - Flash 읽기/쓰기
     
    반면, 코드를 계속 느린 FLASH Memory에서만 읽어오면,
    읽어 오는 속도가 CPU의 처리 속도를 따라가지 못 할 것입니다.
    프로그램에서 자주 반복되는 코드는 IRAM의 Cache 메모리에 저장되고 읽힙니다.
    아래 while(1) 루프의 반복되는 코드는 ESP32 의 caching mechanism에 따라 일부 chache 메모리에 저장 됩니다.

    int a = 10;
    
    void app_main()
    {
    while(1)
      {
        printf("a value = %d\n",a);
        a = 20;
        vTaskDelay(100 / portTICK_PERIOD_MS);
      }
    }

     
    우리가 의도적으로 코드를 IRAM에 올릴 수도 있습니다.
    아래와 같이 함수 앞에 'IRAM_ATTR'을 붙이면 해당 함수는 IRAM에서 읽어와 실행 됩니다.
    반응 속도가 중요한 인터럽트 함수는 보통 IRAM에서 실행 시킵니다.

    #include <stdio.h>
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    
    void IRAM_ATTR my_task()
    {
      printf("IRAM task\n");
    }
    
    void app_main()
    {
    while(1)
      {
        my_task();
        vTaskDelay(1000 / portTICK_PERIOD_MS);
      }
    }

     
    정리하면, SRAM은 코드 실행을 위한 IRAM과 데이터 부분의DRAM으로 나뉘고,
    IRAM의 일정 부분은 FLASH CACHE 메모리로 사용 됩니다.
    FLASH CACHE는 32kb로 확정 되어 있습니다.
    추가로, 특수한 경우에 사용되는 RTC RAM이 있습니다.
    DEEP SLEEP 모드에서 사용되는 RAM입니다. -> 내용 추가 예정

    -> 내용 추가 예정
     

    3) IRAM, DRAM 여유 공간 , 주소

    -> 내용 추가 예정

    4) DRAM - .data / .bss

     

    5) Heap, Stack

    -> 내용 추가 예정
     

    6) 외장 메모리 PSRAM

    -> 내용 추가 예정
     
     
    *공부하는 입장에서 정리중인 자료들 입니다.


    ESP-IDF 윈도우 개발환경 세팅 (VSCODE)
    ESP-IDF 외부 폴더에서 예제 파일 실행 (VSCODE)
    ESP-IDF GPIO 인풋, 아웃풋 (VSCODE)
    ESP-IDF 인터럽트 (VSCODE)

    ESP-IDF 디바운싱 (esp32, vscode)
    ESP-IDF .c .h 참조 cMakeLists (vscode)

    ESP-IDF components 참조 cMakeLists (vscode)
    ESP-IDF LCD 출력(vscode)
    ESP-IDF 메모리 - Flash (vscode)
    ESP-IDF 메모리 - SRAM (vscode)
    ESP-IDF FreeRTOS - buffer (vscode)

    ESP-IDF 쿨링팬 FG센서, PWM제어(vscode)

     



    <포스트 예정>
    *ESP-IDF 메모리 - ROM
    *LCD - 메뉴 만들고 버튼으로 메뉴 이동(터미널로 작업)
    *LCD - 2차원 배열로 메뉴 진입, 뒤로가기(터미널로 작업)
    *LCD - 메뉴 만든 것 LCD 출력
    *LCD - 메뉴 UI 제작.  연두색 블럭은 메인 메뉴 회색 블럭은 서브 메뉴
            (1.팬  1-1.ON  1-2.OFF  1-3.BACK   2.LED  2-1.밝기 약  2-2.밝기 중  2-3.밝기 강   2-4.BACK   3.빛 밝기 출력 lux(+PPFD 변환)
    *Easy EDA툴 활용하여 커스텀 ESP32 보드 제작
    *LCD - LCD , 팬 , 펌프 ,  ESP32 연결 가능한 PCB 제작 주문.
    *LCD - 간이 스마트팜 제작
    *ESP32 JTAG 디버그
    *FreeRTOS
    *FreeRTOS - QUEUE
    *FreeRTOS - timer
    *FreeRTOS - Semaphore , mutex
    *FreeRTOS - event group , notification
    *ESP-IDF I2C SPI UART
    *ESP-IDF wifi
    *ESP-IDF MQTT
    *ESP-IDF Server (XAMPP 로컬 서버 연결)
    *DIY 컨테이너 / 유리온실 스마트팜 제작

     
     

     

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
Designed by PixelSpace