Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
tinyos-rtos — 超軽量RTOS for IoT、プリエンプティブスケジューリング、TLS/DTLS、MQTT、CoAP、POSIX互換性、およびMPUベースのメモリ保護を備えています。カーネルは10KB未満。 | Kitploit
ツール/GitHubGitHub/cmc-labo/tinyos-rtos
組み込みシステムセキュリティIoTセキュリティネットワークセキュリティハードウェアハッキング暗号化ハードウェアセキュリティファームウェア解析
GitHubcmc-labo/tinyos-rtos

tinyos-rtos

超軽量RTOS for IoT、プリエンプティブスケジューリング、TLS/DTLS、MQTT、CoAP、POSIX互換性、およびMPUベースのメモリ保護を備えています。カーネルは10KB未満。

リポジトリを見る
235863ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

TinyOS — IoT向け超軽量RTOS

リソース制約のある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 / DTLSTLS 1.2/1.3 over TCP, DTLS 1.2 over UDP(mbedTLSバックエンド)
MQTTフルMQTT 3.1.1 — インフライトリトライテーブル付きQoS 0/1/2、オフラインキュー、指数バックオフ付き自動再接続
CoAPRFC 7252準拠のクライアント/サーバー、observeパターン
OTAA/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

クイックスタート

前提条件```bash

ARM cross-compiler (required)

sudo apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi

QEMU ARM emulator (optional — for running without hardware)

sudo apt-get install -y qemu-system

root@kitploit:~
インストールの確認:```bash
arm-none-eabi-gcc --version   # 10.x or later
qemu-system-arm --version     # 6.x or later

ビルド```bash

Default example (blink_led) — ARM Cortex-M4

make

Target a different architecture (auto-selects toolchain and HAL)

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)

Specific example

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

Convenience aliases

make example-blink make example-events make example-shell make example-mqtt make example-iot

Build output

make size # Print ROM/RAM usage

root@kitploit:~
ビルド成果物は `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 コンテキストスイッチが正常に完了していることが確認できます。

ハードウェアへのフラッシュ```bash

OpenOCD (STM32 example)

openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
-c "program build/tinyos.bin verify reset exit 0x08000000"

pyOCD (generic ARM Cortex-M)

pyocd flash --target cortex_m build/tinyos.bin

root@kitploit:~
### 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(); }

root@kitploit:~
---

## 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)

同期```c

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)

root@kitploit:~
### タイマー```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)

シェル```c

/* 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)

root@kitploit:~
**カスタムコマンド例:**```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");

組み込みシェルコマンド

ラインエディタのキーバインド:

シェル設定 (include/tinyos/shell.h):```c #define SHELL_MAX_COMMANDS 32 /* max registered commands / #define SHELL_LINE_MAX 128 / max input line length (bytes) / #define SHELL_ARGV_MAX 16 / max arguments per command / #define SHELL_HISTORY_DEPTH 8 / command history entries */

root@kitploit:~
### ネットワーク```c
net_init(driver, config) / net_start()
net_socket(type) / net_bind(sock, addr) / net_connect(sock, addr, timeout_ms)
net_send(sock, data, len, timeout_ms) / net_recv(sock, buf, len, timeout_ms)
net_sendto(sock, data, len, addr) / net_recvfrom(sock, buf, len, addr)
net_close(sock)
net_ping(dest_ip, timeout_ms, rtt)
net_dns_resolve(hostname, ip, timeout_ms)
net_http_get(url, response, timeout_ms)
net_http_post(url, content_type, body, len, response, timeout_ms)

POSIX互換性

TinyOSは、標準的な移植可能なコードを最小限の変更でTinyOS上でコンパイルおよび実行できるようにする、2つの薄い互換レイヤーを提供します。

pthreads (include/tinyos/posix_threads.h)

ビルドに src/posix/posix_threads.c を追加してください。```c #include "tinyos/posix_threads.h"

/* ── Thread ── / pthread_t tid; pthread_attr_t attr; pthread_attr_init(&attr); tinyos_pthread_attr_setpriority(&attr, PRIORITY_NORMAL); / TinyOS extension / pthread_create(&tid, &attr, my_fn, arg); pthread_join(tid, &retval); pthread_detach(tid); / free resources automatically on exit / pthread_exit(retval); / terminate calling thread / pthread_self(); / handle of calling thread */

/* ── Mutex ── / pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mtx); pthread_mutex_trylock(&mtx); / returns EBUSY if already locked */ pthread_mutex_unlock(&mtx);

/* ── Condition variable ── / pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_cond_wait(&cond, &mtx); pthread_cond_timedwait(&cond, &mtx, &abstime); / abstime relative to boot */ pthread_cond_signal(&cond); pthread_cond_broadcast(&cond);

root@kitploit:~
| 概念 | マッピング先 |
|---|---|
| `pthread_t` | TinyOS の内部プールにおける `tcb_t` スロットのインデックス |
| `pthread_mutex_t` | `mutex_t` を直接埋め込み(ゼロ初期化 / `PTHREAD_MUTEX_INITIALIZER` が有効) |
| `pthread_cond_t` | `cond_var_t` を直接埋め込み(ゼロ初期化 / `PTHREAD_COND_INITIALIZER` が有効) |
| `pthread_join` | `pthread_exit` によって通知されるスレッドごとの `semaphore_t` を待機 |

**未サポート:** `pthread_cancel`、スレッドローカルストレージ(`pthread_key_*`)、
再帰的ミューテックス(`ENOTSUP` を返す)。

**設定**(`include/tinyos/posix_threads.h`):```c
#define PTHREAD_MAX_THREADS  MAX_TASKS  /* max concurrent pthreads */

BSD Sockets (include/tinyos/posix_socket.h)

src/posix/posix_socket.c をビルドに追加してください。```c #include "tinyos/posix_socket.h"

/* ── TCP server ── */ int srv = socket(AF_INET, SOCK_STREAM, 0);

int reuse = 1; setsockopt(srv, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(8080), .sin_addr = { htonl(INADDR_ANY) }, }; bind(srv, (struct sockaddr *)&addr, sizeof(addr)); listen(srv, 4);

struct sockaddr_in peer; socklen_t plen = sizeof(peer); int client = accept(srv, (struct sockaddr )&peer, &plen); recv(client, buf, sizeof(buf), 0); send(client, response, response_len, 0); posix_sock_close(client); / or define TINYOS_POSIX_WRAP_CLOSE to use close() */ posix_sock_close(srv);

/* ── TCP client ── */ int fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in dest = { .sin_family = AF_INET, .sin_port = htons(80), .sin_addr = { inet_addr("192.168.1.1") }, }; connect(fd, (struct sockaddr *)&dest, sizeof(dest)); send(fd, request, request_len, 0); recv(fd, buf, sizeof(buf), 0); posix_sock_close(fd);

/* ── UDP ── */ int udp = socket(AF_INET, SOCK_DGRAM, 0); sendto(udp, data, len, 0, (struct sockaddr *)&dest, sizeof(dest)); recvfrom(udp, buf, sizeof(buf), 0, (struct sockaddr *)&src, &srclen); posix_sock_close(udp);

/* ── Address utilities ── / htons(port) / htonl(addr) / ntohs(n) / ntohl(n) inet_addr("192.168.1.1") / → in_addr_t, network byte order / inet_ntoa(in) / → "192.168.1.1" (static buffer) */ inet_pton(AF_INET, "192.168.1.1", &in_addr) inet_ntop(AF_INET, &in_addr, buf, sizeof(buf))

root@kitploit:~
| BSD コール | マッピング先 |
|---|---|
| `socket()` | `net_socket()` |
| `bind()` | `net_bind()` |
| `listen()` | `net_listen()` |
| `accept()` | `net_accept()` |
| `connect()` | `net_connect()` |
| `send()` / `recv()` | `net_send()` / `net_recv()` |
| `sendto()` / `recvfrom()` | `net_sendto()` / `net_recvfrom()` |
| `posix_sock_close()` | `net_close()` |

**サポートされている `setsockopt` オプション:**

| オプション | 効果 |
|---|---|
| `SO_REUSEADDR` | 受け入れ; ノーオペレーション (TinyOS では常に再利用可能) |
| `SO_RCVTIMEO` | ソケットごとの受信タイムアウトを設定 (struct timeval → ミリ秒) |
| `SO_SNDTIMEO` | ソケットごとの送信/接続タイムアウトを設定 |

**`close()` のリダイレクション:** ヘッダをインクルードする前に `TINYOS_POSIX_WRAP_CLOSE` を定義すると、`close(fd)` → `posix_sock_close(fd)` がマッピングされます。

**未サポート:** `select` / `poll` / `epoll`, 非ブロッキングモード (`O_NONBLOCK`), IPv6 (`AF_INET6` は `EAFNOSUPPORT` を返します)。

---

### TLS / DTLS

TCP 上の TLS 1.2/1.3 および UDP 上の DTLS 1.2 を **mbedTLS** で実現。  
ビルド時に `-DTINYOS_TLS_ENABLE` を指定して有効にし、mbedTLS とリンクします。```c
/* Client (TLS over TCP) */
tls_context_t tls;
tls_config_t  cfg = TLS_CONFIG_DEFAULT_CLIENT;
cfg.ca_cert     = ca_cert_pem;
cfg.ca_cert_len = sizeof(ca_cert_pem);
tls_init(&tls, &cfg);

net_socket_t sock = net_socket(SOCK_STREAM);
net_connect(sock, &broker_addr, 5000);
tls_connect(&tls, sock, "example.com", 5000);

tls_send(&tls, data, len);
tls_recv(&tls, buf, sizeof(buf), 5000);
tls_close(&tls);

/* Server (TLS accept) */
tls_config_t srv_cfg = TLS_CONFIG_DEFAULT_SERVER;
srv_cfg.cert     = server_cert_pem;
srv_cfg.cert_len = sizeof(server_cert_pem);
srv_cfg.key      = server_key_pem;
srv_cfg.key_len  = sizeof(server_key_pem);
tls_init(&tls, &srv_cfg);
tls_accept(&tls, client_sock, 5000);

/* DTLS over UDP */
tls_config_t dtls_cfg = TLS_CONFIG_DEFAULT_DTLS_CLIENT;
net_socket_t usock = net_socket(SOCK_DGRAM);
tls_connect_dtls(&tls, usock, "example.com", 5000);

MQTT

完全なMQTT 3.1.1、メッセージごとのQoS配信保証を備えています。```c mqtt_config_t cfg = { .broker_host = "mqtt.example.com", .client_id = "tinyos-01", .keepalive_sec = 60, .clean_session = true, .auto_reconnect = true, .reconnect_interval_ms = 3000, /* base; doubles each attempt (max 60 s) */ }; mqtt_client_t client; mqtt_client_init(&client, &cfg); mqtt_set_connection_callback(&client, on_connect, NULL); mqtt_set_message_callback(&client, on_message, NULL); mqtt_connect(&client);

/* Publish — QoS1/2 are buffered offline if disconnected */ mqtt_publish(&client, "sensors/temp", "23.5", 4, MQTT_QOS_1, false);

/* Inspect reliability queues / uint8_t in_flight = mqtt_get_inflight_count(&client); / sent, awaiting ACK / uint8_t pending = mqtt_get_pending_count(&client); / queued while offline */

mqtt_subscribe(&client, "cmd/#", MQTT_QOS_1); mqtt_flush_pending(&client); /* discard offline queue */ mqtt_disconnect(&client);

root@kitploit:~
#### MQTT 信頼性モデル```
QoS 0  ─── fire-and-forget; dropped if disconnected
QoS 1  ─── in-flight table tracks each PUBLISH until PUBACK
              ↳ retransmits with DUP=1 every 5 s, up to 5 times
              ↳ if offline → offline queue (up to 8 messages)
QoS 2  ─── full PUBLISH → PUBREC → PUBREL → PUBCOMP handshake
              ↳ each step is retried independently on timeout

Auto-reconnect back-off: 3 s → 6 s → 12 s → … → 60 s (cap)
On reconnect: re-subscribes all topics, flushes offline queue

MQTT信頼性設定 (include/tinyos/mqtt.h):```c #define MQTT_MAX_INFLIGHT 8 /* in-flight slots / #define MQTT_MAX_PENDING 8 / offline queue slots / #define MQTT_MAX_PAYLOAD_SIZE 512 / bytes per queued msg / #define MQTT_RETRY_INTERVAL_MS 5000 / retry after (ms) / #define MQTT_MAX_RETRY_COUNT 5 / retries before drop / #define MQTT_RECONNECT_BASE_MS 3000 / first reconnect delay / #define MQTT_RECONNECT_MAX_MS 60000 / backoff ceiling */

root@kitploit:~
### CoAP```c
coap_init(ctx, config, is_server) / coap_start(ctx) / coap_stop(ctx)
coap_get(ctx, ip, port, path, response, timeout_ms)
coap_post(ctx, ip, port, path, format, payload, len, response, timeout_ms)
coap_resource_create(ctx, path, handler, user_data)
coap_process(ctx, timeout_ms)

OTA```c

ota_init(config) ota_start_update(url, callback, user_data) ota_write_chunk(data, size, offset) / ota_finalize_update() ota_confirm_boot() / ota_rollback() ota_verify_partition(type)

root@kitploit:~
### ファイルシステム```c
fs_format(device) / fs_mount(device) / fs_unmount()
fs_open(path, flags) / fs_close(fd)
fs_read(fd, buf, size) / fs_write(fd, buf, size)
fs_seek(fd, offset, whence) / fs_tell(fd)
fs_mkdir(path) / fs_remove(path) / fs_rmdir(path)
fs_stat(path, stat)
fs_opendir(path) / fs_readdir(dir, entry) / fs_closedir(dir)
fs_get_stats(stats) / fs_get_free_space() / fs_is_mounted()

/* Copy-on-Write snapshots */
fs_snapshot(source_path, snapshot_name)   /* atomic COW snapshot of a file */
fs_get_block_refcount(block_nr)           /* reference count of a data block */

ジャーナリング (Write-Ahead Log)

ファイルシステムは メタデータのみのジャーナリング (ordered mode) を使用します。inode、bitmap、またはディレクトリブロックが変更される前に、パーティションの先頭にある専用の32ブロックWAL領域にジャーナルレコードが書き込まれます。クラッシュ後の次のマウント時に、fs_mount がジャーナルを再生し、一貫性のある状態を復元します。``` Disk layout (FS_BLOCK_SIZE = 512 bytes) Block 0 Superblock (version 0x00020000 — v2 with journaling) Block 1 Block bitmap Block 2 Journal header Blocks 3-33 Journal data (31 slots) Blocks 34-41 Inode table (8 blocks, 128 inodes) Block 42+ Data blocks

root@kitploit:~
#### Copy-on-Write(COW)

各データブロックは、マウント時にinodeテーブルから再構築されるインメモリ参照カウントを持ちます。共有されているブロック(`refcount > 1`)への書き込みは、まずプライベートコピーを割り当てます。元のブロックのカウントは減少され、すべての変更は新しいブロックに対して行われます。

`fs_snapshot()`は、単一のジャーナルトランザクション内でソースinode(同じブロックポインタ、増加したrefcount)を複製することにより、アトミックなポイントインタイムスナップショットを作成します。完全なスナップショットがコミットされるか、何も変更されないかのいずれかです。```c
/* Create a snapshot of /data/config → /snapshots/config-20260101 */
fs_snapshot("/data/config", "/snapshots/config-20260101");

/* Inspect sharing */
uint8_t rc = fs_get_block_refcount(42);   /* 1 = private, >1 = shared */

電源管理```c

os_power_init() os_power_set_mode(mode) /* ACTIVE / IDLE / SLEEP / DEEP_SLEEP */ os_power_get_mode() os_power_enter_sleep(duration_ms) os_power_enter_deep_sleep(duration_ms) os_power_enable_tickless_idle(enable) os_power_set_cpu_frequency(freq_hz) os_power_configure_wakeup(source, enable) os_power_get_stats(stats) os_power_get_consumption_mw() os_power_estimate_battery_life_hours()

root@kitploit:~
### ウォッチドッグ```c
wdt_init(config) / wdt_start() / wdt_stop()
wdt_feed() / wdt_set_timeout(ms)
wdt_register_task(task, timeout_ms) / wdt_feed_task(task)

HAL(ハードウェア抽象化レイヤー)

TinyOSは、アーキテクチャ固有のレジスタアクセスを安定したCインターフェースの背後に隠す汎用HALを提供します。アーキテクチャはコンパイル時にARCH Makefile変数を介して選択されます。カーネルコードには#ifdefガードは現れません。

ポータブルプリミティブ(各アーキテクチャヘッダーでstatic inlineとして宣言)```c

uint32_t hal_irq_save(void) /* disable IRQs, return saved state / void hal_irq_restore(uint32_t s) / restore IRQ state / void hal_context_switch_trigger() / pend PendSV / raise MSIP / Timer0 / void hal_cpu_wait_for_interrupt() / WFI / wfi / sleep instruction / void hal_cpu_dsb(void) / data synchronization barrier / void hal_cpu_isb(void) / instruction synchronization barrier */

root@kitploit:~
#### 非インライン関数(`hal/<arch>/hal_<arch>.c` にアーキテクチャごとに実装)```c
void     hal_init(void)
void     hal_tick_init(uint32_t core_clock_hz, uint32_t tick_rate_hz)
void     hal_tick_suppress(uint32_t max_ticks)
uint32_t hal_tick_unsuppress(void)
uint32_t hal_core_clock_hz(void)

bool     hal_cycle_counter_init(void)
void     hal_cycle_counter_reset(void)
uint32_t hal_cycle_counter_read(void)

bool     hal_mpu_init(uint8_t *region_count)
int      hal_mpu_configure_region(uint8_t region, uint32_t base,
                                   uint32_t size, uint32_t attrs)
void     hal_mpu_enable(bool allow_privileged_default)
void     hal_mpu_disable(void)

void     hal_irq_set_priority(int irq_num, uint8_t priority)
void     hal_system_reset(void)          /* does not return */
void     hal_fault_capture(const uint32_t *frame, hal_fault_info_t *info)

ボードレベルのプラットフォームレジストリ

起動時にボード周辺機器を一度登録します。カーネルと電源管理部は、弱いシンボルを使用する代わりに、hal_platform_get()を介して テーブルを照会します。```c static const hal_uart_ops_t my_uart = { .init = ..., .putc = ... }; static const hal_power_ops_t my_power = { .enter_sleep = ..., .set_clock_hz = ... };

static const hal_platform_t board = { .uart[0] = &my_uart, .power = &my_power, };

hal_platform_register(&board); /* call before os_start() */

root@kitploit:~
`hal_platform_t` は `uart[4]`, `flash`, `gpio`, `spi[4]`,
`i2c[4]`, および `power` のスロットを提供します。 `NULL` ポインタは「このボードには存在しない」ことを意味します。

#### アーキテクチャサポートマトリックス

| アーキテクチャ | ティックソース | サイクルカウンタ | MPU / PMP | コンテキストスイッチトリガ |
|---|---|---|---|---|
| Cortex-M0/M0+/M3/M4/M7 | SysTick | DWT CYCCNT (M3+) | MPU | PendSV via ICSR |
| RISC-V RV32I/IM | CLINT MTIMECMP | `rdcycle` CSR | PMP (4 regions) | MSIP software interrupt |
| AVR ATmega/ATtiny | Timer0 CTC | — (returns 0) | — | Timer0 overflow |

---

## 設定

**`include/tinyos.h`** — カーネルとOS:```c
#define MAX_TASKS              16     /* max concurrent tasks                    */
#define STACK_SIZE             256    /* stack size per task (words)             */
#define TICK_RATE_HZ           1000   /* scheduler tick frequency (Hz)           */
#define TIME_SLICE_MS          10     /* round-robin time slice (ms)             */
#define TICKLESS_MAX_SLEEP_TICKS 100U /* tickless idle: max ticks per WFI sleep  */

include/tinyos/shell.h — インタラクティブシェル:```c #define SHELL_MAX_COMMANDS 32 /* max registered commands / #define SHELL_LINE_MAX 128 / max input line length (bytes) / #define SHELL_ARGV_MAX 16 / max arguments per command / #define SHELL_HISTORY_DEPTH 8 / command history ring buffer */

root@kitploit:~
**`include/tinyos/mqtt.h`** — MQTT信頼性:```c
#define MQTT_MAX_INFLIGHT        8      /* in-flight QoS1/2 slots    */
#define MQTT_MAX_PENDING         8      /* offline queue slots       */
#define MQTT_MAX_PAYLOAD_SIZE    512    /* max queued payload bytes  */
#define MQTT_RETRY_INTERVAL_MS   5000   /* unACKed retry interval    */
#define MQTT_MAX_RETRY_COUNT     5      /* retries before discard    */
#define MQTT_RECONNECT_BASE_MS   3000   /* initial reconnect delay   */
#define MQTT_RECONNECT_MAX_MS    60000  /* back-off ceiling          */

TLS — mbedTLSが必要です; 有効にするには:```makefile CFLAGS += -DTINYOS_TLS_ENABLE LDFLAGS += -lmbedtls -lmbedcrypto -lmbedx509

root@kitploit:~
## プロジェクト構成```
tinyos-rtos/
├── include/
│   ├── tinyos.h              # Core API (tasks, sync, timers, memory, FS, power)
│   └── tinyos/
│       ├── shell.h           # Interactive shell API & configuration
│       ├── net.h             # Network stack
│       ├── tls.h             # TLS 1.2/1.3 + DTLS 1.2 (mbedTLS)
│       ├── mqtt.h            # MQTT 3.1.1 client
│       ├── coap.h            # CoAP RFC 7252
│       ├── ota.h             # OTA firmware updates
│       ├── watchdog.h        # Watchdog timer
│       ├── posix_threads.h   # POSIX pthreads compatibility layer
│       └── posix_socket.h    # BSD socket compatibility layer
├── src/
│   ├── startup.s             # Vector table, Reset_Handler, SysTick/SVC/PendSV stubs
│   ├── context_switch.s      # Thumb-2: PendSV_Handler, SVC_Handler, os_pend_sv
│   ├── kernel.c              # Preemptive scheduler & task management
│   ├── sync.c                # Mutex, semaphore, queue, condition var, event groups
│   ├── timer.c               # Software timers
│   ├── memory.c              # Heap allocator
│   ├── shell.c               # Interactive shell (VT100, history, tab completion)
│   ├── filesystem.c          # Block-device file system
│   ├── security.c            # MPU memory protection
│   ├── power.c               # Power management & CPU frequency scaling
│   ├── watchdog.c            # Watchdog (HW + SW, per-task monitoring)
│   ├── bootloader.c          # Secure bootloader
│   ├── ota.c                 # OTA A/B partition updates
│   ├── mqtt.c                # MQTT client (in-flight table, offline queue)
│   ├── coap.c                # CoAP client/server
│   ├── net/
│   │   ├── network.c         # Core & buffer management
│   │   ├── ethernet.c        # Ethernet / ARP
│   │   ├── ip.c              # IPv4 / ICMP
│   │   ├── socket.c          # UDP / TCP socket API
│   │   ├── http_dns.c        # HTTP client & DNS resolver
│   │   └── tls.c             # TLS/DTLS (mbedTLS wrapper, excluded when mbedTLS absent)
│   └── posix/
│       ├── posix_threads.c   # pthreads → TinyOS task/sync wrapper
│       └── posix_socket.c    # BSD socket → net_* wrapper
├── hal/
│   ├── hal.h                 # Portable HAL interface (arch-agnostic API + peripheral op-tables)
│   ├── cortex_m/
│   │   ├── hal_cortex_m.h    # Register defines + static inline primitives (irq_save, WFI, DSB …)
│   │   └── hal_cortex_m.c    # SysTick, DWT, MPU, AIRCR reset, fault capture
│   ├── riscv/
│   │   ├── hal_riscv.h       # csrrci/csrw inline primitives, CLINT defines
│   │   └── hal_riscv.c       # CLINT tick, rdcycle counter, PMP, PLIC priority, CSR fault capture
│   └── avr/
│       ├── hal_avr.h         # SREG-based irq_save, Timer0 context-switch trigger
│       └── hal_avr.c         # Timer0 CTC tick, watchdog reset, stub MPU/cycle-counter
├── drivers/
│   ├── flash.c / flash.h     # Flash memory driver
│   ├── ramdisk.c / ramdisk.h # RAM disk (testing)
│   └── loopback_net.c        # Loopback network driver (testing)
├── linker.ld                 # Linker script (mps2-an385: Flash 0x0/4MB, RAM 0x20000000/4MB)
└── examples/
    ├── blink_led.c           # GPIO blink
    ├── iot_sensor.c          # Multi-task sensor node
    ├── shell_demo.c          # Custom shell commands over UART
    ├── network_demo.c        # TCP/UDP/HTTP/ping
    ├── tls_demo.c            # TLS client/server
    ├── mqtt_demo.c           # MQTT publish/subscribe (QoS 1/2)
    ├── coap_demo.c           # CoAP client/server
    ├── ota_demo.c            # Firmware update flow
    ├── filesystem_demo.c     # File I/O
    ├── watchdog_demo.c       # Watchdog configuration
    ├── low_power.c           # Power mode transitions
    ├── software_timers.c     # Timer creation and callbacks
    ├── event_groups.c        # Event synchronisation
    ├── event_flags_logic.c   # AND / OR / NOT(CLEAR) / SYNC(barrier) patterns
    ├── condition_variable.c  # Producer/consumer
    ├── priority_adjustment.c # Dynamic priority
    ├── task_statistics.c     # CPU and stack monitoring
    └── posix_compat_demo.c   # POSIX pthreads + socket usage examples

パフォーマンス

アーキテクチャコンテキストスイッチ
Cortex-M0~2 μs
Cortex-M4~1 μs
RISC-V~1.5 μs

システム要件: 最小RAM 2 KB · カーネルのみでROM < 10 KB


変更履歴

v2.0.0

新機能

  • ジャーナリングファイルシステム(src/filesystem.c)— Write-Ahead Log(WAL)がすべてのメタデータ書き込み(inode、ビットマップ、スーパーブロック、ディレクトリ)を保護します。
    オンディスクフォーマットは FS_VERSION 0x00020000 に引き上げられました。ジャーナルはブロック2から32ブロックを占有し、fs_mount はアプリケーションに制御を渡す前に、コミット済みで未適用のトランザクションを再生します。メタデータのみ(ordered)のジャーナリングにより、書き込み増幅を抑えつつ、書き込み中の任意の時点での電源断やリセット後も一貫したファイルシステムを保証します。

  • コピーオンライトブロック共有(src/filesystem.c)— すべてのデータブロックはメモリ内の参照カウント(マウント時にinodeテーブルから再構築)を持ちます。共有ブロックへの書き込みは、透過的にプライベートコピーを割り当てます。共有ブロックのカウントはデクリメントされます。fs_snapshot(source, name) は単一のジャーナルトランザクション内でアトミックなポイントインタイムスナップショットを作成します。すべてがコミットされるか、すべてが行われません。新しい公開API:fs_snapshot() および fs_get_block_refcount()(include/tinyos.h を参照)。

  • 汎用HAL(hal/)— 2層のハードウェア抽象化層により、カーネルをARM Cortex-M固有のアセンブリから分離します。

    • hal/hal.h — アーキテクチャ非依存のインターフェース:ティック、サイクルカウンタ、MPU、IRQ保存/復元、コンテキストスイッチトリガ、システムリセット、フォールトキャプチャ、およびペリフェラルオプテーブル(UART / フラッシュ / GPIO / SPI / I²C / パワースロットを持つ hal_platform_t)。

破壊的変更

  • src/kernel.c には、SYST_*、SCB_SHPR3、SCB_AIRCR、DWT_* の生のレジスタ定義は含まれなくなりました。これらはHALによって提供されます。これらのマクロを直接参照していたコードは、HAL APIを使用するように更新する必要があります。
  • src/power.c の弱いシンボル(platform_enter_sleep_mode など)は、プラットフォームが登録されている場合、hal_platform_t->power に委譲されるようになりました。以前の __asm__ volatile("wfi") デフォルトに依存していたボードは、hal_power_ops_t が登録されない限り、同一の動作を確認できます。
  • ファイルシステムのオンディスクバージョンは 0x00020000 です。v1.xでフォーマットされたボリュームは再フォーマット(fs_format)する必要があります。

v1.2.0

バグ修正

  • startup.s ベクタテーブル — MemManage_Handler、BusFault_Handler、UsageFault_Handler が fault.c の正しいハンドラを指すようになりました。
    以前は3つのエントリすべてが Default_Handler に解決されていたため、MPU、バス、使用法フォールトが診断ダンプをトリガせずに黙って飲み込まれていました。
  • os_cond_wait の二重デクリメント — cond_remove_task() は既に waiting_count をデクリメントしています。その後、再びデクリメントしていた3つの呼び出し箇所が修正されました。
    以前は、スプリアスな追加デクリメントがカウンタをアンダーフローさせ、条件変数の状態を破損する可能性がありました。
  • ミューテックスPIPブーストがタイムアウト時に解放されない — os_mutex_lock のタイムドスピンパスで、OS_ERROR_TIMEOUT を返す前に mutex_pip_recalculate() を呼び出すようになりました。
    以前は、待機中のタスクが諦めたときに所有者に適用された優先度ブーストが元に戻されず、永続的な優先度インフレーションを引き起こしていました。

改善点

  • メモリアロケータの書き換え(src/memory.c)— 固定32バイトブロックプールを、以下の機能を持つファーストフィットアロケータに置き換えました:
    • 8 KBヒープ(4 KBから拡張)、8バイトアラインメント
    • フリーリストはアドレス順で管理。隣接するフリーブロックは、os_free() のたびに即座に前方および後方に結合されます。
    • 残りが有用なサイズ(≥ BLK_HDR + ALIGN)である場合、割り当て時にブロックが分割されます。
  • os_init() の初期化順序 — os_mem_init() と os_power_init() が os_timer_init() より前に呼び出されるようになりました。これにより、タイマコールバックやタスクコードが実行される前に、ヒープと電源サブシステムが準備完了になります。
  • Ticklessアイドルの実装(src/kernel.c: os_kernel_tickless_sleep)— os_power_enable_tickless_idle(true) で有効にすると、アイドルタスクは WFI の前にSysTickを抑制し、DWT CYCCNT サイクルカウンタを使用して実際の経過時間を測定します。
    起床後、SysTickが再起動され、kernel.tick_count が測定されたティック数( で制限)だけ進められ、 が呼び出されて期限切れのタスクを即座にブロック解除します。 以前はフラグが存在しましたが、アイドルパスはSysTickが動作したままの単純な にフォールスルーしていました。

v1.1.0

新機能

  • イベントグループの EVENT_WAIT_CLEAR フラグ — ビットが クリア になるまで待機します(NOT条件)。
    EVENT_WAIT_ALL | EVENT_WAIT_CLEAR は、マスクされたすべてのビットが0になると起床します。EVENT_WAIT_ANY | EVENT_WAIT_CLEAR は、いずれかが0になると起床します。
  • os_event_group_sync() — ランデブー / バリアプリミティブ。
    各参加タスクは自身の到着ビットを設定し、完全なセットが揃うまでブロックします。すべてが同時にブロック解除されます。
  • 新しいサンプル examples/event_flags_logic.c は、4つのモード(AND、OR、NOT、SYNC)すべてを示します。

ビルドおよびランタイムの修正

  • src/startup.s を追加:ベクタテーブル、Reset_Handler(.dataコピー、.bssゼロ)、SysTick_Handler スタブ、HardFault_Handler。
  • linker.ld を追加:mps2-an385 のメモリレイアウト(Flash 0x00000000 / 4 MB、RAM 0x20000000 / 4 MB)。
  • 初期タスクスタックを修正:R4–R11保存領域が事前に割り当てられるようになり、PendSVの LDMIA {R4-R11} が新しく作成されたタスクへの最初のコンテキストスイッチで正しく機能するようになりました。
  • SVC_Handler を更新:PSPを設定する前に LDMIA {R4-R11} を実行し、SVCパスとPendSVパスの両方を対称に保ちました。
  • os_mpu_configure_default() での MPU_TYPE チェック — MPUがない場合(QEMU mps2-an385)、MPU設定は静かにスキップされます。

ライセンス

MITライセンス — 詳細は LICENSE を参照してください。

ツールをダウンロード
コマンド説明
help [cmd]すべてのコマンドを一覧表示、または cmd の詳細ヘルプを表示
clearターミナル画面をクリア (VT100)
echo <text>テキストをターミナルに出力
historyコマンド履歴を表示
psすべてのタスクを一覧表示 (状態、優先度、CPU使用率、スタック使用量)
topCPU使用率の降順でタスク一覧を表示
kill <name> [suspend|resume|delete]名前でタスクを制御
memヒープ統計 (合計/使用中/空き、割り当て/解放回数)
verTinyOS バージョンと書式化された稼働時間
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現在の行をキャンセル
コンポーネントROMRAM
カーネル6 KB512 B
タスクあたり—~1 KB
ミューテックス—12 B
セマフォ—8 B
メッセージキュー(10項目)—40 B + データ
シェル(23の組み込みコマンド)~4 KB~2.5 KB
MQTTクライアント(キュー付き)~8 KB~10 KB
POSIXスレッド層~2 KB~PTHREAD_MAX_THREADS × (tcb_t + 32 B)
POSIXソケット層~1 KB~NET_MAX_SOCKETS × 12 B
  • hal/cortex_m/ — Cortex-M0–M7の完全実装(SysTick、DWT、AIRCR、PRIMASK、PendSVトリガ)。
  • hal/riscv/ — RISC-V RV32スタブ(CLINT MTIMECMPティック、rdcycleカウンタ、PMP、PLICプライオリティ、CSRフォールトキャプチャ)。
  • hal/avr/ — AVR ATmegaスタブ(Timer0 CTCティック、SREGクリティカルセクション、ウォッチドッグリセット)。
  • Makefileは ARCH=(cortex-m* / riscv* / avr*)からHALを自動選択し、-DHAL_ARCH_* をコンパイラに渡します。
  • TICKLESS_MAX_SLEEP_TICKS
    delay_queue_tick()

    WFI
  • MAX_TASKS の増加 — 8から16に引き上げられ、ユーザー側の設定変更なしでより現実的なIoTワークロードをサポートします。
  • timer_t を os_timer_t にリネームし、POSIX <sys/types.h> との競合を回避しました。
  • Makefile:drivers/ インクルードのために -I. を追加。mbedTLSがない場合、TLSソースは自動的に除外されます。strncpyの誤検出警告のために -Wno-stringop-truncation を追加。
  • coap.c、filesystem.c、mqtt.c、ota.c、security.c、net/ip.c、net/http_dns.c 全体の符号比較、未使用関数、未初期化変数、暗黙の宣言の警告を修正。