개발

[ FreeRTOS ] xTaskCreate 사용방법

캡스락 2020. 1. 21. 16:41

 

FreeRTOS

 

ESP8266 FreeRTOS 써보다 한글로 정리해둔 곳이 없는 것 같아 공부할겸 정리해봤습니다 ㅋㅋㅋ

FreeRTOS 홈페이지 원문을 기반으로 작성했습니다.

소개

 BaseType_t xTaskCreate(    TaskFunction_t pvTaskCode,
                            const char * const pcName,
                            configSTACK_DEPTH_TYPE usStackDepth,
                            void *pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t *pxCreatedTask
                          );

새로운 태스크를 만들고 태스크 리스트에 추가하여 실행될 수 있도록 합니다. 이 RTOS API 기능을 사용하기 위해서는 FreeRTOSConfig.h 파일에서 configSUPPORT_DYNAMIC_ALLOCATION 이 1로 설정되어 있거나, 정의되지 않은 상태로 남겨져야 합니다. (기본값은 1입니다.)

각 태스크는 태스크의 상태를 유지하고, 태스크에서 스택으로 사용하기 위한 메모리가 필요합니다. 태스크가 xTaskCreate()를 이용하여 만들어진 경우, 메모리는 FreeRTOS 힙에서 자동으로 할당됩니다. 그러나, 태스크가 xTaskCreateStatic()을 이용하여 만들어진 경우에는 개발툴이 지정한 크기의 메모리가 할당되므로, 컴파일시 정적으로 할당될 수 있습니다. 정적 vs 동적 할당 페이지에서 상세한 내용을 읽어보세요.

FreeRTOS-MPU를 사용하신다면 xTaskCreate() 대신, xTaskCreateRestricted() 사용을 권장합니다.

(참고: 여기서의 MPU는 Memory Protection Unit을 의미합니다)

인자

pvTaskCode 태스크 시작 포인터 (단순히 태스크가 구현된 함수의 이름, 아래의 예제 확인)
태스크들은 일반적으로 무한 루프로서 구현되며, 리턴이나 종료 기능이 구현되어 있으면 안 됩니다.
또한, 태스크는 자기 자신을 지울 수도 있습니다.
pcName 태스크 이름의 부제목. 디버깅을 용이하게 하는데 주로 사용하지만 태스크 핸들을 얻는 데 사용할 수도 있습니다.
이름의 최대 길이는 FreeRTOSConfig.h 파일의 configMAX_TASK_NAME_LEN 인수로 지정합니다.
usStackDepth 태스크의 스택에게 할당해 줄 WORD의 수 (바이트가 아닙니다!)
예를 들어, 스택이 16 비트 폭과 usStackDepth이 100 이라면, 총 200 바이트가 해당 태스크의 스택으로서 할당될 것입니다.
다른 예로, 32 비트의 폭을 가진 스택이 usStackDepth 값이 400이라면, 총 1600 바이트가 태스크의 스택에 할당될 것입니다.
스택 폭 값에 곱해진 스택 깊이 값은 size_t 타입 변수가 나타낼 수 있는 최대 값을 초과하면 안 됩니다.
pvParameters 생성된 태스크의 인수로서 전달될 값입니다.
pvParameters가 변수의 주소로 지정될 경우 해당 변수는 생성된 태스크가 실행될 때 까지 존재해야 합니다. 그러므로 스택 변수의 주소를 전달하는 것은 유효하지 않습니다.
uxPriority 생성된 태스크가 실행 될 때의 우선 순위입니다.
MPU를 가진 시스템은 선택적으로 portPRIVILEGE_BIT를 설정함으로써 uxParrity를 통해 전 권한 제공 모드에서 태스크를 만듭니다.
예를 들어, 우선 순위 2를 가지는 특권 태스크를 만들기 위해 uxPriority 를 ( 2 | portPRIVILEGE ) 로 지정합니다.
pxCreatedTask xTaskCreate()로 생성된 태스크에 핸들을 전달하기 위해 사용됩니다.
pxCreatedTask는 선택값이며 NULL로 지정될 수 있습니다.

(참고: WORD의 크기는 CPU가 한 번에 처리할 수 있는 데이터의 크기입니다.

ESP8266의 경우 32bit CPU를 가졌으므로 1 WORD = 32 bit입니다.

반환값

태스크가 문제 없이 생성된 경우 pdPASS가 반환되고, 그렇지 않은 경우 errCOULD_NOT_ALLOCATE_MEMORY가 반환됩니다.

사용 예

/* 생성될 태스크 */
void vTaskCode( void * pvParameters )
{
    /* 아래 xTaskCreate() 호출에서 pvParameters 값에 1이 전달되면 매개변수 값은 1이 됩니다. 
    configASSERT( ( ( uint32_t ) pvParameters ) == 1 );

    for( ;; )
    {
        /* 태스크 코드 */
    }
}

/* 태스크 생성 함수 */
void vOtherFunction( void )
{
BaseType_t xReturned;
TaskHandle_t xHandle = NULL;

    /* 태스크를 생성하고 핸들을 저장합니다. */
    xReturned = xTaskCreate(
                    vTaskCode,       /* 태스크를 구현한 함수 */
                    "NAME",          /* 태스크의 이름 */
                    STACK_SIZE,      /* 워드수로 나타낸 스택의 크기 (바이트 아님) */
                    ( void * ) 1,    /* 태스크에게 전달될 인자 */
                    tskIDLE_PRIORITY,/* 태스크에게 부여할 처리 우선 순위 */
                    &xHandle );      /* 생성된 태스크의 핸들을 전달받기 위해 사용 */

    if( xReturned == pdPASS )
    {
        /* 태스크가 만들어졌습니다. 태스크의 핸들을 이용하면 태스크를 삭제할 수 있습니다. */
        vTaskDelete( xHandle );
    }
}

'개발' 카테고리의 다른 글

프로그래밍 공부, 연습사이트 추천  (0) 2020.01.26