inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

문용준님의 게시글

문용준 문용준

@yongjunmoon

수강생
36
수강평
3
강의 평점
5.0

게시글 5

질문&답변

섹션7에서 개념적 궁금증

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 = 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가 먼저 실행되는 상황이 발생할 수 있습니다.

좋아요수
0
댓글수
1
조회수
40

질문&답변

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

확인 감사합니다. 질문 주신 내용이 맞습니다. 현재 강의 코드에서는 부호 비트만 제거하는 단순화된 방식으로 처리되고 있어, 설명드린 내용과 완전히 일치하지 않는 부분이 있습니다. 정확히 확인하지 못한 채 설명드려 혼란을 드린 점 죄송합니다. 좋은 지적 감사합니다. LM75A의 음수 온도 데이터는 단순히 부호 비트만 제외하는 방식이 아니라, 전체 값을 기준으로 2의 보수 처리해야 하기 때문에 아래와 같이 수정하면 영하 데이터도 올바르게 처리할 수 있습니다. int isNeg = 0; if (raw[0] & 0x80) { isNeg = 1; } int16_t data = (raw[0] > 5; float temperature; if (isNeg) { data |= 0xF800; //음수의 경우 상위 비트를 1로 채워 sign extension 진행 data = ~data + 1; //2의 보수 처리 : 비트를 반전(~)하고 1을 더해서 절대값으로 변환 temperature = data * -0.125; // 최종 온도값은 음수이므로 -0.125를 곱해서 적용 } else { temperature = data * 0.125; // 최종 온도값이 양수이므로 0.125를 곱해서 적용 } printf("Temperature : %f\n", temperature); 강의 내용도 해당 부분을 수정해서 다 업로드 하겠습니다.

좋아요수
0
댓글수
1
조회수
118

질문&답변

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

안녕하세요. jjjj님. 최신 버전에서는 해당 기능이 사라진 것으로 확인됩니다. esp-idf welcome 페이지로 이동하신 뒤 Configure extension을 눌러주세요. 그러면 아래와 같이 Install 페이지가 나옵니다. 여기에서 Custom Installation으로 이동하여 Python을 설치해주시고, Select Target에서는 esp32를 선택해주세요. 버전 선택에서는 강의와 같은 5.5 버전을 다운로드 진행을 해주세요. 이후 mirror는 기본 옵션을 선택하여 진행해주세요. Feature에서는 기능 누락이 있을 수 있어 강의를 원활하게 따라가기 위해서는 Optional Features를 모두 다운로드 해주는 것을 추천합니다. Tools에서도 qemu까지 다운로드 받아서 진행해주세요. Path를 설정하고 Start installtion을 눌러 설치를 진행해주시면 됩니다. 설치 진행을 확인하신 뒤 완료가 되면 다음 과정을 진행해주세요.

좋아요수
0
댓글수
3
조회수
368

질문&답변

[수강 전 준비 사항 관련]

안녕하세요. ESP32 보드는 아래 이미지와 동일합니다. 링크는 ESP32 개발 보드 WiFi+Bluetooth 초저전력 소비 듀얼 코어 ESP-32S ESP32-WROOM-32D ESP32-WROOM-32U ESP 32 - AliExpress 502 입니다. 강의에서 사용 했던 모듈 정보들은 구매 링크를 전달 드립니다. LM75A 온도 센서 모듈 : Arduino용 TZT 1/3PCS LM75 LM75A 온도 센서 모듈 - AliExpress 502 블루투스 직렬 모듈 : JDY-31 SPP-C 블루투스 직렬 어댑터 모듈, 무선 통신, 기계 교체, HC-05, HC-06 - AliExpress 502 RTC 모듈 : IIC 모듈 DS3231 AT24C32, 정밀 클록 모듈, DS3231SN 메모리 모듈, DS3231 미니 모듈, 실시간 3.3V/5V, 라즈베리 파이용 - AliExpress 502 1.3인치 Display 모듈 : 1.3 "OLED 모듈 1.3 인치 LCD LED 12864 디스플레이 화면 흰색/파란색 128X64 SPI/IIC I2C SSD1306 SH1106 4Pin 7Pin 128*64 베어 보드 - AliExpress 502 SD카드 리더 모듈 : 마이크로 SD 카드 및 SDHC(고속 카드) 미니 TF 카드 리더 모듈 어댑터 Arduino용 레벨 컨버터 칩이 있는 SPI 인터페이스 - AliExpress 502 FT2232 드라이버 모듈 : FT2232HL 개발위원회 FT2232H 미니 USB 드라이버 무료 개발위원회 - AliExpress 502

좋아요수
0
댓글수
1
조회수
141