섹션7에서 개념적 궁금증
섹션/강의: 섹션 7 FreeRTOS 기초
문제 상황: 개념적인 궁금증들입니다!
Task Notification
ulTaskNotifyTake -> pdFalse(유지) / pdTrue(초기화)
이 예시에서 pdFalse를 하면 1->2->3->4 순으로 출력될 것을 예상했었는데 4->3->2->1 순으로 출력된 것을 확인했습니다. 왜 카운트 다운이 되는지 궁금합니다.xSemaphoreGive / context switching
xSemaphoreGive 이후에 우선순위가 같으면 컨텍스트 스위칭이 바로 보장되지 않음.그러면 우선순위가 다르면 바로 컨텍스트 스위칭이 되나요?
답변 1
0
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)는 카운터를 하나씩 소비한다고 생각하면 이해하기 쉽습니다.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 = 2Task 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 2FreeRTOS는 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





