임베디드/임베디드 프로젝트

FreeRTOS 들여다보기6 - Task2(Delete, Suspend, Notifiy)

fish9903 2023. 10. 9. 20:11

사용하는 보드와 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 내부에서 호출하는 함수

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

 

 

xTaskDelete() 내부 코드

xTaskDelete() 내부를 보면 자기 자신을 삭제하는 경우 이 변수 값을 증가시키는 것을 볼 수 있다.

 

2. Notification

Task notification은 task간 통신과 동기화를 위해 사용되는 매커니즘이다.

FreeRTOS에서는 이를 위한 xTaskNotify()xTaskNotifyWait() API를 제공하고 있다.

 

이름에서 유추할 수 있듯이 xTaskNotify()는 notification event를 보내는 동작, xTaskNotifyWait()는 notification event를 기다리는 동작을 한다. (기다리는 동안은 block 상태)

 

API 문서

xTaskNotify()

xTaskNotifyWait()

 

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

 

 

create task

2개 task 생성 후 scheduler 호출

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

 

 

button_handler()

button_handler() 코드

버튼이 눌렸는지 확인하고 눌렸다면 green led를 on/off 한다.

LED_green_on변수값 변경 전후로 vTaskSuspendAll(), xTaskResumeAll()은 scheduler를 suspend하고 resume하는 역할을 한다. 

LED_green_on변수는 전역 변수이기때문에 값 변경 도중 scheduler 호출을 막기 위함

 

 

led_green_handler()

led_green_handler 코드

status 변수로 notification을 받았는지 확인하고 받았다면 on-->off 한다.

vTaskDelete()를 한다면 led가 아예 꺼진다.

 

동작 영상