본문 바로가기

ESPRESSIF/ESP32-S2

ESP32-S2 ESP-IDF SDK에서 GPIO 성능 테스트, Arduino IDE 코드와 비교

Arduino에서 제공하는 GPIO 제어 함수로 GPIO 토글 속도를 측정해 보자

#define LED_PIN1    18

void setup() {
  pinMode(LED_PIN1, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN1, 1);
  digitalWrite(LED_PIN1, 0);
}

 

 

GPIO On/Off 주기는 337ns로 측정이되며 메인루프 수행 시간은 1.8us로 상당히 느리다. (ns 단위여야 하는데..)

 

 

 

ESP32-S2의 레지스터 직접 제어 방식으로 GPIO 토글 속도를 측정해 보자.

#define LED_PIN1    18

void setup() {
  pinMode(LED_PIN1, OUTPUT);
}

void loop() {
  //digitalWrite(LED_PIN1, 1);
  //digitalWrite(LED_PIN1, 0);

  GPIO.out_w1ts = (1 << LED_PIN1);
  GPIO.out_w1tc = (1 << LED_PIN1);
}

 

 

62ns로 빨라 졌다. 루프 수행 속도는  1.4us로 조금 빨라 졌다.

 

 

 

시리얼 포트로 디버깅 메시를 출력 할 수 있도록 시리얼 포트를 초기화 하면 속도는 더 느려진다.

 

#define LED_PIN1    18

void setup() {
  pinMode(LED_PIN1, OUTPUT);
  
  Serial.begin(115200);
  Serial.println("ESP32-S2 Arduino GPIO Test");
}

void loop() { 
  //digitalWrite(LED_PIN1, 1); 
  //digitalWrite(LED_PIN1, 0); 
  GPIO.out_w1ts = (1 << LED_PIN1); 
  GPIO.out_w1tc = (1 << LED_PIN1); 
}

 

시리얼 포트 초기화시 main 함수의 실행 속도가 5us로 더 느려진다.

 


Arduino IDE 환경에서 테스트는 완료 되었으니 ESP-IDF SDK 개발 환경에서 ESP32-S2 성능을 테스트해 보자.

#define BLINK_GPIO 18

void app_main(void) 
{ 
    gpio_reset_pin(BLINK_GPIO); 
    /* Set the GPIO as a push/pull output */ 
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); 

    while(1) { 
        gpio_set_level(BLINK_GPIO, 1); 
        gpio_set_level(BLINK_GPIO, 0);
    } 
}

 

 

IDF 제공함수 gpio_set_level() 로 GPIO 토글시 375ns(1.3Mhz) 로 루프 지연없이 출력된다.
 
 
레지스터 직접 제어로 구동해 보자
#define BLINK_GPIO 18

void app_main(void)
{
    gpio_reset_pin(BLINK_GPIO);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);

    while(1) {
        //gpio_set_level(BLINK_GPIO, 1); 
        //gpio_set_level(BLINK_GPIO, 0);

        GPIO.out_w1ts = (1 << BLINK_GPIO);
        GPIO.out_w1tc = (1 << BLINK_GPIO);        
    }
}
 
 
레제스터 직접 제어시 62ns(8Mhz) 정도로  측정이 된다. 메인 루프지연 속도는 120ns로 빨라진다.
 
코어 클럭을 240Mhz로 변경해도 동일하다
# ESP32S2-specific
#
# CONFIG_ESP32S2_DEFAULT_CPU_FREQ_80 is not set
# CONFIG_ESP32S2_DEFAULT_CPU_FREQ_160 is not set
CONFIG_ESP32S2_DEFAULT_CPU_FREQ_240=y
CONFIG_ESP32S2_DEFAULT_CPU_FREQ_MHZ=240
 

 

반응형