Raspberry Pi Pico(RP2040) 에 대한 연산 처리 성능을 측정해봤습니다.

 
항목
내용
일반 보드 이름 Raspberry Pi Pico
SoC (칩) RP2040
아키텍처 ARM Cortex-M0+ (32-bit RISC)
코어 수 2 (Dual-core)
클럭 속도 최대 133 MHz (기본 125 MHz)
명령어 세트 ARMv6-M
FPU (부동소수점 연산기) ❌ 없음 (소프트웨어 처리)
파이프라인 구조 2-stage pipeline, in-order execution
메모리
/
저장장치
SRAM 264 KB (전용 버스 6개로 분할)
ROM 16 KB (USB 부트로더 및 표준 라이브러리 포함)
Flash 외부 2 MB QSPI Flash (보드 기본 탑재)
외부 Flash 확장 최대 16 MB까지 가능 (SPI/QSPI 지원)
EEPROM ❌ 없음 (Flash에 저장해야 함)
주변 장치 GPIO 총 30개 (26개 사용자 접근 가능)
ADC 12-bit, 3채널 (GPIO26~28)
Temperature Sensor ✅ 내장 (ADC4 채널 사용)
PWM 16채널 (8쌍)
UART 2개
SPI 2개
I²C 2개
PIO (Programmable I/O) ✅ 2개 블록 × 4 state machine = 총 8개
USB ✅ USB 1.1 Controller (Device/Host 지원)
Timer 4개 (64-bit 타이머 포함)
RTC ✅ 내장 (외부 크리스털 연결 가능)
Watchdog ✅ 하드웨어 포함
Interrupt Controller Nested Vector Interrupt Controller (NVIC)
전원
/
전력 소모
동작 전압 (Vdd) 1.8V ~ 5.5V
입력 전원 USB (5V), VSYS 핀 (1.8~5.5V)
전압 변환기 RT6150B 정전류 스텝다운 컨버터 내장
전력소모 (Typical) 동작 시 약 30~50 mA
Sleep 모드 전류 약 1 µA 이하
출력 전원 핀 3V3 출력 핀 제공 (최대 300mA)

1. GPIO 토글 주기

1-1. 함수 명령과 레지스터 제어 와의 성능 차이를 측정해봤고, 레지스터 제어 방식이 약 15배 빠릅니다.

함수 호출 레지스터 제어
void setup() {
    pinMode(0, OUTPUT);
}

void loop() {
    digitalWrite(0, HIGH);
    digitalWrite(0, LOW);
}
#define SIO_BASE            0xD0000000
// GPIO Output Set 레지스터 (해당 비트에 1을 쓰면 HIGH)
#define SIO_GPIO_OUT_SET    (volatile uint32_t*)(SIO_BASE + 0x00000014)
// GPIO Output Clear 레지스터 (해당 비트에 1을 쓰면 LOW)
#define SIO_GPIO_OUT_CLR    (volatile uint32_t*)(SIO_BASE + 0x00000018)
// GPIO Output Enable Set 레지스터 (해당 비트에 1을 쓰면 출력 활성화)
#define SIO_OE_SET          (volatile uint32_t*)(SIO_BASE + 0x00000020)
// GPIO 0번 핀에 해당하는 비트 마스크
#define GPIO0_MASK          (1UL << 0)

void setup() {

    pinMode(0, OUTPUT);
}

void loop() {
    *SIO_GPIO_OUT_SET = GPIO0_MASK;
    *SIO_GPIO_OUT_CLR = GPIO0_MASK;
}

 

*신호 분석: Logic Analyzer(LA2016) 200MHz Sampling

함수 호출
레지스터 제어

*다른 MCU 에 비해 펄스 주기가 균일하지 못합니다. 20ns ~ 30ns 불규칙 적이네요.

 

지금까지 Arduino MEGA328P 16MHz, ESP8266, ESP32-C3 제품들과 비교할 때 가장 높은 성능을 나타냅니다.

 

2. 연산 처리 능력

약 1초 간 루프 문 안에서 반복적으로 카운트(덧셈)하는 연산으로 시험인데, PC 에서 Serial 출력을 받기 위해서는 USB CDC on Boot 옵션을 Enable 로 설정해야 합니다.

unsigned long start, end;
volatile unsigned long count = 0;

void setup() {
  Serial.begin(9600);
  start = micros();
  while (micros() - start < 1000000) {  // 1초 동안
    count++;
  }
  end = micros();
  Serial.print("Count per second: ");
  Serial.println(count);
}

void loop() {}

 

결과는 3,212,886회 로 Arduino Uno(203,905회)대비 약 15.7배의 성능이고 ESP32-C3(1,152,194회) 보다 약 2.7배 빠릅니다.

+ Recent posts