STM32 FreeRTOS 포팅하기
STM32CudeIDE에서 FreeRTOS CMSISV2를 NucleoG474RE에 포팅하기
임베디드 시스템 개발에 착수하게 되면, 작업과 리소스를 효율적으로 관리할 수 있는 실시간 운영 체제(RTOS)의 중요성을 자연스럽게 깨닫게 됩니다. RTOS 구현을 위해 선택할 수 있는 여러 솔루션 중, 많은 사용자들에 의해 검증된 오픈 소스 솔루션인 FreeRTOS는 매우 유용한 기능을 제공합니다. 이번 포스트에서는 RTOS의 기본 사항을 살펴보고 STM32 마이크로컨트롤러에 FreeRTOS를 포팅하는 과정을 시작해 보겠습니다.
개발 보드
목차
0 RTOS란?
RTOS는 실시간 운영 체제(Real-Time Operating System)의 약자로, 특정한 시간 내에 반드시 응답해야 하는 실시간 애플리케이션을 처리하기 위해 설계된 운영 체제입니다. 범용 운영 체제(OS)와 달리 RTOS는 시간 제약 내에서 작업이 실행되도록 보장하는 특징이 있습니다.
1 STM32CudeIDE 설정
Pinout & Configuration 탭에서 Middleware and Software Packs 아래에 있는 FREERTOS를 선택합니다. 처음에는 Disable로 설정되어 있을 텐데, 이를 CMSIS_V2로 변경합니다.
CMSIS_V2로 변경하면 기본 설정 값으로 자동으로 셋팅됩니다. 이 상태에서 바로 Code Generation을 시도하면 아래와 같은 경고창이 나타납니다.
경고: 코드 생성
첫 번째 경고는 RTOS를 사용할 때 systick이 아닌 다른 HAL 타임베이스 소스를 사용하는 것이 권장된다는 내용입니다.
System Core에서 SYS의 Timebase Source를 변경해야 합니다. 사용할 수 있는 타이머는 systick부터 TIM1~TIM7까지 다양한데, 적절한 타이머는 각 칩의 설정된 타이머 정보를 참고하여 선택합니다.
STM32G474B/C/xE 시리즈의 타이머 기능을 고려해 Basic type 타이머인 TIM6 또는 TIM7 중 하나로 설정합니다. 이 타이머들은 Complementary outputs을 지원하지 않으므로 적합한 선택지입니다.
또한, 새로운 라이브러리가 재진입하도록 하려면 USE_NEWLIB_REENTRANT 설정을 활성화해야 합니다. 이는 FreeRTOS > Advanced Settings에서 설정할 수 있으며, 이 옵션은 RAM 사용량을 증가시킵니다.
설정을 마친 후 코드 생성을 다시 시도하면 경고 없이 진행되며, RTOS가 정상적으로 설정됩니다. 이때 기본 Task가 main.c에 생성된 것을 확인할 수 있습니다.
2 Task 생성
FREERTOS Mode and Configuration 창에서 Add 버튼을 눌러 Task를 생성할 수 있습니다.
Task 이름과 Stack 크기 등을 설정한 후 Task를 생성합니다.
생성된 Task는 코드에 추가된 것을 확인할 수 있습니다. 이제 Task가 어떻게 동작하는지 예시 코드를 작성해 확인해 보겠습니다.