Arm Cortex-M 기반 MCU를 위한 IoT 특화 개발 플랫폼이다.
| 구성 요소 | 설명 |
|---|---|
| Mbed OS | 실시간 커널 포함, RTOS 기능 내장 |
| Mbed SDK | 드라이버, API, HAL, RTOS, 네트워크 라이브러리 등 |
| 개발 환경 | Mbed Studio, Mbed Online Compiler, Mbed CLI |
| 지원 보드 | Nucleo, DISCO, Nordic nRF 등 다양한 Cortex-M 보드들 |
🔍 Mbed의 핵심 가치는 빠른 프로토타이핑, 높은 추상화, 직관적인 API 제공이다.
| 도구 | 설명 |
|---|---|
| Mbed Studio | 공식 오프라인 IDE. 보드 자동 인식, 디버깅 가능 |
| Mbed Online Compiler | 웹 기반 C/C++ IDE |
| Mbed CLI | Python 기반 명령줄 인터페이스. Git/Mercurial 연동 가능 |
이 중 Mbed Studio는 가장 직관적이며 실습에 적합하다.
ARM Cortex-M 계열 MCU를 위한 **표준 하드웨어 추상화 계층(HAL)**이다.
| 기능 | 설명 |
|---|---|
| CMSIS-Core | 레지스터 접근, NVIC, 시스템 제어 인터페이스 제공 |
| CMSIS-RTOS | 다양한 RTOS를 위한 공통 API 정의 (FreeRTOS, RTX 등) |
| CMSIS-DSP | 디지털 신호처리 라이브러리 |
| CMSIS-SVD | 디바이스 설명 정보(XML) 정의 |
🔍 CMSIS를 사용하면 MCU가 바뀌어도 동일한 코드 유지가 가능하다.
[C/C++ 소스]
↓ (컴파일)
[어셈블리(.S), 오브젝트(.o)]
↓ (링크)
[실행파일(.axf, .elf)]
↓ (변환)
[HEX, BIN, 디버깅용 심볼 파일]
↓ (다운로드)
[MCU 실행]
__main 또는 __start): 전역 변수 초기화 등#include "mbed.h"
DigitalOut led(LED1);
int main() {
while (1) {
led = !led; // LED 토글
wait(0.5); // 0.5초 대기
}
}
DigitalOut, DigitalIn, BusIn, BusOut 등의 클래스를 사용함NVIC_EnableIRQ(EXTI0_IRQn); // EXTI0 인터럽트 활성화
NVIC_SetPriority(EXTI0_IRQn, 1); // 우선순위 설정
__disable_irq(); // 글로벌 인터럽트 비활성화
__enable_irq(); // 글로벌 인터럽트 활성화
uint32_t primask = __get_PRIMASK(); // 인터럽트 마스크 읽기
CMSIS 덕분에 어셈블리 없이 직접 레지스터나 시스템 제어를 C 코드로 수행할 수 있다.
↓ 낮은 주소
[정적 데이터]
[Heap 영역] ← malloc 등 동적 메모리
↕
[Stack 영역] ← 함수 호출/지역변수/리턴주소 저장
↑ 높은 주소
typedef void(* const ExecFuncPtr)(void);
ExecFuncPtr exception_table[] = {
(ExecFuncPtr)&__initial_sp, // 초기 SP
(ExecFuncPtr)__main, // 초기 PC
NMI_Handler,
HardFault_Handler,
...
};
| 항목 | 설명 |
|---|---|
| Mbed | ARM Cortex-M 기반 IoT 플랫폼. C++ 기반 고수준 API 제공 |
| Mbed OS | RTOS 내장, 보안, 연결성 지원 |
| CMSIS | ARM Cortex-M을 위한 하드웨어 추상화 계층. 레지스터 접근 표준화 |
| 개발환경 | Mbed Studio, Online Compiler, Mbed CLI 등 |
| 프로그램 흐름 | Compile → Link → Load → Run |
| 코드 구조 | 벡터 테이블, 시작 코드, 사용자 코드, 라이브러리 포함 |
| 스택/힙 | RAM 내에서 동적 영역을 구분하며 상호 충돌 위험 존재 |
| 인터럽트 처리 | CMSIS나 Mbed API를 통해 고수준/저수준 모두 제어 가능 |