๐ English Abstract
This article provides an in-depth analysis of the Priority Inversion problem that leads to system freezing in FreeRTOS-based real-time embedded systems. It explains the core mechanism where a medium-priority task unintentionally delays a high-priority task when sharing resources. Furthermore, it demonstrates how to resolve resource contention and optimize system responsiveness using FreeRTOS Mutex with Priority Inheritance Mechanism, along with real-world troubleshooting tips and edge-case management.
1. ์๋ก : ์ค์๊ฐ ์๋ฒ ๋๋ ์์คํ ๊ณผ ์์ ๊ฒฝํฉ ๋ฌธ์
์ค์๊ฐ ์ด์์ฒด์ (Real-Time Operating System, RTOS) ๊ธฐ๋ฐ์ ์๋ฒ ๋๋ ์์คํ ๊ฐ๋ฐ์์ ๊ฐ์ฅ ์ค์ํ ์์ ์ค ํ๋๋ ๋ฐ๋ก ๊ฒฐ์ ๋ก ์ ๋์(Deterministic Behavior)์ ๋ณด์ฅ์ ๋๋ค. ํน์ ํ์คํฌ(Task)๊ฐ ์ ํด์ง ์๊ฐ ๋ด์ ๋ฐ๋์ ์คํ์ ์๋ฃํด์ผ ํ๋ ์๊ฒฉํ ์ ์ฝ ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ์ํด, FreeRTOS์ ๊ฐ์ RTOS๋ ์ ์ ํ ์ค์ผ์ค๋ง(Preemptive Scheduling) ๋ฐฉ์์ ๊ธฐ๋ฐ์ผ๋ก ์ฐ์ ์์(Priority)์ ๋ฐ๋ผ ํ์คํฌ ์คํ ์์๋ฅผ ์ ์ดํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๋ฌ ํ์คํฌ๊ฐ ํ๋์ ๊ณต์ ์์(Shared Resource)โ์๋ฅผ ๋ค์ด UART/SPI/I2C ๋ฒ์ค, ๊ณต์ฉ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ, ๊ธ๋ก๋ฒ ์ํ ๋ณ์ ๋ฑโ์ ๋์์ ์ ๊ทผํ๋ ค ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ฒฝํฉ ์ํฉ(Resource Contention)์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋๊ธฐํ ๋ฉ์ปค๋์ฆ(Synchronization Mechanism)์ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, ์ด๋ ์ฌ๋ฐ๋ฅด์ง ์์ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ(Primitive)๋ฅผ ์ ํํ ๊ฒฝ์ฐ ์ฐ์ ์์ ์ญ์ (Priority Inversion) ํ์์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ด ํ์์ ๊ณ ์ฐ์ ์์ ํ์คํฌ๊ฐ ๋ฌด๊ธฐํ ๋๊ธฐ ์ํ์ ๋น ์ง๋ฉฐ, ์์คํ ์ ์ฒด๊ฐ ๋ฉ์ถ๊ฑฐ๋ ์์น๋ ํ์ด๋จธ(Watchdog Timer, WDT) ๋ฆฌ์ ์ ์ ๋ฐํ๋ ์น๋ช ์ ์ธ ํธ๋ฌ๋ธ์ํ ์ํฉ์ผ๋ก ์ด์ด์ง๋๋ค.
๋ณธ ํฌ์คํ ์์๋ FreeRTOS ํ๊ฒฝ์์ ๋ฐ์ํ๋ ์ฐ์ ์์ ์ญ์ ๋ฉ์ปค๋์ฆ์ ๊ทผ๋ณธ ์์ธ์ ๋ํํ ํธ๋ ์ด์ค ์์ค์ผ๋ก ์ ๋ฐํ ๋ถ์ํ๊ณ , ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ฐ์ ์์ ์์น ๋ฉ์ปค๋์ฆ(Priority Inheritance Mechanism)์ ์ ์ฉ ๋ฐฉ์๊ณผ ํ์ ์์์ ์ต์ ํ ๊ฐ์ด๋๋ฅผ ๋ค๋ฃน๋๋ค.
2. ์ฐ์ ์์ ์ญ์ (Priority Inversion) ํ์์ ๋ฉ์ปค๋์ฆ ๋ถ์
์ฐ์ ์์ ์ญ์ ํ์์ด๋, ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ํ์คํฌ๊ฐ ๊ณต์ ์์์ ์ ์ ํ๊ณ ์๋ ๋์, ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ํ์คํฌ๊ฐ ํด๋น ์์์ ๊ธฐ๋ค๋ฆฌ๋ ๊ณผ์ ์์ ์ค๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ค๋ฅธ ํ์คํฌ๋ค์ ์ํด ๋ฐฉํด๋ฅผ ๋ฐ์ ์ฐ์ ์์๊ฐ ๋ฎ์ ํ์คํฌ๋ณด๋ค๋ ๋ฆ๊ฒ ์คํ๋๋ ๊ธฐ์ดํ ํ์์ ์๋ฏธํฉ๋๋ค.
์ฐ์ ์์ ์ญ์ ๋ฐ์ ๋จ๊ณ๋ณ ๋ถ์
์์คํ ์ ๋ค์๊ณผ ๊ฐ์ด ์ธ ๊ฐ์ง ํ์คํฌ๊ฐ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
- Task H (High Priority): ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ ๋ฐ ์ ์ด ํ์คํฌ
- Task M (Medium Priority): ์ค๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ฐ์ฐ ์ฒ๋ฆฌ ํ์คํฌ (๊ณต์ ์์ ๋ฏธ์ฌ์ฉ)
- Task L (Low Priority): ๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ผ์ ๋ก๊น ํ์คํฌ
์ด ์ธ ๊ฐ์ง ํ์คํฌ ์ฌ์ด์์ ์ผ์ด๋๋ ๋ฌธ์ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ ๊ฐ๋ฉ๋๋ค.
- [์์ ์ ์ ] Task L์ด ์คํ ์ค ๊ณต์ ์์(์: I2C ๋ฒ์ค)์ ์ ์ดํ๊ธฐ ์ํด ์ด์ง ์ธ๋งํฌ์ด(Binary Semaphore)๋ฅผ ํ๋(Take)ํฉ๋๋ค.
- [๊ณ ์ฐ์ ์์ ํ์คํฌ ๋๊ธฐ] ์ด ์์ ์ Task H๊ฐ ๊นจ์ด๋ ์ ์ (Preemption)์ ์ํํฉ๋๋ค. Task H๋ ๋์ผํ I2C ๋ฒ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ธ๋งํฌ์ด๋ฅผ ์์ฒญํ์ง๋ง, ์ด๋ฏธ Task L์ด ์ ์ ํ๊ณ ์์ผ๋ฏ๋ก ์ฐจ๋จ ์ํ(Blocked State)๋ก ์ง์ ํฉ๋๋ค.
- [์ค๊ฐ ์ฐ์ ์์ ํ์คํฌ์ ๋ฐฉํด] ์ด๋ ๊ณต์ ์์๊ณผ ์๋ฌด ๊ด๋ จ์ด ์๋ Task M์ด ๊นจ์ด๋ฉ๋๋ค. Task M์ Task L๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ CPU ์ ์ด๊ถ์ ์ ์ ํ์ฌ ์คํ๋ฉ๋๋ค.
- [์ฐ์ ์์ ์ญ์ ์์ฑ] ๊ฒฐ๊ณผ์ ์ผ๋ก Task H๋ Task L์ด ์ธ๋งํฌ์ด๋ฅผ ๋ฐํ(Give)ํ๊ธฐ๋ง์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ง๋ง, ์ ์ Task L์ Task M์๊ฒ CPU๋ฅผ ๋นผ์๊ฒจ ์คํ์กฐ์ฐจ ๋์ง ๋ชปํฉ๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก Task H๋ ์์๊ณผ ์๋ฌด ์๊ด ์๋ Task M์ ์คํ์ด ์์ ํ ๋๋ ๋๊น์ง ๋ฌด์ ํ ๋๊ธฐ(Unbounded Inversion)ํ๊ฒ ๋ฉ๋๋ค.
Task H๊ฐ ์ฃผ๊ธฐ์ ์ธ ์์ ๊ฒ์ฌ๋ ํ๋์จ์ด ์ ์ด๋ฅผ ๋ด๋นํ๊ณ ์๋ค๋ฉด, Task M์ ์ฅ์๊ฐ ์ฐ์ฐ์ผ๋ก ์ธํด Task H์ ๋ฐ๋๋ผ์ธ(Deadline)์ ๋๊ธฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒฐ๊ตญ ์์คํ ์๋ต ๋ถ๋ฅ ํ์์ ๊ฐ์ ธ์ค๋ฉฐ, ์์คํ ๋ณด์กฐ ์์น๋ (System Watchdog)์ด ์๋ํ์ฌ ํ๋์จ์ด ๋ฆฌ์ ์ ์ ๋ฐํ๊ฒ ๋ฉ๋๋ค.
3. FreeRTOS์์ ์ด์ง ์ธ๋งํฌ์ด์ ๋ฎคํ ์ค์ ๊ฒฐ์ ์ ์ฐจ์ด
๋ง์ ๊ฐ๋ฐ์๋ค์ด FreeRTOS์์ ๋๊ธฐํ๋ฅผ ๊ตฌํํ ๋ ์ด์ง ์ธ๋งํฌ์ด(Binary Semaphore)์ ๋ฎคํ ์ค(Mutex)๋ฅผ ํผ์ฉํ๊ณค ํฉ๋๋ค. ํ์ง๋ง ์ํธ ๋ฐฐ์ (Mutual Exclusion) ๋ชฉ์ ์์๋ ๋ ๊ฐ์ฒด ๊ฐ์ ๋ด๋ถ ์ปค๋ ๋์ ๊ตฌ์กฐ๊ฐ ์์ ํ ๋ค๋ฆ ๋๋ค.
| ๊ตฌ๋ถ | ์ด์ง ์ธ๋งํฌ์ด (Binary Semaphore) | ๋ฎคํ ์ค (Mutex) |
|---|---|---|
| ์ฃผ ์ฌ์ฉ ๋ชฉ์ | ํ์คํฌ ๊ฐ ๋๋ ISR ๊ฐ ๋๊ธฐํ (Signaling) | ๊ณต์ ์์์ ๋ํ ์ํธ ๋ฐฐ์ (Mutual Exclusion) |
| ์์ ๊ถ (Ownership) | ์์ (Task A๊ฐ Takeํ๊ณ Task B๊ฐ Give ๊ฐ๋ฅ) | ์์ (Take๋ฅผ ์คํํ ํ์คํฌ๋ง Give ๊ฐ๋ฅ) |
| ์ฐ์ ์์ ์น๊ณ | ์ง์ํ์ง ์์ (Priority Inheritance X) | ์ง์ํจ (Priority Inheritance O) |
| ISR ๋ด ์ฌ์ฉ | ๊ฐ๋ฅ (`xSemaphoreGiveFromISR` ๋ฑ) | ๋ถ๊ฐ (ISR์ ์ฐจ๋จ ์ํ๊ฐ ๋ ์ ์์) |
4. ํด๊ฒฐ์ฑ : ์ฐ์ ์์ ์์น ๋ฉ์ปค๋์ฆ(Priority Inheritance) ๋์ ์๋ฆฌ
FreeRTOS์ ๋ฎคํ ์ค(`xSemaphoreCreateMutex()`)๋ ๋ด๋ถ์ ์ผ๋ก ์ฐ์ ์์ ์น๊ณ/์์น ๋ฉ์ปค๋์ฆ(Priority Inheritance Protocol)์ ๋ด์ฅํ๊ณ ์์ต๋๋ค. ์ด๋ฅผ ์ ์ฉํ๋ฉด ์์ ๋ฐ์ํ๋ ๋ฌด์ ํ ์ฐ์ ์์ ์ญ์ ๋ฌธ์ ๊ฐ ์๋ฒฝํ๊ฒ ํด๊ฒฐ๋ฉ๋๋ค.
์ฐ์ ์์ ์์น ๋ฉ์ปค๋์ฆ ๋์ ๋จ๊ณ
- Task L์ด ๋ฎคํ ์ค๋ฅผ ํ๋ํ๊ณ ๊ณต์ ์์ ์์ ์ ์์ํฉ๋๋ค.
- Task H๊ฐ ๋์ผํ ๋ฎคํ ์ค๋ฅผ ์์ฒญํ๋ฉฐ ๋๊ธฐ ์ํ(Blocked)๋ก ๋ค์ด๊ฐ๋๋ค.
- FreeRTOS ์ปค๋์ ์ฆ์ ๋ฎคํ ์ค๋ฅผ ์์ ํ Task L์ ์ฐ์ ์์๋ฅผ Task H์ ์ฐ์ ์์ ์์ค์ผ๋ก ์์ ์ํฅ(Inherit)์ํต๋๋ค.
- ์ด ์์ ์ Task M์ด ๊นจ์ด๋๋๋ผ๋, ์์๋ก ์ฐ์ ์์๊ฐ ๋์์ง Task L์ ์ ์ ํ ์ ์์ต๋๋ค.
- Task L์ ๋น ๋ฅด๊ฒ ์์ ์์ ์ ๋ง์น๊ณ ๋ฎคํ ์ค๋ฅผ ๋ฐํ(`xSemaphoreGive`)ํฉ๋๋ค.
- ๋ฎคํ ์ค๊ฐ ๋ฐํ๋๋ ์๊ฐ, Task L์ ์ฐ์ ์์๋ ์๋ ์์ค์ผ๋ก ๋ณต์๋๊ณ , ์ฆ์ ์ ์ ๋ฉ์ปค๋์ฆ์ ์ํด ๊ฐ์ฅ ๋์๋ Task H๊ฐ ๋ฎคํ ์ค๋ฅผ ํ๋ํ์ฌ ์คํ๋ฉ๋๋ค.
FreeRTOS ๋ฎคํ ์ค ์ ์ฉ ์ฝ๋ ์์
๋ค์์ ์ด์ง ์ธ๋งํฌ์ด๋ก ์ธํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ , ์ฐ์ ์์ ์์น์ด ์ ์ฉ๋ ๋ฎคํ ์ค๋ฅผ ํ์ฉํ์ฌ ๊ณต์ ์์์ ์์ ํ๊ฒ ๋ณดํธํ๋ C ์ธ์ด ๊ตฌํ ํจํด์ ๋๋ค.
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
// ๊ณต์ ์์ ๋ฎคํ
์ค ํธ๋ค ์ ์ธ
SemaphoreHandle_t xResourceMutex;
void vSystemInit(void)
{
// ์ฐ์ ์์ ์น๊ณ ๊ธฐ๋ฅ์ด ํ์ฑํ๋ ๋ฎคํ
์ค ์์ฑ
xResourceMutex = xSemaphoreCreateMutex();
if(xResourceMutex == NULL)
{
// ๋ฎคํ
์ค ์์ฑ ์คํจ ์์ธ ์ฒ๋ฆฌ (๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฑ)
configASSERT(0);
}
}
// ๊ณ ์ฐ์ ์์ ํ์คํฌ (Task H)
void vTaskHighPriority(void *pvParameters)
{
for(;;)
{
vTaskDelay(pdMS_TO_TICKS(100)); // ์ฃผ๊ธฐ์ ์คํ
// ๋ฎคํ
์ค ํ๋ ์๋ (์ต๋ 100ms ๋๊ธฐ)
if(xSemaphoreTake(xResourceMutex, pdMS_TO_TICKS(100)) == pdTRUE)
{
// [Critical Section] ํฌ๋ฆฌํฐ์ปฌ ์น์
: ๊ณต์ ์์ ์์ ์ ๊ทผ
AccessSharedResource();
// ๋ฎคํ
์ค ๋ฐํ
xSemaphoreGive(xResourceMutex);
}
else
{
// ํ์์์ ๋ฐ์ ์ ํธ๋ฌ๋ธ์ํ
๋ก๊น
TraceResourceTimeoutError();
}
}
}
// ์ ์ฐ์ ์์ ํ์คํฌ (Task L)
void vTaskLowPriority(void *pvParameters)
{
for(;;)
{
if(xSemaphoreTake(xResourceMutex, portMAX_DELAY) == pdTRUE)
{
// Task L์ด ๋ฎคํ
์ค๋ฅผ ๋ณด์ ํ ๋์ Task H๊ฐ Take๋ฅผ ํธ์ถํ๋ฉด,
// Task L์ ์ฐ์ ์์๊ฐ Task H ์์ค์ผ๋ก ์ผ์ ์์นํจ.
AccessSharedResource();
xSemaphoreGive(xResourceMutex);
}
}
}
5. ์ค๋ฌด ํธ๋ฌ๋ธ์ํ ๋ฐ ์ฃ์ง ์ผ์ด์ค(Edge Cases) ๊ณ ๋ ค์ฌํญ
์ฐ์ ์์ ์น๊ณ ๋ฉ์ปค๋์ฆ์ ์ ์ฉํ๋ ๊ฒ๋ง์ผ๋ก ๋ชจ๋ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ์๋ฒฝํ๊ฒ ํด๊ฒฐ๋์ง๋ ์์ต๋๋ค. ์ค๋ฌด์์ ์ ํ๊ฒ ๋๋ ๊ณ ๊ธ ์ฃ์ง ์ผ์ด์ค๋ค๊ณผ ์ต์ ํ ๊ธฐ๋ฒ์ ๊ณต์ ํฉ๋๋ค.
1) ์ค์ฒฉ ๋ฎคํ ์ค ๋ฐ ๋ฐ๋๋ฝ(Deadlock) ์ํ์ฑ
์ฌ๋ฌ ๊ฐ์ ๋ฎคํ ์ค๋ฅผ ์ค์ฒฉํด์ ํ๋ํ ๋(Nested Mutex Taking) ์๋ก ๋ค๋ฅธ ์์๋ก ์์์ ์์ฒญํ๋ฉด ๊ต์ฐฉ ์ํ(Deadlock)๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ํด๊ฒฐ ์์น: ์์คํ ์ ์ฒด์์ ๋ฎคํ ์ค๋ฅผ ํ๋ํ๋ ์์(Lock Ordering)๋ฅผ ํ์คํํ์ฌ ํต์ผํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํญ์ `Mutex A -> Mutex B` ์์๋ก๋ง ํ๋ํ๋๋ก ๊ท์ ํฉ๋๋ค. ๋ํ, ๋ณต์กํ ์ค์ฒฉ ๊ตฌ์กฐ์์๋ ์ฌ๊ท ๋ฎคํ ์ค(`xSemaphoreCreateRecursiveMutex()`) ํ์ฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
2) ISR(์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด)๊ณผ์ ์์ ๊ณต์
์ธํฐ๋ฝํธ ๋งฅ๋ฝ(Interrupt Context)์์๋ ๋๊ธฐ(Blocking)๊ฐ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก, ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ISR๊ณผ ํ์คํฌ ๊ฐ ๊ณต์ ์์ ๊ฒฝํฉ์ ๋ฐฉ์งํ๋ ค๋ฉด ๋ฎคํ ์ค๊ฐ ์๋ ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ง์ (`taskENTER_CRITICAL_FROM_ISR()`) ๋๋ **์ด์ง ์ธ๋งํฌ์ด/ํ(Queue)**๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
3) ์ฐ์ ์์ ์ํ ํ๋กํ ์ฝ(Priority Ceiling Protocol) ๊ฒํ
์ฐ์ ์์ ์น๊ณ(Priority Inheritance) ์ธ์๋ ์ฐ์ ์์ ์ํ(Priority Ceiling) ๋ฐฉ์์ด ์กด์ฌํฉ๋๋ค. ์์์ ์ ์ ํ๋ ์๊ฐ, ํด๋น ์์์ ์ฌ์ฉํ๋ ๋ชจ๋ ํ์คํฌ ์ค ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ก ์ฆ์ ์น์์ํค๋ ๊ธฐ๋ฒ์ ๋๋ค. FreeRTOS ๊ธฐ๋ณธ ์ฌ์์ Priority Inheritance ๋ฐฉ์์ด์ง๋ง, ์์คํ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ๊ธธ์ด๋ฅผ ๊ทน๋๋ก ์ค์ด๋ ์ค๊ณ ๊ธฐ๋ฒ์ด ์กฐํฉ๋์ด์ผ ํฉ๋๋ค.
4) ๋ฌธ๋งฅ ๊ตํ ์ค๋ฒํค๋(Context Switch Overhead) ์ต์ ํ
์ฐ์ ์์ ์ํฅ ๋ฐ ๋ณต์ ๊ณผ์ ์์ ์ถ๊ฐ์ ์ธ ์ปค๋ ์ฐ์ฐ๊ณผ **๋ฌธ๋งฅ ๊ตํ(Context Switching)**์ด ๋ฐ์ํฉ๋๋ค. ํฌ๋ฆฌํฐ์ปฌ ์น์ ๋ด๋ถ์ ์ฝ๋๊ฐ ๋จ ๋ช ์ค์ ๋ถ๊ณผํ๋ค๋ฉด, ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค `vTaskSuspendAll()` ๋๋ `taskENTER_CRITICAL()`์ ์ฌ์ฉํ์ฌ ์ค์ผ์ค๋ง์ ์ ์ ๋ฉ์ถ๋ ๊ฒ์ด ์ค๋ฒํค๋ ์ธก๋ฉด์์ ํจ์ฌ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
6. ๊ฒฐ๋ก : ์์ ์ ์ธ RTOS ์ค๊ณ๋ฅผ ์ํ ํต์ฌ ์ฒดํฌ๋ฆฌ์คํธ
FreeRTOS ๊ธฐ๋ฐ ์ค์๊ฐ ์๋ฒ ๋๋ ์์คํ ์์ ๊ณต์ ์์ ๊ฒฝํฉ์ผ๋ก ์ธํ ์์คํ ๋ฉ์ถค ๋ฐ ์ด์ ๋์์ ์๋ฐฉํ๊ธฐ ์ํด์๋ ๋ค์ ์ํคํ ์ฒ ์๋ฆฝ ์์น์ ์ง์ผ์ผ ํฉ๋๋ค.
- ์ํธ ๋ฐฐ์ ๋ชฉ์ ์๋ ์ด์ง ์ธ๋งํฌ์ด๊ฐ ์๋ ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๋ฎคํ ์ค์ ๋ด์ฅ๋ ์ฐ์ ์์ ์น๊ณ ๋ฉ์ปค๋์ฆ๋ง์ด ๋ฌด์ ํ ์ฐ์ ์์ ์ญ์ ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ํฌ๋ฆฌํฐ์ปฌ ์น์ (Critical Section)์ ์คํ ์๊ฐ์ ์ต์ํํ์ญ์์ค. ๋ฎคํ ์ค๋ฅผ ๋ณด์ ํ ์ฑ ๊ธด ๋๊ธฐ ์๊ฐ(Delay)์ด๋ I/O ๋๊ธฐ ๋ฃจํ๋ฅผ ์ํํ๋ ๊ฒ์ ์ ์ฒด ์ค์๊ฐ์ฑ์ ๋จ์ด๋จ๋ฆฝ๋๋ค.
- ISR์์์ ๋๊ธฐํ ์ ์ฝ์ ๋ช ํํ ์ธ์งํ์ญ์์ค. ISR ๋ด๋ถ์์๋ ์ ๋ ๋ฎคํ ์ค๋ฅผ ํธ์ถํ์ง ๋ง๊ณ , `FromISR` ์ ์ฉ API์ ์ธ๋งํฌ์ด/ํ๋ฅผ ํ์ฉํ์ธ์.
- Tracealyzer์ ๊ฐ์ RTOS ๋๋ฒ๊น /ํธ๋ ์ด์ฑ ๋๊ตฌ๋ฅผ ํ์ฉํ์ญ์์ค. ํ์๋ผ์ธ ๊ธฐ๋ฐ์ผ๋ก ํ์คํฌ ์ํ ๋ณํ์ ์ธ๋งํฌ์ด/๋ฎคํ ์ค ์ด๋ฒคํธ๋ฅผ ์๊ฐํํ๋ฉด ์ฐ์ ์์ ์ญ์ ๋ฐ ๋ณ๋ชฉ ์ง์ ์ ์ ๋ฐํ๊ฒ ์ถ์ ํ ์ ์์ต๋๋ค.
์ค์๊ฐ์ฑ์ ๋ณด์ฅํด์ผ ํ๋ ์๋ฒ ๋๋ ํ์ฅ์์ ๊ฒฌ๊ณ ํ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด์๋ ์ด๋ฌํ ์ค์ผ์ค๋ฌ์ ์ธ๋ถ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ ์ ํํ ์ดํดํ๊ณ ์ฌ๋ฐ๋ฅธ ๋๊ธฐํ ๊ธฐ๋ฒ์ ์ ์ฉํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.