Task Manangement

hyeony·2025년 8월 25일

RTOS

목록 보기
2/8

1. The Task Function

Task는 단순히 C 함수로 구현된다. 특별한 점은 함수의 prototype인데, 반환형이 반드시 void여야 하고, parameter로는 void* 타입의 포인터를 받아야 한다. prototype은 다음과 같이 작성된다.

void ATaskFunction(void *pvParameters);

Task Function은 보통 무한 루프(while(1)) 내에서 실행된다. 만약 Task가 더 이상 필요하지 아니하다면 반드시 삭제(delete)해야 한다.

같은 함수 정의를 이용하더라도, xTaskCreate() 같은 API를 호출할 때마다 새로운 Task Instance가 만들어진다. 즉, 하나의 함수 정의로부터 여러 개의 Tasks를 생성할 수 있는 것이다.

이렇게 생성된 각각의 Task는 OS 내에서 독립적으로 실행된다. 독립적이라는 말은 곧 각 Task가 자신만의 실행 환경을 가진다는 뜻이다. 즉, Task마다 별도의 Stack이 할당되고, 함수 내에서 선언된 지역 변수들도 각각 따로 존재한다. 따라서 동일한 함수를 사용하더라도, Task ATask B는 서로 영향을 주지 않고 독립적으로 동작한다.

예를 들어, 함수 안에 counter라는 지역 변수가 있다면, Task AA만의 counter 값을 가지고, Task BB만의 counter 값을 가진다. 두 Tasks는 같은 코드를 공유하지만, 실제 실행되는 데이터와 흐름은 완전히 분리되어 있다.

결국, 하나의 Task Function여러 번 복제 가능한 실행 템플릿이라고 이해할 수 있다. OS는 이 템플릿을 기반으로 원하는 수만큼 Task를 만들고, 각각을 독립된 PG처럼 실행시킨다.

2. Creating a Task

하나의 애플리케이션은 여러 개의 Task로 구성될 수 있다. 만약 애플리케이션을 실행하는 프로세서가 single-core라면, 한 시점에 동시에 실행될 수 있는 태스크는 오직 하나뿐이다. 그렇게 되면 Task는 실행 상태비실행 상태 두 가지 중 하나에 존재하게 된다.

Task비실행 상태에서 실행 상태로 전환되는 것을 switch-in 또는 swap-in되었다고 한다. 반대로, 실행 상태에서 비실행 상태로 전환되는 것을 switch-out 또는 swap-out 되었다고 한다.

TaskFreeRTOS APIxTaskCreate()를 사용하여 생성된다. 이 함수는 기본적으로 BaseType을 반환하는데, FreeRTOS에서 BaseType은 32비트 정수형 타입이다. xTaskCreate() 함수는 총 여섯 개의 parameters를 받는다.

BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
						const char * const pcName,
                        uint16_t usStackDepth,
                        void *pvParameters,
                        UBaseType_t uxPriority,
                        TaskHandle_t *pxCreatedTask );
  • pvTaskCode: Task를 구현한 함수에 대한 포인터

  • pcName: Task의 Description Name. FreeRTOS 내부에서는 사용되지 않으며, 디버깅을 돕기 위해서만 포함.

  • usStackDepth: 스택 크기를 지정한다. 여기서 값은 바이트 단위가 아니라 워드 단위(32비트 자료형)이다. 예를 들어 usStackDepth 값이 100이라면, 400바이트의 스택 공간이 할당된다.

  • pvParameters: Task Function에 전달할 인자

  • uxPriority: Task의 실행 우선순위를 정의. 우선순위는 0(가장 낮은 우선순위)에서 시작해, 상한 값은 FreeRTOSConfig.h 파일에서 정의할 수 있다.

  • pxCreatedTask: 생성된 Taskhandle을 반환받는데 사용된다. 이 Handle을 통해 다른 API 호출에서 해당 Task를 참조할 수 있다. 예를 들어, Task의 우선순위를 변경하거나 Task를 삭제할 때 사용할 수 있다. 만약 이 handle이 필요없다면 NULL로 설정하면 된다.

xTaskCreate() 함수의 반환 값은 다음과 같이 두 가지이다.

  • 1: Task가 성공적으로 생성됨

  • 0: Task가 생성되지 않았음. 대부분 이 경우는 FreeRTOS가 Task 데이터 구조와 스택을 저장할 충분한 RAM을 할당할 수 없을 때 발생한다.

<참고 자료>
https://www.udemy.com/course/arduino-freertos/

profile
Chung-Ang Univ. EEE.

0개의 댓글