
超軽量RTOS for IoT、プリエンプティブスケジューリング、TLS/DTLS、MQTT、CoAP、POSIX互換性、およびMPUベースのメモリ保護を備えています。カーネルは10KB未満。
リソース制約のあるIoTおよび組込みデバイス向けの超軽量リアルタイムオペレーティングシステム。
カーネルフットプリント10KB未満、最小RAM 2KB、プリエンプティブ優先度ベースのスケジューリング。
| カテゴリ | 詳細 |
|---|---|
| カーネル | プリエンプティブ優先度ベースのスケジューリング(256レベル)、同一優先度内でのラウンドロビン、ビットマップによるO(1)優先度ルックアップ、優先度継承 |
| 同期 | Mutex(優先度継承付き)、セマフォ、条件変数、イベントグループ、メッセージキュー |
| ソフトウェアタイマー | ワンショットおよび自動リロード、ミリ秒精度、実行時の周期変更 |
| メモリ | 即時結合を伴うファーストフィットアロケータ(8KBヒープ、8バイトアライメント)、スタックオーバーフロー検出、タスクごとのHigh-Water Mark |
| シェル | 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 |
| ネットワーク | Ethernet, IPv4, ICMP, UDP, TCP, HTTPクライアント/サーバー, DNS |
| TLS / DTLS | TLS 1.2/1.3 over TCP, DTLS 1.2 over UDP(mbedTLSバックエンド) |
| MQTT | フルMQTT 3.1.1 — インフライトリトライテーブル付きQoS 0/1/2、オフラインキュー、指数バックオフ付き自動再接続 |
| CoAP | RFC 7252準拠のクライアント/サーバー、observeパターン |
| 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 (experimental) | 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/` に配置されます:
| ファイル | 説明 |
|---|---|
| `build/tinyos.elf` | デバッグシンボル付きELFイメージ |
| `build/tinyos.bin` | フラッシュ用の生バイナリ |
| `build/tinyos.map` | リンカマップ(シンボルサイズ) |
### QEMUでの実行
TinyOSはQEMU `mps2-an385` ターゲット(ARM Cortex-M3, 4 MB フラッシュ, 4 MB 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)
TLS サポートは、`~/mbedtls` に mbedTLS が存在する場合に自動的に有効になります。
別のパスを使用する場合:```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 | ネットワーク統計 (Ethernet、IP、UDP、TCP カウンター) |
ping <ip> [count] | ICMP Echo 要求を送信 |
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 | 現在の行をキャンセル |