OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 212|回复: 0

MKRTOS-Lite:从"轮子"到"轮式火箭",一个为嵌入式而生的轻量级实时操作系统

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2026-7-29
在线时间
1 小时
发表于 7 天前 | 显示全部楼层 |阅读模式
本帖最后由 IsYourGod 于 2026-7-29 17:02 编辑

MKRTOS-Lite:从"轮子""轮式火箭",一个为嵌入式而生的轻量级实时操作系统
项目地址:(https://gitee.com/IsYourGod/mkrtos-lite]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 兼容编程接口、完整文件系统栈、工业级 OTAMPU 多进程隔离和丰富的多媒体驱动能力。**
简单说:一个 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_sel4KB,永不改动)控制,这个 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+),但为了执行代码还得先读到 RAMMKRTOS-Lite AppFS 解决了这个问题:
XIP (eXecute In Place) 文件直接在 Flash 上执行,不需要拷贝到 RAM
传统方式:   Flash ──[拷贝]──> RAM ──[执行]──   &#10060; RAM 不够放
AppFS XIP:  Flash ──[直接执行]──               &#9989; 只消耗 FlashRAM 几乎零占用
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(掉电安全、磨损均衡)和 FatFsFAT/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 CodecPCM 播放/录制,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+ commits15 篇设计文档
**系统调用**  │  78 个(文件 I/O、线程、IPC、同步、网络、信号
**内核测试**  │  32 个模块,覆盖全部核心子系统
**用户态测试**  │  22 个套件,覆盖 pthread / libc / syscall / 边界条件
**支持平台**  │  STM32F205 (QEMU)CCM4211 Cortex-M7(完整外设)、GD32F527 Cortex-M33
**设计文档**  │  15 篇(VFSAppFSpthread、定时器、消息队列、OTAMPU 内存
**社区**  │  QQ 419833232
**License**  │  GPL v2
近期开发重点:CCM4211 平台多媒体能力完善(LCDC 双缓冲、硬件解码、SDIO、音频)、AppFS 静态分区方案、FatFs 集成。
──────────────────────────────────────────────────
七、路线图与参与短期
- 完成 CCM4211 平台全外设驱动覆盖
- App_static(固定地址应用)方案稳定发布
- 新增 POSIX 消息队列 (mqueue) 支持
长期
- RISC-V 架构移植
- Cortex-A 系列支持(MMU + 虚拟内存)
- 更丰富的网络应用层协议(MQTTHTTP Server
一起搞事情?
MKRTOS-Lite 是一个年轻的、快速迭代中的开源项目。不管你是:
- 嵌入式老炮 来移植新平台、优化内核、审核代码
- 学生/学习者 来看设计文档、跑测试用例、提 Issue
- 应用开发者 来写 demo、测 pthread/libc 兼容性
都欢迎加入 QQ 419833232,或者直接提 Pull Request / Issue
**轮子已经搭好,火箭燃料也加满了。一起飞?&#65533;&#65533;**
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-8-5 00:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表