FreeRTOS 특징
먼저 RTOS에 대해서는 이전 포스팅을 참고하자.
FreeRTOS는 오픈소스로, 누구나 무료로 사용 및 수정할 수 있고 많은 반도체 제조사와 마이크로 컨트롤러 플랫폼에서 FreeRTOS를 공식적으로 제공한다. 또 커뮤니티가 활발하고 다양한 상용 지원 옵션이 있어 개발이 용이하고 오랜 기간 사용되어 안정성과 신뢰성을 제공한다.
공식 웹 사이트
네이밍 규칙
FreeRTOS에서는 특정 네이밍 규칙을 사용한다.
c | char |
s | int16_t (short) |
i | int32_t (int) |
x | BaseType_t |
u | unsigned |
p | pointer |
먼저 변수는 타입에 따라 접두어를 위와 같이 설정한다.
v | void |
x | BaseType_t |
pv | void* |
prv | private, idle task가 호출하는 콜백 함수 등에서 사용 |
함수는 위 접두어를 사용한다.
매크로명은 그 매크로가 선언된 소스파일의 이름을 따라간다.
태스크
각 task에는 우선순위를 할당한다. 0부터 configMAX_PRIORITIES까지 할당이 가능하며, 우선순위는 숫자의 크기와 비례한다. task는 thread 기반으로 return value가 없고, void* 타입으로 여러 자료형을 매개변수로 받을 수 있다.
Task는 일회용 Task와 주기적 Task가 있다.
일회용 Task는 기능을 한 번 수행한 뒤 마지막에 스스로를 삭제한다
void task_name(void* pvPrameters)
{
...
vTaskDelete(NULL);
}
주기적 Task는 무한 loop가 들어있고, delay 등의 함수로 주기를 조절한다.
void task_name(void* pvPrameters)
{
...
while(true)
{
...
}
}
각 Task 마다 local stack 공간이 할당된다. Stack 메모리는 정적 또는 동적으로 할당이 가능하고, 5가지 방법으로 사용자가 환경설정할 수 있으며, 메모리 단편화를 최대한 막으며 할당한다.
configSUPPORT_DYNAMIC_ALLOCATION, configSUPPORT_STATIC_ALLOCATION 으로 동적 / 정적 할당에 관한 설정을 할 수 있고, task 생성 함수를 xTaskCreate, xTaskCreateStatic 중 어떤 것을 사용하는지에 따라 방법이 바뀐다.
Task 주요 API
xTaskCreate
BaseType_t xTaskCreate(
TaskFUnction_t pvTaskCode,
const char * const pcName,
unsigned short usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask
);
pvTaskCode | Task의 기능이 선언된 함수의 포인터 |
pcName | Task의 이름 (디버깅 용도) |
usStackDepth | Task마다 할당되는 stack 메모리, 1 word 단위 |
pvParameters | Task 함수로 전달할 매개변수 |
uxPriority | Task의 우선순위 |
pxCreatedTask | Task를 제어하기 위한 핸들, 우선순위 변경, stop 명령 등 제어 용도 |
vTaskDelay
void vTaskDelay(const TickType_t xTicksToDelay);
xTicksToDelay | blocked 되도록 지정할 tick 단위 시간 |
설정된 xTicksToDelay 시간 동안 task를 blocked 상태로 만든다.
공식 문서에 따르면, tick 단위 시간 보다는 pdMS_TO_TICKS() 매크로를 사용하여 ms 단위를 tick으로 변환해서 사용하도록 권장한다.
vTaskDelayUntil
void vTaskDelayUntil(TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement);
pxPreviousWakeTime | 마지막으로 task가 깨어난 Tick 시간 저장하는 변수의 포인터 |
xTimeIncrement | blocked 되도록 지정할 tick 단위 시간 |
task가 처음 시작될 때는 pxPreviousWakeTime을 xTaskGetTickCount()로 초기화해줘야 한다. xTimeIncrement는 태스크가 주기적으로 깨어나야하는 주기이다.
'현생 > 임베디드' 카테고리의 다른 글
FreeRTOS - Interrupt (0) | 2024.08.07 |
---|---|
FreeRTOS - 임계 영역 (0) | 2024.08.06 |
임베디드 OS - RTOS란 무엇일까 (0) | 2024.08.04 |
임베디드 개발자에게 필요한 전기 기본 상식 (0) | 2024.08.03 |
임베디드 SW 개요 (0) | 2024.08.02 |