CMSIS-RTOS V1은 ARM이 만든 RTOS 표준 인터페이스(API) 이다.
어느 RTOS든 CMSIS-RTOS 를 기반으로 구현한다.
(3rd party RTOS들은 전부 CMSIS-RTOS의 구현체이다)
개발자들 입장에서는 결국 CMSIS-RTOS API를 사용하든 FreeRTOS API를 사용하든 둘 중 하나를 선택하면된다.
왜?
┌──────────────────────────────────────────────────────┐
│ CMSIS-RTOS API (인터페이스 정의) │
│ │
│ "osThreadCreate()는 이렇게 생겼어야 해" │
│ "osSemaphoreWait()는 이런 동작을 해야 해" │
│ │
│ → ARM이 표준 스펙만 정의 (설계도) │
└──────────────────────────────────────────────────────┘
│
│ 구현
▼
┌──────────────────────────────────────────────────────┐
│ FreeRTOS (실제 구현체) │
│ │
│ osThreadCreate() 내부: │
│ → xTaskCreate() 호출해서 실제 동작 │
│ │
│ osSemaphoreWait() 내부: │
│ → xSemaphoreTake() 호출해서 실제 동작 │
└──────────────────────────────────────────────────────┘
위와 같이 CMSIS-RTOS API에서
'함수 A에는 이런 이런 기능이 있어야해'
하며 미리 인터페이스를 정의해두었고, FreeRTOS는 이에 맞게 구현된, 하나의 구현체일 뿐이다.
다시말해, CMSIS-RTOS API는 설계도를 제공해주고, FreeRTOS는 해당 설계도대로 구현된 구현체이다.

위의 예시를보자.
osKernelStart는 CMSIS RTOS API 이고, vTaskStartScheduler() 는 FreeRTOS API 이다.
그래서 우리는 결국 CMSIS-RTOS API 든 FreeRTOS API든 둘 중 아무거나 잘 외워서 사용하면 된다.
CMSIS RTOS API가 아닌 FreeRTOS API를 직접 사용하면
정합성이 좋아짐등등의 장점이 존재하므로,
FreeRTOS의 API를 직접 사용해볼 것이다.
CMSIS-RTOS API 의 구현체는 여러 종류가 있다. 대표적으로 CMSIS-RTOS RTX와 FreeRTOS가 존재한다.