인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

WNTH2014님의 프로필 이미지
WNTH2014

작성한 질문수

FreeRTOS 프로그래밍

타이머 관련 궁금한게 있습니다.

작성

·

78

1

ARM에서 C언어로 FreeRTOS를 구동시키고 있습니다.

목표: Timer를 필요할 때만 생성하여 사용한 뒤, 필요 없는 경우 삭제


TimerHandle_t xRTOSTimerA;
BaseType_t xStatus = xGetStatus();

if(xStatus == pdTRUE)
{
    xRTOSTimerA = xTimerCreate("TIMER A", pdMS_TO_TICKS(300), pdTRUE, (void *)0, prvRTOSTimerACallback);
}
else
{
    vTimerDelete(xRTOSTimerA, 0);
}

 

질문 1. xTimerCreate를 통해 Timer를 생성한 뒤 vTimerDelete 함수를 사용해 삭제해도 TimerHandle은 여전히 메모리가 할당된 채 살아있는 거같습니다. vTimerDelete의 동작 이해를 잘못하고있는건가요?

질문 2. 위와 같이 소스코드를 작성하여도 메모리 반환이 제대로 이루어지지않는것 같습니다. TimerHandle의 경우 메모리 해제가 불가능한것인가요?

답변 1

0

홍영기님의 프로필 이미지
홍영기
지식공유자

안녕하세요. WNTH2014님!

질문하신 내용을 찾아본 결과,
xTimerCreate 함수에서 타이머객체가 동적으로 생성되고, xTimerDelete 함수에서 메모리 해제를 하는 것이 아래 소스(timers.h, timers.c)를 보면 확인됩니다.

image.pngimage.png

추가 질문 사항이 있으시면 다시 글 남겨주세요. ^^

WNTH2014님의 프로필 이미지
WNTH2014
질문자

답변 감사합니다. xTimerDelete 함수를 사용해서 메모리 해제를 시도해보았는데

TimerHandle_t은 여전히 메모리에서 해제가 안된것처럼 보입니다.

찍어주신 소스코드에서 vPortFree를 수행하긴하는데 다른 문제가 있는걸까요?

심지어 삭제 된 후에도 xTimerStart 를 사용하면 타이머가 정상 동작까지합니다.

void prvTestTask(void *pvParameters)
{
    static BaseType_t xTimerAStarted = pdFALSE;

    xTimerA = xTimerCreate("TIMER A", pdMS_TO_TICKS(1000), pdTRUE, NULL, prvTimerCallback);
    xTimerB = xTimerCreate("TIMER B", pdMS_TO_TICKS(1000), pdTRUE, NULL, prvTimerCallback);

    xTimerStart(xTimerA, portMAX_DELAY);
    xTimerStart(xTimerB, portMAX_DELAY);
    
    while (1)
    {
        vTaskDelay(pdMS_TO_TICKS(5000)); 
        
        if(xTimerAStarted == pdFALSE)
        {
            xTimerDelete(xTimerB, portMAX_DELAY); 
            xTimerAStarted = pdTRUE;
        } 
    }
}
타이머해제전.png

▲ 타이머 삭제 전 TimerHandle_t 상태 및 Tmr Svc Task 스택 상황

 

타이머해제후.png

▲ 타이머 삭제 후 TimerHandle_t 상태 및 Tmr Svc Task 스택 상황

WNTH2014님의 프로필 이미지
WNTH2014

작성한 질문수

질문하기