임베디드 시스템의 아키텍처는 MCU를 중심으로 peripheral 및 외부 세계와 통신하기 위한 특별한 인터페이스 모음을 갖고 있다. MCU는 프로세서, RAM, Flash, serial tx/rx 등을 포함한 SoC이다.
임베디드 프로그래밍에서 중요한 부분은 주변장치(Peripheral)와 통신하는 것이다. 전자공학에 대한 기본적인 지식, 회로도 및 datasheet를 이해하는 능력, 로직 분석기나 오실로스코프 같은 측정 도구에 대한 확신이 필요하다.
임베디드 SW 개발은 자원이 제한돼있음을 철저히 고려해 가장 효율적인 방식에 초점을 맞춰야 한다.
새로운 기능이나 복잡한 구조체를 구현하는데 필요한 충분한 공간이 RAM과 flash에 없을 수 있다.
프로세서가 데이터를 처리하기에 충분히 빠르지 않을 수 있다.
더 적은 전력을 소모하는 펌웨어가 필요할 수도 있다.
MCU는 MMU를 가지고 있지 않고, 메모리가 항상 부족하며, 특정 순서로 모든 데이터를 처리한다. 모든 연산에 잠재적으로 필요한 메모리의 양과 buffer를 항상 고려해야 한다. 스와핑 및 메모리 relocation 같은 고급 OS 기능은 불가능한 경우가 많다. 따라서 성공적인 개발을 위해서는 잘 정의된 테스트 케이스, 성능 지표, 효율적인 프로토타입 단계 등으로 구성된 탄탄한 workflow가 필요하다.
펌웨어는 MCU 내부 flash에 저장되며, MMU가 없기 때문에 flash는 memory에 고정 물리 주소로 매핑되기 때문에 프로세서는 주소 변환 없이 flash에서 직접 instruction을 순차적으로 가져오는 XIP(Execute In Place) 매커니즘으로 실행된다.
ARM Cortex-M 제품은 다음과 같은 특징을 가진다.
16개의 general purpose register.
코드 밀도 최적화를 위한 Thumb 16bit용 instruction format.
Priority based NVIC (Nested Vector Interrupt Controller)