inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

ESP32 IoT 개발 기초 - 하드웨어부터 FreeRTOS까지

섹션7에서 개념적 궁금증

해결된 질문

15

박주형

작성한 질문수 1

0

섹션/강의: 섹션 7 FreeRTOS 기초
문제 상황: 개념적인 궁금증들입니다!

  1. Task Notification
    ulTaskNotifyTake -> pdFalse(유지) / pdTrue(초기화)


    이 예시에서 pdFalse를 하면 1->2->3->4 순으로 출력될 것을 예상했었는데 4->3->2->1 순으로 출력된 것을 확인했습니다. 왜 카운트 다운이 되는지 궁금합니다.


  2. xSemaphoreGive / context switching
    xSemaphoreGive 이후에 우선순위가 같으면 컨텍스트 스위칭이 바로 보장되지 않음.

    그러면 우선순위가 다르면 바로 컨텍스트 스위칭이 되나요?


c iot FreeRTOS esp32

답변 1

0

문용준

  1. Task Notification


    예를 들어 아래처럼 Notification이 4번 발생했다고 가정하겠습니다.


    xTaskNotifyGive(receiveHandler);
    xTaskNotifyGive(receiveHandler);
    xTaskNotifyGive(receiveHandler);
    xTaskNotifyGive(receiveHandler);

    xTaskNotifyGive는 대상 Task의 notification Value를 1씩 증가시킵니다. 따라서 대상 Task가 중간에 실행되지 않았다면 내부 값은 다음처럼 변합니다.

    
    초기 값 : Notification count = 0;
    첫 번째 xTaskNotifyGive count 0 -> 1;
    두 번째 xTaskNotifyGive count 1 -> 2;
    세 번째 xTaskNotifyGive count 2 -> 3;
    네 번째 xTaskNotifyGive count 3 -> 4;

    즉, 4번의 Notification이 발생했다는 것을 FreeRTOS가 별도의 이벤트 4개로 저장하는 것이 아니라, Notifcation count = 4라는 카운터 하나로 저장합니다.


    여기서 출력을 하면 아래와 같습니다.

    int count = ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
    printf("received notification %d times\n", count);
    

    여기서 pdFALSE의 의미는 Notifcation count를 하나 감소시키는 것입니다.


    그렇기 때문에 출력은 4->3->2->1로 진행이 됩니다.
    1->2->3->4로 생각하기 쉬운것은 xTaskNotifyGive()가 실행되는 시점만 보면 실제로 내부 값이 0->1->2->3->4로 증가하기 때문입니다. 하지만 ulTaskNotifyTake()가 호출될 때는 이미 4까지 누적된 상태이고, pdFALSE는 이 값을 하나씩 소비하는 동작입니다.
    xTaskNotifyGive()는 카운터 증가를, ulTaskNotifyTake(pdFALSE)는 카운터를 하나씩 소비한다고 생각하면 이해하기 쉽습니다.



  2. xSemaphoreGive / Context switching
    결론부터 말씀드리면 xSemaphoreGive()로 Block 상태의 더 높은 우선순위 Task가 준비되면, preemptive scheduling이 활성화된 ESP-IDF 환경에서는 더 높은 우선순위 Task로 전환될 수 있습니다. ESP-IDF의 기본 FreeRTOS 설정은 configUSE_PREMMPTION = 1이고 time slicing도 활성화되어 있습니다.
    다만 이에 대한 조건이 중요합니다.


    예를 들어 Task 2개가 있다고 가정하겠습니다.

    Task_A / Priority = 1
    Task_B / Priority = 2

    Task B가 semaphore를 기다리고 있습니다.

    
    void Task_B(void *arg)
    {
        while (true)
        {
            xSemaphoreTake(sem, portMAX_DELAY);
            printf("B\n");
        }
    }
    

    현재 상태는 아래와 같습니다.

    Task_A : Running / Priority = 1
    Task_B : Blocked / Priority = 2

    이 때 TASK A 아래를 실행하고 있습니다.

    void Task_A (void *arg)
    {
        while (true)
        {
            printf("A1\n");
            xSemaphoreGive(sem);
            printf("A2\n");
        }
    }

    xSemaphoreGive가 호출되면 semaphore를 기다리던 Task B가 Blocked에서 Ready상태가 됩니다.
    그 순간 Ready Task를 비교하면 아래와 같습니다.

    
    현재 실행 중 Task A : Priority 1
    새로 Ready  Task B : Priority 2

    FreeRTOS는 preemptive scheduler이므로 높은 Prioirty 2 Task가 Priority 1 Task를 선점할 수 있습니다. FreeRTOS 스케쥴링 설명에서도 높은 우선순위 Task가 Ready가 되면 현재 Task를 preempt할 수 있다고 나와있습니다. FreeRTOS scheduling (single-core, AMP and SMP) - FreeRTOS™


    따라서 실행 순서는 아래와 같이 됩니다.

    
    1. Task A : printf("A1"); // A1 출력
    2. xSemaphoreGive()
    3. Task B : Blocked -> Ready
    4. Priority 비교 // Task_B(2) > Task_A(1)
    5. Context Switch 발생
    6. Task B Run : printf("B");
    7. B가 다시 Blocked // 또는 Yield
    8. Task A : printf("A2");

    즉 출력이 A1, B, A2가 나오면서 Task_A에 있던 xSemaphoreGive의 다음 줄의 printf("A2")보다 B가 먼저 실행되는 상황이 발생할 수 있습니다.

Flash 메모리 전원 껐을 때

0

14

1

26년2회 실기기출은 언제쯤...

0

38

2

이론 공부법 요약본 버전 업데이트 문의

0

35

2

14강 PCB 배선 및 검사 파트 질문

0

30

1

PCB보드 주문 비용

0

38

1

8강 회로도 설명 2 강의 부분 질문

0

34

1

정처기 필기 준비할때 이 이론을 다시 외워도 될까요?

0

56

2

화면에 안 나오는게 있어요

0

36

1

최댓값 구하기(서바이벌)에서 수식 구성에 대한 질문

0

43

2

Trace32 function 함수 조회 Makefile 수정 부분

0

36

1

조건 반복문 질문: for 문 ?

0

66

1

정처기 26-2회. 9번 질문드립니다!

0

85

1

이론 보면서 질문이 있습니다.

0

81

2

정보처리기사 실기 26년 2회 SRT 스케줄링 문제 단위 질문

0

93

2

유튜브(정보처리기사 실기 | 26년 2회 기출문제 코드 해설)

0

153

2

262 정처기 실기 C언어코딩

0

50

1

정보처리기사 262 실기 Hash(해시) 질문

0

84

2

static 변수 질문입니다.

0

64

2

파이썬 4강 질문입니다.

0

73

2

모의고사 1회 3번문제

0

95

3

LM75A에 대한 온도 값 음수 적용 부분 질문 드립니다.

0

116

1

강의 영상 음성 겹치는 문제가 있습니다.

0

90

1

VS Code에서 ESP-ide extension 설치 후 명령 팔레트 안뜸

0

351

3

[수강 전 준비 사항 관련]

0

131

1