
사물인터넷(IoT)을 위한 초경량 RTOS로, 선점형 스케줄링, TLS/DTLS, MQTT, CoAP, POSIX 호환성, MPU 기반 메모리 보호를 제공합니다. 커널 크기는 10KB 미만입니다.
리소스가 제한된 IoT 및 임베디드 장치를 위한 초경량 실시간 운영체제입니다.
커널 크기 10KB 미만, 최소 RAM 2KB, 선점형 우선순위 기반 스케줄링.
| 카테고리 | 세부 사항 |
|---|---|
| 커널 | 선점형 우선순위 기반 스케줄링(256레벨), 동일 우선순위 내 라운드 로빈, 비트맵을 통한 O(1) 우선순위 조회, 우선순위 상속 |
| 동기화 | 뮤텍스(우선순위 상속 포함), 세마포어, 조건 변수, 이벤트 그룹, 메시지 큐 |
| 소프트웨어 타이머 | 원샷 및 자동 재로드, 밀리초 정밀도, 런타임 주기 변경 |
| 메모리 | 즉시 병합 기능이 있는 최초 적합 할당자(8KB 힙, 8바이트 정렬), 스택 오버플로 감지, 작업별 최고 사용량 표시 |
| 셸 | VT100 대화형 셸 — 23개의 내장 명령어, 명령어 기록(↑↓), 탭 완성, 전체 줄 편집기 |
| POSIX 호환성 | pthreads (create/join/detach/exit, mutex, cond var) · BSD 소켓 API (socket/bind/listen/accept/connect/send/recv, inet_pton/ntop, htons/htonl) |
| 파일 시스템 | 저널링 블록 장치 FS(WAL, 충돌 복구), COW 블록 공유, 원자적 스냅샷, POSIX 유사 API |
| 네트워크 | 이더넷, IPv4, ICMP, UDP, TCP, HTTP 클라이언트/서버, DNS |
| TLS / DTLS | TCP를 통한 TLS 1.2/1.3, UDP를 통한 DTLS 1.2 (mbedTLS 백엔드) |
| MQTT | 완전한 MQTT 3.1.1 — 처리 중 재시도 테이블을 포함한 QoS 0/1/2, 오프라인 큐, 지수 백오프를 이용한 자동 재연결 |
| CoAP | RFC 7252 호환 클라이언트/서버, 관찰 패턴 |
| OTA | A/B 파티션 펌웨어 업데이트, CRC32 검증, 롤백 |
| 워치독 | 하드웨어 및 소프트웨어 워치독, 작업별 타임아웃 모니터링 |
| 전원 | 유휴/슬립/딥슬립 모드, 틱리스 유휴, CPU 주파수 조절 |
| 보안 | MPU 기반 메모리 보호, 시큐어 부트 지원 |
| HAL | 범용 하드웨어 추상화 계층 — ARM Cortex-M / RISC-V / AVR; 컴파일 타임 아키텍처 선택, 주변 장치 연산 테이블 |
| 아키텍처 | 예제 |
|---|---|
| ARM Cortex-M (M0/M0+/M3/M4/M7) | STM32, nRF52, Raspberry Pi Pico |
| RISC-V (RV32I) | ESP32-C3 |
| AVR (실험적) | ATmega |
sudo apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi
sudo apt-get install -y qemu-system
설치 확인:```bash
arm-none-eabi-gcc --version # 10.x or later
qemu-system-arm --version # 6.x or later
make
make ARCH=cortex-m0 # Cortex-M0/M0+ make ARCH=cortex-m7 # Cortex-M7 make ARCH=riscv32 # RISC-V RV32I (uses riscv32-unknown-elf-gcc) make ARCH=avr5 # AVR ATmega (uses avr-gcc)
make EXAMPLE=blink_led # LED blink + task scheduler demo make EXAMPLE=event_groups # Event group AND/OR/NOT/SYNC demo make EXAMPLE=iot_sensor # Multi-sensor IoT node make EXAMPLE=shell_demo # Interactive UART shell make EXAMPLE=mqtt_demo # MQTT publish/subscribe make EXAMPLE=condition_variable # Producer/consumer
make example-blink make example-events make example-shell make example-mqtt make example-iot
make size # Print ROM/RAM usage
Build artifacts are placed in `build/`:
| File | Description |
|---|---|
| `build/tinyos.elf` | 디버그 심볼이 포함된 ELF 이미지 |
| `build/tinyos.bin` | 플래싱을 위한 원시 바이너리 |
| `build/tinyos.map` | 링커 맵 (심볼 크기) |
### QEMU에서 실행
TinyOS는 QEMU `mps2-an385` 대상 (ARM Cortex-M3, 4MB 플래시, 4MB RAM)에서 실행됩니다:```bash
# Run indefinitely (Ctrl-A X to quit)
qemu-system-arm \
-machine mps2-an385 \
-cpu cortex-m3 \
-nographic \
-kernel build/tinyos.elf
# Run for a fixed duration (e.g. 10 seconds)
timeout 10 qemu-system-arm \
-machine mps2-an385 \
-cpu cortex-m3 \
-nographic \
-kernel build/tinyos.elf
# Debug: trace interrupts
qemu-system-arm \
-machine mps2-an385 \
-cpu cortex-m3 \
-nographic \
-d int \
-kernel build/tinyos.elf
인터럽트 트레이스에서 예상되는 출력: 반복되는 successful exception return 줄은 스케줄러가 실행 중이고, SysTick이 틱하고 있으며, PendSV 컨텍스트 스위치가 정상적으로 완료되고 있음을 확인합니다.
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
-c "program build/tinyos.bin verify reset exit 0x08000000"
pyocd flash --target cortex_m build/tinyos.bin
### TLS로 빌드 (mbedTLS)
`~/mbedtls`에 mbedTLS가 있을 경우 TLS 지원이 자동으로 활성화됩니다.
다른 경로를 사용하려면:```bash
# Clone and build mbedTLS
git clone https://github.com/Mbed-TLS/mbedtls ~/mbedtls
make -C ~/mbedtls
# Build TinyOS with TLS
make MBEDTLS_DIR=~/mbedtls
최소 작업 예시:```c #include "tinyos.h"
void my_task(void param) { while (1) { / work */ os_task_delay_ms(100); } }
int main(void) { tcb_t task; os_init(); os_task_create(&task, "my_task", my_task, NULL, PRIORITY_NORMAL); os_start(); }
## API 개요
### 작업 관리```c
os_task_create(tcb, name, entry, param, priority)
os_task_delete(task)
os_task_suspend(task) / os_task_resume(task)
os_task_delay(ticks) / os_task_delay_ms(ms)
os_task_set_priority(task, priority)
os_task_get_stats(task, stats)
os_task_get_stats_by_index(index, stats) /* iterate all tasks by index */
os_task_find_by_name(name) /* returns tcb_t*, NULL if not found */
os_get_system_stats(stats)
os_get_memory_stats(&free, &used, &allocs, &frees)
os_mutex_init(mutex) / os_mutex_lock(mutex, timeout) / os_mutex_unlock(mutex) os_semaphore_init(sem, count) / os_semaphore_wait(sem, timeout) / os_semaphore_post(sem) os_cond_init(cond) / os_cond_wait(cond, mutex, timeout) os_cond_signal(cond) / os_cond_broadcast(cond) os_event_group_set_bits(eg, bits) / os_event_group_wait_bits(eg, bits, opts, out, timeout) os_queue_init(q, buf, item_size, max) / os_queue_send(q, item, timeout) os_queue_receive(q, item, timeout) / os_queue_peek(q, item, timeout)
### 타이머```c
os_timer_create(timer, name, type, period_ms, callback, param)
os_timer_start(timer) / os_timer_stop(timer) / os_timer_reset(timer)
os_timer_change_period(timer, ms) / os_timer_get_remaining_ms(timer)
/* Register custom commands before calling shell_start() */ shell_register_cmd(name, handler_fn, help_text)
/* Provide UART I/O callbacks and start the shell task */ shell_io_t io = { .getc = uart_getc, .puts = uart_puts }; shell_start(&io)
/* Change the prompt at any time */ shell_set_prompt("mydevice> ")
/* Execute a single line programmatically */ shell_exec(line)
**사용자 정의 명령 예시:**```c
static int cmd_led(int argc, char *argv[]) {
if (argc < 2) return 1; /* non-zero → prints usage */
bool on = (strcmp(argv[1], "on") == 0);
gpio_write(LED_PIN, on);
return 0;
}
/* In main(), before shell_start(): */
shell_register_cmd("led", cmd_led, "led <on|off> Toggle LED");
| 명령어 | 설명 |
|---|---|
help [cmd] | 모든 명령어 나열, 또는 cmd에 대한 자세한 도움말 표시 |
clear | 터미널 화면 지우기 (VT100) |
echo <text> | 텍스트를 터미널에 출력 |
history | 명령어 기록 보기 |
ps | 모든 작업 나열 (상태, 우선순위, CPU%, 스택 사용량) |
top | CPU 사용량 기준 내림차순 정렬된 작업 목록 |
kill <name> [suspend|resume|delete] | 이름으로 작업 제어 |
mem | 힙 통계 (전체 / 사용 중 / 사용 가능, 할당/해제 횟수) |
ver | TinyOS 버전 및 형식화된 가동 시간 |
net | 네트워크 통계 (이더넷, IP, UDP, TCP 카운터) |
ping <ip> [count] | ICMP 에코 요청 전송 |
ifconfig [ip|netmask|gw|dns <addr>] | 네트워크 구성 표시 또는 변경 |
power [active|idle|sleep|deepsleep] | 전원 통계 또는 모드 변경 |
ls [path] | 디렉터리 나열 (기본값: /) |
cat <file> | 파일 내용 표시 |
mkdir <path> | 디렉터리 생성 |
rm <path> | 파일 또는 빈 디렉터리 삭제 |
df | 파일 시스템 사용량 통계 |
touch <file> | 빈 파일 생성 |
cp <src> <dst> | 파일 복사 |
uptime | 시스템 가동 시간 표시 (HH:MM:SS 또는 N day(s), HH:MM:SS) |
sleep <ms> | 셸 작업을 N밀리초 동안 지연 |
reboot | 시스템 재부팅 |
라인 편집기 키 바인딩:
| 키 | 동작 |
|---|---|
← / Ctrl-B | 커서 왼쪽 이동 |
→ / Ctrl-F | 커서 오른쪽 이동 |
Home / Ctrl-A | 줄의 시작으로 이동 |
End / Ctrl-E | 줄의 끝으로 이동 |
↑ / ↓ | 명령어 기록 탐색 |
Tab | 명령어 이름 자동 완성 |
Ctrl-K | 커서부터 줄 끝까지 삭제 |
Ctrl-U | 커서부터 줄 시작까지 삭제 |
Ctrl-W | 이전 단어 삭제 |
Ctrl-L | 화면 지우고 다시 그리기 |
Ctrl-C | 현재 줄 취소 |