임베디드-04

기타튀김·2025년 5월 18일

임베디드

목록 보기
4/8
post-thumbnail

📘 Lecture 04 – Mbed, CMSIS, Cortex-M4 Programming


✅ 1. Mbed 플랫폼 개요

● Mbed란?

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 제공이다.


✅ 2. Mbed OS의 주요 특징

● RTOS 내장

  • Deterministic Multithreading 지원
  • Thread, Semaphore, Mutex 등 기본 RTOS 객체 제공

● 보안

  • Mbed TLS: TLS 보안 통신 프로토콜 라이브러리
  • Secure Partition Manager(SPM): 권한 분리 및 IPC 지원

● 연결성

  • BLE, NB-IoT, 6LoWPAN, Thread 등 다양한 무선 통신 스택 지원
  • AWS IoT와도 통합 가능

✅ 3. Mbed 개발환경 종류

도구설명
Mbed Studio공식 오프라인 IDE. 보드 자동 인식, 디버깅 가능
Mbed Online Compiler웹 기반 C/C++ IDE
Mbed CLIPython 기반 명령줄 인터페이스. Git/Mercurial 연동 가능

이 중 Mbed Studio는 가장 직관적이며 실습에 적합하다.


✅ 4. CMSIS란?

● CMSIS (Cortex Microcontroller Software Interface Standard)

ARM Cortex-M 계열 MCU를 위한 **표준 하드웨어 추상화 계층(HAL)**이다.

기능설명
CMSIS-Core레지스터 접근, NVIC, 시스템 제어 인터페이스 제공
CMSIS-RTOS다양한 RTOS를 위한 공통 API 정의 (FreeRTOS, RTX 등)
CMSIS-DSP디지털 신호처리 라이브러리
CMSIS-SVD디바이스 설명 정보(XML) 정의

🔍 CMSIS를 사용하면 MCU가 바뀌어도 동일한 코드 유지가 가능하다.


✅ 5. Cortex-M4에서의 프로그래밍 흐름

● 프로그램 생성 흐름

[C/C++ 소스]
   ↓ (컴파일)
[어셈블리(.S), 오브젝트(.o)]
   ↓ (링크)
[실행파일(.axf, .elf)]
   ↓ (변환)
[HEX, BIN, 디버깅용 심볼 파일]
   ↓ (다운로드)
[MCU 실행]

● 코드 구성

  • 벡터 테이블: 인터럽트 시작 주소 및 초기 SP 포함
  • 시작 코드 (__main 또는 __start): 전역 변수 초기화 등
  • 응용 코드 + C 라이브러리
  • 링커가 배치한 섹션들 (code/data/bss 등)

✅ 6. Mbed의 고수준 API 예시

● Digital IO

#include "mbed.h"
DigitalOut led(LED1);

int main() {
    while (1) {
        led = !led;    // LED 토글
        wait(0.5);     // 0.5초 대기
    }
}
  • DigitalOut, DigitalIn, BusIn, BusOut 등의 클래스를 사용함
  • 객체지향적으로 핀 제어가 매우 직관적

✅ 7. CMSIS를 통한 레지스터 제어 예시

● NVIC 인터럽트 설정 (저수준)

NVIC_EnableIRQ(EXTI0_IRQn);        // EXTI0 인터럽트 활성화
NVIC_SetPriority(EXTI0_IRQn, 1);   // 우선순위 설정

● 특수 레지스터 접근

__disable_irq();         // 글로벌 인터럽트 비활성화
__enable_irq();          // 글로벌 인터럽트 활성화
uint32_t primask = __get_PRIMASK();  // 인터럽트 마스크 읽기

CMSIS 덕분에 어셈블리 없이 직접 레지스터나 시스템 제어를 C 코드로 수행할 수 있다.


✅ 8. 스택, 힙, 데이터 메모리 구조

● RAM 내부 구조

↓ 낮은 주소
[정적 데이터]
[Heap 영역]       ← malloc 등 동적 메모리
         ↕
[Stack 영역]      ← 함수 호출/지역변수/리턴주소 저장
↑ 높은 주소
  • Heap과 Stack은 서로 중간에서 커지며 충돌 위험 존재
  • 정적 데이터는 프로그램 시작 시 결정됨

✅ 9. 인터럽트 벡터 테이블 정의 예시

typedef void(* const ExecFuncPtr)(void);
ExecFuncPtr exception_table[] = {
    (ExecFuncPtr)&__initial_sp, // 초기 SP
    (ExecFuncPtr)__main,        // 초기 PC
    NMI_Handler,
    HardFault_Handler,
    ...
};
  • ARM에서는 **벡터 테이블이 프로그램 시작 주소에 위치(0x00000000)**해야 함

🧾 요약 정리

항목설명
MbedARM Cortex-M 기반 IoT 플랫폼. C++ 기반 고수준 API 제공
Mbed OSRTOS 내장, 보안, 연결성 지원
CMSISARM Cortex-M을 위한 하드웨어 추상화 계층. 레지스터 접근 표준화
개발환경Mbed Studio, Online Compiler, Mbed CLI 등
프로그램 흐름Compile → Link → Load → Run
코드 구조벡터 테이블, 시작 코드, 사용자 코드, 라이브러리 포함
스택/힙RAM 내에서 동적 영역을 구분하며 상호 충돌 위험 존재
인터럽트 처리CMSIS나 Mbed API를 통해 고수준/저수준 모두 제어 가능

profile
부산대 정보컴퓨터공학부

0개의 댓글