本帖最后由 IsYourGod 于 2026-7-29 17:02 编辑
MKRTOS-Lite:从"轮子"到"轮式火箭",一个为嵌入式而生的轻量级实时操作系统开源协议:GPL v2 | 架构:ARM Cortex-M/A / RISC-V | 语言:C + 汇编 | 216+ commits,持续活跃开发中 ────────────────────────────────────────────────── 一、嵌入式开发的"轮子困境"做过嵌入式的朋友一定感同身受:每个项目都要从零搭建底层。 裸机开发写调度器 → 用 RTOS 却绑死一家生态 → 想加个文件系统还要移植半天 → 做了 OTA 怕变砖 → 要在 NOR Flash 上跑应用,要么加载到 RAM 浪费内存,要么直接不支持… 有没有一个 RTOS,既"开箱即用"又"不绑生态",既能跑在几块钱的 M3 上,又能驱动 1024×600 的 LCD 屏幕? 这就是 MKRTOS-Lite 想做的事。 ────────────────────────────────────────────────── 二、一句话定位**MKRTOS-Lite 是一个面向 ARM Cortex-M/A/RISC-V 的轻量级实时操作系统,提供 POSIX 兼容编程接口、完整文件系统栈、工业级 OTA、MPU 多进程隔离和丰富的多媒体驱动能力。** 简单说:一个 RTOS,覆盖从传感器采集到 HMI 人机交互的全部场景。 ────────────────────────────────────────────────── 三、六大核心亮点
亮点一:工业级 OTA,绝不"变砖"
OTA 升级最怕什么?怕断电变砖。MKRTOS-Lite 用三层防线解决这个问题: Flash 布局: ┌────────┬────────────┬────────────┬──────────┬──────────┬────────┐ │boot_sel│bootstrap A │bootstrap B │ kernel A │ kernel B │appfs │ │ (4KB) │ (12KB) │ (12KB) │ │ │ │ └────────┴────────────┴────────────┴──────────┴──────────┴────────┘ ▲ 不可升级 ▲ A/B 交替升级 ▲ A/B 交替升级 + 三级恢复 - 第一级:kernel_bak 自动回退到上一版本 - 第二级:kernel_golden 回退到出厂版本 - 第三级:连 golden 都挂了?通过 UART XMODEM 协议从串口灌入固件救砖 升级全程由 boot_sel(4KB,永不改动)控制,这个 4KB 的小东西是整个系统的"最后安全网"。 // 升级流程内核侧接口 int upgrade_start(uint32_t image_addr, uint32_t image_size); int upgrade_verify(void); // CRC32 + 签名校验 int upgrade_commit(void); // 标记升级成功 ────────────────────────────────────────────────── 亮点二:POSIX 兼容,Linux 开发者零学习成本你用 Linux 写过多线程程序吗?那你已经会 MKRTOS-Lite 的用户态开发了。 pthread 完整支持: #include <pthread.h>
pthread_t thread; pthread_create(&thread, NULL, my_thread_func, arg); pthread_join(thread, NULL);
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_lock(&mtx); pthread_cond_wait(&cond, &mtx); // 你熟悉的语义一模一样 pthread_mutex_unlock(&mtx); 不止 pthread,还有这些 POSIX 标准接口: 接口 │ 熟悉度 `shm_open` / `shm_unlink` │ 跨进程共享内存,就是那个味 `clock_gettime` / `timer_create` │ POSIX 定时器,纳秒精度 `open` / `read` / `write` / `ioctl` │ 文件 I/O,毫无违和感 `kill` / `sigaction` / `sigprocmask` │ POSIX 信号,进程间通信 `pthread_barrier_wait` │ 线程屏障同步 `pthread_key_create` / `pthread_getspecific` │ 线程局部存储 (TLS) 78 个系统调用通过 SVC #128 统一入口,架构清晰。对于从 Linux 过来的开发者,几乎不需要学习新的编程模型——把 Linux 的经验平移过来即可。 ────────────────────────────────────────────────── 亮点三:AppFS — NOR Flash 上的 XIP 文件系统嵌入式开发中,NOR Flash 通常很"尴尬":容量不小(16MB+),但为了执行代码还得先读到 RAM。MKRTOS-Lite 的 AppFS 解决了这个问题: XIP (eXecute In Place) — 文件直接在 Flash 上执行,不需要拷贝到 RAM。 传统方式: Flash ──[拷贝]──> RAM ──[执行]── ❌ RAM 不够放 AppFS XIP: Flash ──[直接执行]── ✅ 只消耗 Flash,RAM 几乎零占用 AppFS 是一个平面文件系统(flat filesystem),专为 NOR Flash 设计: - 文件在编译时通过工具打包成镜像,烧录到固定位置 - 内核通过 VFS 层透明访问,对应用来说就是普通的 open/read - 支持固定地址 App (App_static):编译时就确定 Flash/RAM 地址,MPU 区域预规划 // 对应用来说,AppFS 上的文件和其他文件系统没有区别 int fd = open("/app/my_app.elf", O_RDONLY); // 内核自动通过 XIP 映射,直接从 Flash 读取,不占 RAM 配合 LittleFS(掉电安全、磨损均衡)和 FatFs(FAT/exFAT,方便 PC 读取),存储方案完整覆盖。 ────────────────────────────────────────────────── 亮点四:MPU 多进程隔离,一个应用崩了不影响全局MCU 上跑多进程?MKRTOS-Lite 基于 ARMv7-M MPU (Memory Protection Unit) 实现了真正的任务隔离: ┌──────────────────────────────────────────────┐ │ 物理内存 │ │ ┌──────────┐ ┌──────────┐ ┌───────────┐ │ │ │ Task A │ │ Task B │ │ 内核空间 │ │ │ │ 独立的 │ │ 独立的 │ │ (特权模式) │ │ │ │ MPU 区域 │ │ MPU 区域 │ │ │ │ │ └──────────┘ └──────────┘ └───────────┘ │ │ ▲ 越界访问触发 MemManage Fault ▲ │ └──────────────────────────────────────────────┘ - 每个 Task 有独立的地址空间、独立的文件描述符表、独立的同步对象句柄表 - MPU 内存分配器采用子区域禁用技术,最大化利用有限的 MPU region 数量 - 一个用户态应用崩溃,不会拖垮整个系统 命名同步对象让跨进程通信变得简单: // 进程 A:创建一个命名互斥锁 int mtx_fd = sync_create_named("sensor_lock", SYNC_TYPE_MUTEX);
// 进程 B:打开同一个互斥锁 int mtx_fd = sync_open_named("sensor_lock"); // 两个进程共享同一把锁 ────────────────────────────────────────────────── 亮点五:不只"点灯",多媒体能力拉满RTOS 常见于传感器采集、电机控制,但 MKRTOS-Lite 在人机交互 (HMI) 场景也做了大量工作: 子系统 │ 能力 **LCDC** │ 硬件双图层 + 双缓冲 + VSYNC 同步,支持 1024×600 RGB888 **图片解码** │ 硬件 JPEG / PNG 解码器驱动,零 CPU 开销 **音频** │ I2S + ES8311 Codec,PCM 播放/录制,mmap 零拷贝 DMA 缓冲 **触摸** │ GT911 电容触摸驱动,完整 input 子系统 **显示** │ Framebuffer 抽象 + dirty-rect 追踪,多硬件适配 这意味着 MKRTOS-Lite 不只是工业控制 RTOS——它是一个完整的嵌入式 HMI 平台。 // input 子系统 - Linux 兼容的 input_event 模型 struct input_event ev; ev.type = EV_ABS; ev.code = ABS_X; ev.value = touch_x; input_report(dev, &ev); ────────────────────────────────────────────────── 亮点六:Kconfig 配置 + QEMU 模拟,没硬件也能开发构建系统源自 Zephyr 项目,支持 Kconfig + CMake + Ninja 黄金组合: # 图形化配置,就像 Linux 内核一样 ninja menuconfig
# 开关各种功能模块 # MUTEX SEMAPHORE MESSAGE_QUEUE # CONDVAR RWLOCK VFS # [ ] LITTLEFS [ ] UPGRADE SHELL 一行命令在 QEMU 中跑起来: # 构建 ./mkrtos_script/build_netduino2.sh
# 运行(QEMU 模拟 STM32F205) ./mkrtos_script/run_m3.sh
# 你会看到 Shell 提示符: mkrtos> ps # 查看所有线程 mkrtos> top # 实时查看 CPU 占用 mkrtos> ls /dev # 列出设备文件 mkrtos> mount # 查看挂载点 学生党不用买开发板,嵌入式老手不用焊接飞线。一台电脑,全部搞定。 ────────────────────────────────────────────────── 四、架构一览┌──────────────────────────────────────────────────┐ │ 用户空间 │ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │ │ App A │ │ App B │ │ test.elf (PIE) │ │ │ │ (XIP) │ │ (动态) │ │ (pthread/libc) │ │ │ └──────────┘ └──────────┘ └──────────────────┘ │ │ ┌──────────────────────────────────────────────┐ │ │ │ musl libc (string/ctype/stdlib/math/ │ │ │ │ malloc-pthread-stdio-syscall) │ │ │ └──────────────────────────────────────────────┘ │ ├──────────────────── SVC #128 ────────────────────┤ │ 内核空间 │ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │ │ syscall │ │ VFS │ │ device drivers │ │ │ │ dispatch │ │ devfs │ │ blk/char/gpio │ │ │ │ (78+) │ │ ramfs │ │ spi/i2c/lcdc │ │ │ │ │ │ littlefs │ │ audio/imgdec │ │ │ │ │ │ appfs │ │ sdio/usb/net │ │ │ └──────────┘ └──────────┘ └──────────────────┘ │ │ ┌──────────────────────────────────────────────┐ │ │ │ 调度器 (bitmap + RR, 32 prio) │ │ │ │ 同步原语 (mutex-PI / sem / mq / condvar │ │ │ │ / rwlock / spinlock / barrier) │ │ │ │ MPU / shm / signal / timer-ns / workqueue │ │ │ └──────────────────────────────────────────────┘ │ ├────────────────── Hardware ──────────────────────┤ │ ARM Cortex-M3/M4/M7/M33 + RISC-V (规划中) │ └──────────────────────────────────────────────────┘ 内核采用经典的分层设计:硬件抽象 → 内核核心 → 驱动框架 → VFS → 系统调用 → 用户空间。每一层职责清晰,接口明确。 ────────────────────────────────────────────────── 五、5 分钟上手环境准备# 安装交叉编译器 tar xf gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2
# 设置环境变量 export TOOLCHAIN=/path/to/gcc-arm-none-eabi/bin/ export TOOLCHAIN_LIB=/path/to/gcc-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/armv7-m export CROSS_COMPILE_NAME=arm-none-eabi- 构建 & 运行cd mkrtos-lite ./mkrtos_script/build_netduino2.sh ./mkrtos_script/run_m3.sh
# 看到 Shell 了! mkrtos> help mkrtos> ps # 当前线程列表 mkrtos> top # CPU 使用率(实时刷新) mkrtos> mount # 文件系统挂载情况 mkrtos> ls /dev # 设备文件一览 写第一个应用#include <pthread.h> #include <stdio.h>
void *blink_thread(void *arg) { while (1) { printf("Hello from MKRTOS-Lite!\n"); usleep(1000000); // 1 秒 } return NULL; }
int main() { pthread_t tid; pthread_create(&tid, NULL, blink_thread, NULL); pthread_join(tid, NULL); return 0; } 编译成 .elf,放到 AppFS 分区中,Shell 里输入 app run myapp 就跑起来了。 ────────────────────────────────────────────────── 六、项目现状维度 │ 数据 **代码规模** │ 内核 40+ 源文件,210+ commits,15 篇设计文档 **系统调用** │ 78 个(文件 I/O、线程、IPC、同步、网络、信号…) **内核测试** │ 32 个模块,覆盖全部核心子系统 **用户态测试** │ 22 个套件,覆盖 pthread / libc / syscall / 边界条件 **支持平台** │ STM32F205 (QEMU)、CCM4211 Cortex-M7(完整外设)、GD32F527 Cortex-M33 **设计文档** │ 15 篇(VFS、AppFS、pthread、定时器、消息队列、OTA、MPU 内存…) **社区** │ QQ 群 419833232 **License** │ GPL v2 近期开发重点:CCM4211 平台多媒体能力完善(LCDC 双缓冲、硬件解码、SDIO、音频)、AppFS 静态分区方案、FatFs 集成。 ────────────────────────────────────────────────── 七、路线图与参与短期- 完成 CCM4211 平台全外设驱动覆盖 - App_static(固定地址应用)方案稳定发布 - 新增 POSIX 消息队列 (mqueue) 支持 长期- RISC-V 架构移植 - Cortex-A 系列支持(MMU + 虚拟内存) - 更丰富的网络应用层协议(MQTT、HTTP Server) 一起搞事情?MKRTOS-Lite 是一个年轻的、快速迭代中的开源项目。不管你是: - 嵌入式老炮 — 来移植新平台、优化内核、审核代码 - 学生/学习者 — 来看设计文档、跑测试用例、提 Issue - 应用开发者 — 来写 demo、测 pthread/libc 兼容性 都欢迎加入 QQ 群 419833232,或者直接提 Pull Request / Issue。 **轮子已经搭好,火箭燃料也加满了。一起飞?��** |