CMSIS 란?

Cortex Microcontroller Software Interface Standard라는 의미를 가지며 ARM에서 Cortex-M 프로세서 시리즈에서 ‘벤더’와 관계없이 호환되는 소프트웨어 형식을 의미한다.


CMSIS의 구성은 아래와 같다.

CMSIS-CORE: Cortex-M0/3/4/7 프로세서와 주변 장치를 위한 표준 API.

CMSIS-Driver: RTOS 독립적인 범용 드라이버 인터페이스로, 주변 장치를 미들웨어(통신, 파일 시스템 등)와 연결.

CMSIS-DSP DSP 연산을 위한 라이브러리로 고정소수점(q7, q15, q31)과 단정도 부동소수점(32비트) 지원. M4는 SIMD 최적화.

CMSIS-RTOS API RTOS 간 이식 가능한 표준 API로, 소프트웨어 템플릿 및 미들웨어와 통합 지원.

CMSIS-Pack PDSC(XML) 기반으로 소스, 라이브러리, 예제 등을 관리하고, 개발 도구에서 장치 및 구성 정보 추출.

CMSIS-SVD 장치의 주변 장치를 XML로 기술하여 디버거 및 레지스터 헤더 파일 생성 지원.

CMSIS-DAP CoreSight 디버그 포트를 위한 표준 펌웨어로, 평가 보드에 통합 가능


물론 ‘벤더’들은 이식성 보다는 자신의 회사 제품을 쓰기 원하므로 HAL과 같은 형식을 제공하여 사용자를 종속시키려한다.

활용

FPU와 SIMD를 가지는 코어라면 아래와 같은 CMSIS 명령어를 통해서 쉽게 성능적 이점을 가져올 수 있다.


(1) 부동소수점 곱셈

#include "arm_math.h"float32_t a = 1.2f, b = 2.3f, result;
 
int main() {
    arm_mult_f32(&a, &b, &result, 1);
    return 0;
}

(2) 고정소수점 곱셈 (Saturated Arithmetic)

#include "arm_math.h"q7_t a = 120, b = 2, result; // q7_t는 -128~127 범위의 고정소수점 데이터
 
int main() {
    result = __QADD(a, b); // 결과: 127 (최대값으로 포화)
    return 0;
}
 

(3) 벡터 곱셈

#include "arm_math.h"float32_t A[3] = {1.0f, 2.0f, 3.0f};
float32_t B[3] = {4.0f, 5.0f, 6.0f};
float32_t C[3];
 
int main() {
    arm_mult_f32(A, B, C, 3);
    return 0;
}