1. FreeRTOS란?
15년 동안 세계 최고의 칩 기업들과 협력하여 개발되어 현재 170초마다 다운로드되는 FreeRTOS는 마이크로컨트롤러 및 소형 마이크로프로세서를 위한 시장 최고의 실시간 운영 체제 (RTOS)라고 합니다.
FreeRTOS는 이름 그대로 무료 오픈 소스 프로젝트이며 상용 및 개인 프로젝트에서 사용 가능합니다.
FreeRTOS(Real Time Operating System)는 임베디드 환경에서 구동되는 OS로
가장 중요한 특징은 임베디드 환경에서 쓰레드 프로그래밍 같은 기능을 동작시킬 수 있다는 것입니다.
2. Semaphore / Mutex
2.1 Mutex
한 쓰레드, 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호 배제 기법
- 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것.
- 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 Synchronized 또는 lock을 사용한다.
- 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.
2.2 Semaphore
현재 공유자원에 접근할 수 있는 쓰레드, 프로세스의 수를 나타내는 값을 두어 상호 배제를 달성하는 기법
- 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것.
- 사용 중이지 않는 자원의 경우 그 프로세스가 즉시 자원을 사용할 수 있다.
- 공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있다.
3. Message Queue
Inter Process Communication : Task와 Task 간의 소통 방법
1) Semaphore
2) Event Flag
3) Message box(queue)
4. FreeRTOS.h 함수
configUSE_PREEMPTION | 1로 선언하면 선점형 스케 줄링 기법을 사용한다. |
configCPU_CLOCK_HZ | CPU의 동작 속도를 Hz로 정의한다. |
configTICK_RATE_HZ | 틱 타이머 인터럽트가 생성되는 주파수를 Hz로 정의한다. 통상 1000 이상의 값으로 정의한다. |
configMAX_PRIORITIES | 태스크에 사용할 우선 순위의 최고 값을 정의한다. |
configMINIMAL_STACK_SIZE | 태스크에 할당할 STACJ의 최소 크기를 portSTACK_TYPE 단위로 정의하며, 아이들 태스크(Idle Task)를 위해 사용한다. |
configTOTAL_HEAP_SIZE | 동적으로 관리할 메모리의 크기를 portSTACK_TYPE 단위로 정의한다. 이 영역을 이용하여 각 태스크에 STACK을 할당한다. |
configMAX_TASK_NAME_LEN | xTaskCreate() 에서 지정하는 태스크 이름의 최대 글자 수를 정의한다 |
configUSE_MUTEXES | MUTEXES 관련 API를 사용할 경우 1로 정의한다. |
configUSE_CO_ROUTINES | COROUTINE 을 사용할 때 1로 정의한다 |
configUSE_IDLE_HOOK | 1로 설정할 경우, 아이들 태스크가 실행 될 때 자동으로 호출되는 vApplicationIdleHook() 함수를 사용할 수 있게 된다. |
configUSE_TICK_HOOK | 1로 설정할 경우, vApplicationTickHook() 함수를 사용할 수 있게 되며, 틱 타이머 인터럽트 처리 루틴에서 vTaskIncrementTick() 루틴를 호출할 때 자동으로 수행된다. |
INCLUDE_vTaskPrioritySet | 1로 선언하면 vTaskPrioritySet() 루틴을 사용할 수 있게 된다. |
INCLUDE_uxTaskPriorityGet | 1로 선언하면 uxTaskPriorityGet() 루틴을 사용할 수 있게 된다 |
INCLUDE_vTaskDelete | 1로 선언하면 vTaskDelete() 루틴을 사용할 수 있게 된다. |
INCLUDE_vTaskSuspend | 1로 선언하면 vTaskSuspend() 루틴을 사용할 수 있게 된다. |
INCLUDE_vTaskDelayUntil | 1로 선언하면 vTaskDelayUntil() 을 사용할 수 있게 된다. |
INCLUDE_vTaskDelay | 1로 선언하면 vTaskDelay() 를 사용할 수 있게 된다. |
5. Task.c 함수
portBASE_TYPE xTaskCreate (pdTASK_CODE pvTaskCode ,const char *pcName ,unsigned short usStackDepth ,void *pvParameters ,unsigned portBASE_TYPE uxPriority ,xTaskHandle *pvCreatedTask ); |
pvTaskCode | task의 기능이 선언된 함수의 함수포인터. |
pcName | 디버깅 용도로 사용하는 문자열이며 task의 이름. |
usStackDepth | task마다 할당되는 stack 메모리. 단위는 WORD이며 ARM Cortex-M보드(1WORD == 4Byte) |
pvParameters | task 함수로 전달할 매개변수를 말함. (없다면 NULL) 전달할 매개변수를 (void*) 타입으로 캐스팅한 뒤 이 곳에 넣어주면 task 함수에서 사용할 수 있음. |
pxCreatedTask | task를 제어하기 위한 TaskHandle_t 타입 핸들을 말함. Task의 우선순위를 바꾸거나 멈추는 등 task에 대한 설정은 모두 이 핸들을 통해서 이루어짐. |
void vTaskDelete( xTaskHandle pxTaskToDelete); |
pxTaskToDelete | task의 기능이 선언된 함수의 함수포인터. |
void vTaskDelay( const TickType_t xTicksToDelay ) |
xTicksToDelay | 설정된 xTicksToDelay 동안 task가 blocked 됨. 환경에 따라 1-Tick이 다를 수 있으므로 pdMS_TO_TICKS(xTimeInMs) 사용 권장. (*) 해당 함수 호출 시점부터 설정한 시간 후 blocked 됨. |
void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) |
pxPreviousWakeTime | pxPreviousWakeTime의 값 부터 xTimeIncrement 의 시간 만큼만 block 수행. Task가 blocked 상태에서 깨어나는 순간 자동으로 업데이트 됨. |
xTimeIncrement | 설정된 xTimeIncrement 동안 task가 blocked 됨. (*) 해당 함수 호출 시점과 관계없이 절대적 시간 주기에 맞춰 blocked 됨. |
void vTaskSuspend( TaskHandle_t xTaskToSuspend ) |
xTaskToSuspend | Task를 중지 시킴. 우선순위에 관계없이 CPU 자원을 할당 받지 못함. Task의 Handle 입력. (NULL 입력 시 함수가 호출된 task 중지) |
void vTaskResume( TaskHandle_t xTaskToResume ) |
xTaskToResume | Suspend로 중지된 Task를 재개(Resume) 함. Task의 handle 입력. (NULL 입력 시 함수가 호출된 task 재개) |
void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) |
xTask | 수정 할 Task의 핸들 입력. (NULL 입력 시 함수가 호출된 task의 우선순위 변경) |
uxNewPriority | Task에 부여 할 우선 순위 value. |
최근댓글