슈퍼루프와 RTOS 사이의 절충이다. 선점하지 않고, 각 작업이 짧게 끝내고 돌아온다.
typedef struct { void (*fn)(void); uint32_t period, last; } Task;
static Task tasks[] = {
{ read_sensor, 10, 0 },
{ update_ctrl, 20, 0 },
{ send_status, 100, 0 },
};
for (;;) {
uint32_t now = now_ms();
for (int i = 0; i < N; i++)
if (now - tasks[i].last >= tasks[i].period) { tasks[i].last = now; tasks[i].fn(); }
}
장점
- 주기와 작업이 한 표에 모여 구조가 눈에 보인다
- 스택이 하나뿐이라 RAM 을 적게 쓴다
- 컨텍스트 스위칭이 없어 오버헤드가 작다
한계
한 작업이 길어지면 다른 작업이 밀린다. 선점이 없기 때문이다. 그래서 각 함수가 "짧게 끝내고 돌아온다" 는 규율을 지켜야 하고, 그것이 어려워지는 순간이 RTOS 도입 시점이다.