사용하는 보드와 freeRTOS 버전 정보, 진행 내용 등에 대한 정보는 github에 있습니다. (계속 업데이트 중..)
https://github.com/fish9903/FreeRTOS-STM32G4
GitHub - fish9903/FreeRTOS-STM32G4: FreeRTOS (Real Time Operating System) on STM32G474(ARM cortex M4 based mircocontrollers)
FreeRTOS (Real Time Operating System) on STM32G474(ARM cortex M4 based mircocontrollers) - GitHub - fish9903/FreeRTOS-STM32G4: FreeRTOS (Real Time Operating System) on STM32G474(ARM cortex M4 based...
github.com
이번엔 FreeRTOS의 Task(Delete, Suspend, Notify)에 대해 알아보자
1. Delete
Task를 삭제시킬 때는 vTaskDelete(TaskHandle_t) API를 사용한다. 인자로 삭제시키고 싶은 task를 넘겨주면 된다. NULL을 넘겨준다면 자기자신(호출한)을 삭제한다.
자기자신을 삭제하는 과정을 좀 다르게 동작한다.
Task는 자기자신을 삭제할 수 없다. 따라서 다른 task가 이를 삭제하도록 하는데, 이 다른 task가 Idle task이다.
Idle task는 이전 포스트 에서 살펴봤듯이, 다른 task가 실행되지 않을 때 실행되면서 삭제할 task가 있으면 이에 대한 메모리 해제 작업을 한다. 여기서 삭제할 task는 자기자신을 삭제하는 task이다.

Idle task는 prvCheckTasksWaitingTermination()을 호출한다. 여기서 uxDeletedTasksWaitingCleanup변수가 0보다 크면 삭제할 task가 있다고 판단한다.

xTaskDelete() 내부를 보면 자기 자신을 삭제하는 경우 이 변수 값을 증가시키는 것을 볼 수 있다.
2. Notification
Task notification은 task간 통신과 동기화를 위해 사용되는 매커니즘이다.
FreeRTOS에서는 이를 위한 xTaskNotify()와 xTaskNotifyWait() API를 제공하고 있다.
이름에서 유추할 수 있듯이 xTaskNotify()는 notification event를 보내는 동작, xTaskNotifyWait()는 notification event를 기다리는 동작을 한다. (기다리는 동안은 block 상태)
API 문서
3. Notification example(with task delete/suspend)
두 개의 task가 notification을 이용해 통신하는 예제를 보자.
목표) 버튼 눌러서 led toggle on/off
1. 2개 task 생성(green led toggle task, button task)
2. task끼리 notification통신하며 toggling on/off

2개 task 생성 후 scheduler 호출
이때 버튼 handle task는 led toggle task보다 우선순위가 높아야 한다. 그래야 버튼 누르는 것 바로 감지할 수 있음

button_handler() 코드
버튼이 눌렸는지 확인하고 눌렸다면 green led를 on/off 한다.
LED_green_on변수값 변경 전후로 vTaskSuspendAll(), xTaskResumeAll()은 scheduler를 suspend하고 resume하는 역할을 한다.
LED_green_on변수는 전역 변수이기때문에 값 변경 도중 scheduler 호출을 막기 위함

led_green_handler 코드
status 변수로 notification을 받았는지 확인하고 받았다면 on-->off 한다.
vTaskDelete()를 한다면 led가 아예 꺼진다.
동작 영상
'임베디드 > 임베디드 프로젝트' 카테고리의 다른 글
FreeRTOS 들여다보기5 - Task1(task state, delay) (0) | 2023.08.27 |
---|---|
FreeRTOS 들여다보기4 - Scheduler2(Context switching) (0) | 2023.08.25 |
FreeRTOS 들여다보기3 - Scheduler1 (0) | 2023.08.21 |
FreeRTOS 들여다보기2 - Task creation (0) | 2023.08.20 |
FreeRTOS 들여다보기1 - RTOS란? (0) | 2023.08.11 |