본문 바로가기
임베디드 관련/FreeRTOS

[FreeRTOS] Task의 Stack 최적의 사이즈 설정

by minhyeok.lee 2024. 5. 30.
반응형

FreeRTOS에서 Task의 적절한 Stack Size 설정

1. 작업은 xTaskCreate() 또는 xTaskCreateStatic() API 함수를 사용하여 생성할 수 있다.

2. 함수의 usStackDepth 매개변수는 생성 중인 작업에 할당될 스택의 크기를 지정한다.

  - 이떄 단위는 byte가 아니고 word이다.

3. 필요한 스택 양은 다음 애플리케이션별 매개변수에 따라 달라진다.

4. 스케줄러가 다른 작업을 실행하기 위해 작업 실행을 일시적으로 중지할 때마다 프로세서 컨텍스트가 작업 스택에 저장된다.

5. 저장된 프로세서 컨텍스트는 다음에 작업이 실행될 때 작업 스택에서 제거된다.

6. 프로세서 컨텍스트를 저장하는 데 필요한 스택 공간은 RTOS 자체에서 발생하는 작업의 스택 요구 사항에 추가되는 유일한 공간이다.

7. 작업을 할당할 스택의 양을 결정하는 것은 쉽지 않지만 RTOS는 실용적인 시행착오 접근 방식을 통해 작업의 스택 크기를 조정할 수 있는 기능을 제공한다.

8. uxTaskGetStackHighWaterMark() API 함수를 사용하면 실제로 사용된 스택의 양을 확인할 수 있으므로 필요한 것보다 더 많이 할당된 경우 스택 크기를 줄일 수 있으며 스택 오버플로 감지 기능을 사용하여 스택이 너무 작은지 확인할 수 있다.

9. uxTaskGetSystemState() API 함수 또는 수많은 FreeRTOS 인식 IDE 플러그인 중 하나를 사용하여 모든 RTOS 작업의 스택 사용량을 한 번에 볼 수 있다.

10. FreeRTOS 다운로드에는 각 포트에 대한 데모 애플리케이션이 포함되어 있으며, 각 데모 애플리케이션과 함께 제공되는 FreeRTOSConfig.h 파일은 configMINIMAL_STACK_SIZE 라는 상수를 정의한다.

11. 포트의 데모 애플리케이션에 사용된 configMINIMAL_STACK_SIZE 설정보다 작은 스택에는 작업을 할당하지 않는 것이 좋다.


 

FreeRTOS에서 Task의 적절한 Stack Size 설정예제

uxTaskGetStackHighWaterMark() 사용하여 스택사이즈 설정

1. FreeRTOS에서 메모리 최적화를 위해 Task의 Stack Size 설정이 필요하며 최적화된 크기로 설정해야 한다.

2. uxTaskGetStackHighWaterMark()를 이용하면, 동작하고 있는 Task의 여유 Stack 사이즈를 확인 할 수 있다.

3. Return되는 값은 Word 단위로 Stack Size가 반환된다.

4. Return되는 값이 0인 경우, Stack Overflow가 발생하고 이는 사용가능한 Stack이 남아 있지 않다는 의미이다.


uxTaskGetStackHighWaterMark() 사용 예제

 

1. FreeRTOSConfig.h에 아래와 같이 설정

#define INCLUDE_uxTaskGetStackHighWaterMark 1

 

2. 남은 Stack Size를 확인하고 싶은 Task에 uxTaskGetStackHighWaterMark 함수를 수행하고 리턴 되는 값을 확인 하면 남은 Stack Size(Word 단위)를 알 수 있다.

void vTaskStackExample( void* pvParameters )
{
    UBaseType_t uxHighWaterMark;

    /* Task 진입시 자체적으로 uxHighWaterMark를 검사한다. */
    uxHighWaterMark = uxTaskGetStackHighWaterMark( NULL );

    for( ;; )
    {
        /* 임의의 함수를 호출하는 영역*/
        vTaskDelay( 1000 );

	/* 함수를 호출하면 일부 스택 공간이 사용되었을 것이므로
	작업을 입력할 때 호출한 값보다 낮은 값을 반환할 것으로 예상된다.*/
        uxHighWaterMark = uxTaskGetStackHighWaterMark( NULL );
    }
}
반응형

댓글