stack overflow

FreeRTOS의 태스크 내에서 printf를 사용하는 경우 stack 크기를 512이상 정도 크게 잡아줘야 한다. 그렇지 않으면 stack overflow가 발생하여 메모리의 다른 영역에 덮어 써져 프로그램이 오동작 하는 경우가 발생 할 수 있다.

printf의 인자가 없는 경우 _puts_r함수를 사용하지만 인자가 있는 경우 _vfprintf_r이 호출 된다.  _puts_r은 스택을 많이 사용하지 않지만 _vfprintf_r은 스택을 많이 사용한다.

Task Run Time Stats

FreeRTOS에서 vTaskGetRunTimeState() 함수를 사용하면 각 태스크들의 점유율을 볼 수 있다.  이 함수를 사용하기 위해서는 FreeRTOSConfig.h에 configGENERATE_RUN_TIME_STATS 값을 1로 정의 해야 하며 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS 함수 와 portGET_RUN_TIME_COUNTER_VALUE 함수를 정의 해 주어야 한다.

portCONFIGURE_TIMER_FOR_RUN_TIME_STATS함수는 말 그대로 run time states에 사용할 counter를 설정하고 portGET_RUN_TIME_COUNTER_VALUE는 현재 count값을 리턴하면 된다.  counter의 클럭 주파수는 시스템 클럭보다 10배에서 100배 더 빠르게 설정해야 태스크의 정유율의 정확도가 높아 진다.

다음은 vTaskGetRunTimeStats()함수를 실행 하였을 때의 출력 결과 이다.

[ATMEL] top
Name            Count           Percent
--------------------------------------------
CLI             36340437         84%
IDLE            27              <1%
KEY             6735            <1%
SM              6214            <1%
WRITE           183533          <1%
READ            612338          1%
pf_ISR          5870306         13%
LED             1743            <1%

Task List

FreeRTOS에서 현재 실행되는 Task들의 정보를 볼 수 있는 방법이 있어 구현 하였다.

FreeRTOSConfig.h 파일의 configUSE_TRACE_FACILITY 를 1로 정의 하면 vTaskList라는 함수를 사용 할 수 있다.  다음과 같이 커맨드를 추가 하여 Task정보를 볼수 있도록 하였다.

void static sys_cmd_task()
{
 char info[1000];
 printf("Name            State   Pr      Stack   Num n");
 printf("--------------------------------------------");
 vTaskList(info);
}

 다음은 출력 내용이다.  State는 Task의 현재 상태를 나타내며, Pr은 우선순위를, Stack은 스택의 나머지를 Num은 각 task 의 대응되는 번호이다.

[ATMEL] task
Name            State   Pr      Stack   Num
--------------------------------------------
CLI             R       1       481     1
IDLE            R       0       162     7
LED             B       1       985     6
KEY             B       3       983     2
SM              B       2       985     5
WRITE           B       4       973     4
READ            S       4       584     3
host_ISR       S       15      525     0