반응형

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 동안 taskblocked .
환경에 따라 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 동안 taskblocked .
(*) 해당 함수 호출 시점과 관계없이 절대적 시간 주기에 맞춰 blocked .

void vTaskSuspend( TaskHandle_t xTaskToSuspend )
xTaskToSuspend Task를 중지 시킴. 우선순위에 관계없이 CPU 자원을 할당 받지 못함.
TaskHandle 입력. (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.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기