폰 노이만 구조와 하버드 구조
코드와 데이터를 같은 길로 읽느냐, 따로 읽느냐. Cortex-M이 두 구조를 섞어 쓰는 이유까지 정리했습니다.
폰 노이만 구조
명령어와 데이터가 같은 메모리, 같은 버스를 씁니다. 구조가 단순하지만 명령어를 가져오는 동안 데이터를 읽을 수 없어서 버스가 병목이 됩니다.
하버드 구조
명령어 메모리와 데이터 메모리가 따로 있고 버스도 따로입니다. 다음 명령어를 가져오면서 동시에 데이터를 읽고 쓸 수 있어 빠릅니다. AVR(ATmega)이 대표적인 하버드 구조라서 Flash에 있는 상수를 읽으려면 PROGMEM과 pgm_read_byte() 같은 특별한 방법이 필요합니다.
Cortex-M은 둘 다
Cortex-M3/M4는 내부적으로 명령어 버스(I-Code)와 데이터 버스(D-Code, System)가 분리된 하버드 구조지만, 주소 공간은 하나로 합쳐져 있어 프로그래머에게는 폰 노이만처럼 보입니다. 그래서 C에서 Flash의 const 배열을 일반 포인터로 바로 읽을 수 있습니다.
| 구조 | 장점 | 예 |
|---|---|---|
| 폰 노이만 | 단순, 유연 | 초기 PC, Cortex-M0 |
| 하버드 | 동시 접근, 빠름 | AVR, DSP |
| 수정 하버드 | 둘의 장점 | Cortex-M3/M4/M7 |