适用于资源受限的物联网和嵌入式设备的超轻量级实时操作系统。
内核体积小于 10 KB,最低 RAM 需求 2 KB,采用抢占式优先级调度。
| 类别 | 详情 |
|---|---|
| 内核 | 抢占式优先级调度(256 级),同优先级内轮转,基于位图的 O(1) 优先级查找,优先级继承 |
| 同步 | 互斥锁(带优先级继承)、信号量、条件变量、事件组、消息队列 |
| 软件定时器 | 单次触发和自动重载,毫秒级精度,运行时更改周期 |
| 内存 | 首次适应分配器,即时合并(8 KB 堆,8 字节对齐),栈溢出检测,每任务高水位标记 |
| Shell | VT100 交互式 Shell——23 条内置命令,命令历史(↑↓),Tab 补全,完整行编辑器 |
| POSIX 兼容性 | pthreads(创建/加入/分离/退出,互斥锁,条件变量)· BSD 套接字 API(socket/bind/listen/accept/connect/send/recv,inet_pton/ntop,htons/htonl) |
| 文件系统 | 日志式块设备文件系统(WAL,崩溃恢复),写时复制块共享,原子快照,类 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/` 目录:
| 文件 | 描述 |
|---|---|
| `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)
当 `~/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> | 延迟 shell 任务 N 毫秒 |
reboot | 重启系统 |
行编辑器按键绑定:
| 按键 | 动作 |
|---|---|
← / Ctrl-B | 光标左移 |
→ / Ctrl-F | 光标右移 |
Home / Ctrl-A | 跳转到行首 |
End / Ctrl-E | 跳转到行尾 |
↑ / ↓ | 浏览命令历史 |
Tab | 补全命令名 |
Ctrl-K | 删除到行尾 |
Ctrl-U | 删除到行首 |
Ctrl-W | 删除前一个词 |
Ctrl-L | 清屏并重绘 |
Ctrl-C | 取消当前行 |
Shell 配置 (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 */
### 网络```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)
TinyOS提供了两个薄兼容层,允许标准可移植代码在TinyOS上编译和运行,只需最少的更改。