MCU 성능 측정에 있어 GPIO 토글 속도를 측정하는 이유는 FTFLCD 제어 속도 테스트와 같은 GPIO로 제어 하는 주변 장치를 사용할 때 주요 성능 지표가 되기 때문이다.
Arduino에서 제공하는 GPIO 제어 함수로 GPIO 토글 속도를 측정해 보자
const int LED1_PIN = 18;
void setup() {
pinMode(LED1_PIN, OUTPUT);
Serial.begin(115200);
Serial.println("ESP32-S3 GPIO Test");
}
void loop() {
digitalWrite(LED1_PIN, 0);
digitalWrite(LED1_PIN, 1);
}
GPIO On/Off 주기는 380ns로 측정이되며 메인루프 수행 시간은 ESP32S2 GPIO토글 속도와 다르게 딜레이 없이 수행되는것 같다.
GPIO제어를 위해 ESP-IDF에서 제공하는 함수 gpio_set_level()를 이용하여 테스트 해 보면
void loop() {
//digitalWrite(LED1_PIN, 0);
//digitalWrite(LED1_PIN, 1);
gpio_set_level(GPIO_NUM_18, 0);
gpio_set_level(GPIO_NUM_18, 1);
}
Arudino 코드와 동일한 결과(느린)가 측정된다.
ESP32S3의 레지스터 직접 제어 방식으로 GPIO 토글 속도를 측정해 보자.
void loop() {
//digitalWrite(LED1_PIN, 0);
//digitalWrite(LED1_PIN, 1);
//gpio_set_level(GPIO_NUM_18, 0);
//gpio_set_level(GPIO_NUM_18, 1);
GPIO.out_w1ts = (1 << LED1_PIN);
GPIO.out_w1tc = (1 << LED1_PIN);
}
62ns로 측정이 된다. ESP32S2 GPIO 토글속도 와 동일한 결과가 출력되는것 같다.
그리고 Serial 기능을 사용하면 메인루프 지연 속도는 여전히 느려지는 현상이 발생한다.
ESP32S2, ESP32S3의 경우 GPIO33 번 부터는 레지스터 제어 방식이 조금 다르기 때문에 정리가 필요 할것 같다.
#define sbi(Port, Value) (GPIO.out_w1ts = (1<<Value))
#define cbi(Port, Value) (GPIO.out_w1tc = (1<<Value))
#define sbi1(Port, Value) GPIO.out1_w1ts.val = ((uint32_t)1 << (Value - 32))
#define cbi1(Port, Value) GPIO.out1_w1tc.val = ((uint32_t)1 << (Value - 32))
반응형