A_A _ MOS Real-Time Operating System
o'' )_____// Cortex-M 上的简单实时操作系统
`_/ MOS ) 使用 C/C++ 开发
(_(_/--(_/ [Apache License Version 2.0]
- 同步更新仓库: Gitee(中文) | GitHub(English)
- 决赛文档:《MOS 实时操作系统:设计与实现》PDF(侧边栏含内嵌目录)
- 演示视频:百度网盘
2024年全国大学生计算机系统能力大赛-操作系统设计赛(全国) ——OS功能挑战赛道- 赛题:
proj207-new-os - 队名:
Moca-Mola - 院校:
华东师范大学
- 操作系统是计算机智能系统的核心基础软件,开发自主可控的操作系统是国家核心技术发展战略
- 本项目构建了一个小型嵌入式实时操作系统,包括内存管理、任务控制、任务调度、设备驱动等
- 移植了文件系统、GUI 等,不单独配备 bootloader,系统上电直接进入操作系统运行
- 了解操作系统原理,参考已有的小型实时操作系统源码以及硬件平台手册资料
- 实现内存管理、任务控制、任务调度、设备驱动、文件系统等组件
- 提高自主设计开发操作系统的能力,锻炼汇编、C/C++ 语言的编程能力
- 考虑系统运行效率、实时性等性能指标以及模块化开发
其中 GuiLite 图形库, FatFs 文件系统 移植了现有的开源代码。
| 开发板 | ST NUCLEO-144 F429ZI |
|---|---|
| MCU | STM32F429ZIT6 (Cortex-M4, 180MHz, 256KB SRAM, 2MB Flash) |
📦 v0.1
✅ 完成:
- 基本的数据结构、调度器与任务控制、内存管理
📌 计划:
- 定时器,时间片轮转调度
- 进程间通信
IPC,管道、消息队列- 进程同步
Sync,信号量、互斥锁- 移植简单的
Shell- 可变页面大小,内存分配器
SPI驱动,移植GuiLite/LVGL图形库- 移植到其他开发板/架构,例如
ESP32-C3(RISC-V)
📦 v0.2
✅ 完成:
Sync::{Sema_t, Lock_t, Mutex_t<T>, CondVar_t, Barrier_t}同步原语Scheduler::Policy::PreemptPri,在相同优先级下则以时间片轮转RoundRobin调度Task::terminate在任务退出时隐式调用,回收资源Shell::{Command, CmdCall, launch},简单的命令行交互HAL::STM32F4xx::SPI_t和Driver::Device::ST7735S_t, 移植GuiLite图形库Kernel::Global::os_ticks和Task::delay,阻塞延时- 重构项目组织为
{kernel, arch, drivers}- 支持
GCC编译,兼容STM32Cube HALHAL::STM32F4xx::RTC_t,CmdCall::date_cmd,App::Calendar实时日历idle使用Kernel::Global::zombie_list回收非活动页面- 三种基本的页面分配策略
Page_t::Policy::{POOL(池), DYNAMIC(动态), STATIC(静态)}
📦 v0.3
✅ 完成:
Tids映射到BitMap_tIPC::MsgQueue_t,消息队列Task::create允许泛型函数签名为void fn(auto argv),提供类型检查- 添加
ESP32-C3作为WiFi元件- 添加
Driver::Device::SD_t,SD卡驱动(SPI模式),移植FatFs文件系统- 添加
Shell::usr_cmds,用户注册命令- [实验性] 原子类型
<stdatomic.h>- [实验性]
Utils::IntrGuard_t,嵌套中断临界区- [实验性]
Scheduler + Mutex简单的形式化验证📌 计划:
- 进程间通信:管道/通道
FPU硬件浮点支持- 性能基准测试
Result<T, E>, Option<T>,错误处理DMA_t驱动- 软/硬件定时器
Timer- [实验性] 添加
POSIX支持- [实验性] 异步无栈协程
Async::{Future_t, async/await}- [实验性] 更多实时调度算法
.
├── 📁 vendor // 硬件抽象层(SPL/HAL/LL/...)
└── 📁 src
├── 📁 driver // 接口兼容层
│ ├── 📁 stm32f4xx // STM32F4xx片上外设(USART, I2C, SPI,...)
│ └── 📁 device // 其他元器件(LED, LCD, SD,...)
│
├── 📁 mos
│ ├── 📁 arch // 架构相关
│ │ └── cpu.hpp // 初始化/上下文切换
│ │
│ ├── 📁 kernel // 内核层代码(架构无关)
│ │ ├── macro.hpp // 内核常量宏
│ │ ├── type.hpp // 基础类型
│ │ ├── concepts.hpp // 类型约束(可选)
│ │ ├── data_type.hpp // 基本数据结构
│ │ ├── alloc.hpp // 内存管理
│ │ ├── global.hpp // 内核全局变量
│ │ ├── printf.h/.c // 线程安全的 printf(*)
│ │ ├── task.hpp // 任务控制
│ │ ├── sync.hpp // 同步原语
│ │ ├── scheduler.hpp // 调度器
│ │ ├── ipc.hpp // 进程间通信
│ │ └── utils.hpp // 其他工具
│ │
│ ├── config.h // 系统配置
│ ├── kernel.hpp // 内核模块
│ └── shell.hpp // Shell 命令行
│
├── 📁 user
│ ├── 📁 gui // 图形系统
│ │ ├── GuiLite.h // GuiLite 框架
│ │ └── UICode.cpp // 自定义 UI
│ │
│ ├── global.hpp // 用户全局变量
│ ├── bsp.hpp // 板级支持包
│ ├── app.hpp // 用户任务
│ ├── fatfs.hpp // FatFs 文件系统
│ └── test.hpp // 测试代码
│
├── main.cpp // 系统入口函数
└── stm32f4xx_it.cpp // 中断处理子例程
上电启动
A_A _ Version @ x.x.x(...)
o'' )_____// Build @ TIME, DATE
`_/ MOS ) Chip @ MCU, ARCH
(_(_/--(_/ 2023-2024 Copyright by [Moca-Mola]
Tid Name Priority Status Mem%
----------------------------------------
#0 idle 15 READY 10%
#1 Shell 1 BLOCKED 21%
#2 L0 2 RUNNING 9%
----------------------------------------
示例代码
// MOS Kernel & Shell
#include "mos/kernel.hpp"
#include "mos/shell.hpp"
// HAL and Device
#include "drivers/stm32f4xx/hal.hpp"
#include "drivers/device/led.hpp"namespace MOS::User::Global
{
using namespace HAL::STM32F4xx;
using namespace Driver::Device;
using namespace DataType;
// Serial Input/Output UART
auto stdio = SyncUartDev<32> {convert(USART3)};
// LED red, green, blue
Device::LED_t leds[] = {...};
}namespace MOS::User::BSP
{
using namespace Driver;
using namespace Global;
void LED_Config()
{
for (auto& led: leds) {
led.init();
}
}
void USART_Config()
{
stdio.init(9600-8-1-N)
.rx_config(PXa) // RX -> PXa
.tx_config(PYb) // TX -> PYb
.it_enable(RXNE) // Enable RXNE interrupt
.enable(); // Enable UART
}
...
}namespace MOS::User::App
{
Sync::Barrier_t bar {2}; // Set Barrier to sync tasks
void led1(Device::LED_t leds[])
{
bar.wait();
for (auto _: Range(0, 20)) {
leds[1].toggle(); // green
Task::delay(250_ms);
}
kprintf(
"%s exits...\n",
Task::current()->get_name()
);
}
void led0(Device::LED_t leds[])
{
Task::create(
led1,
leds,
Task::current()->get_pri(),
"led1"
);
bar.wait();
while (true) {
leds[0].toggle(); // red
Task::delay(500_ms);
}
}
...
}int main()
{
using namespace MOS;
using namespace Kernel;
using namespace User;
using namespace User::Global;
BSP::config(); // Init hardware and clocks
Task::create( // Create Calendar with RTC
App::time_init, nullptr, 0, "time/init"
);
Task::create( // Create Shell with buffer
Shell::launch, &stdio.buf, 1, "shell"
);
/* User Tasks */
Task::create(App::led_init, &leds, 2, "led/init");
...
/* Test examples */
Test::MutexTest();
Test::MsgQueueTest();
...
// Start scheduling, never return
Scheduler::launch();
}












