[i=s] 本帖最后由 kongrong 于 2025-10-24 16:42 编辑 [/i]
Chaos-nano 协作式异步操作系统
系统简介
Chaos-nano 操作系统是一款以 libos 设计思想为核心架构的轻量级嵌入式操作系统,专为低资源微控制器(MCU)场景量身打造。其设计理念聚焦于资源高效利用与开发便捷性,通过精简核心功能与优化执行逻辑,在有限的硬件资源下实现稳定可靠的任务管理。作为典型的协作式异步操作系统,Chaos-nano 不依赖硬件中断进行任务抢占,而是通过任务主动让出执行权的方式完成调度,非常适合内存容量受限(通常为 KB 级)、对实时性要求不高的嵌入式项目,如小型传感器节点、简易控制模块、家用电子设备等场景。
代码下载地址
目前该项目代码已经开源,可以在 github 上下载。
下载地址:https://github.com/Chaos2025/Chaos-nano
系统特性
无动态内存依赖的静态资源管理
Chaos-nano 从底层设计上彻底摒弃了 malloc / free 等动态内存操作函数,转而采用静态数组作为所有资源的载体。这一设计决策源于低内存 MCU 的硬件特性 —— 动态内存分配可能导致内存碎片、分配失败、资源占用高等不可控问题,而静态数组通过编译期确定内存布局,可从根源上避免此类风险。例如,系统中的任务控制块、定时器结构体等核心组件均通过静态数组预分配,从而减少了动态内存操作带来的风险和性能损失。
在开发阶段,开发者需根据项目需求提前规划资源容量:数组长度需匹配项目最大任务数、最大定时任务数等指标。以定时器模块为例,每个任务会对应一个预定义的静态结构体,延迟时长、是否阻塞等参数;当任务触发延迟操作时,系统通过任务的任务 ID 作为索引直接复用数组中的结构体资源,无需动态申请内存,既保证了内存使用的可预测性(内存占用在编译时即可确定),也降低了系统运行时的资源开销(省去动态内存分配的计算成本)。
基于优先级的调度机制
Chaos-nano 内置了基于优先级的任务调度器,通过一个单字节(8 bits)的优先级汇总标志字节实现高效的就绪状态管理。标志字节的每一位对应一个优先级(共支持 0-7 级,数值越大优先级越低),当某一优先级下有任务就绪时,对应位会被置 1。调度器每次运行时,会从置位的优先级中选取最高级别的任务执行,确保高优先级任务优先获得 CPU 时间,保障关键操作的响应效率。
由于面向低内存 MCU 设计,系统未为每个任务分配独立堆栈,因此所有任务共享同一个堆栈 —— 任务调度仅在当前任务主动返回(如执行完当前阶段逻辑、触发延迟等)时发生。这一特性要求开发者在任务设计中采用状态机模式:将复杂任务拆解为多个独立的小阶段,每个阶段完成后主动让出 CPU(返回调度器)。例如,一个数据采集任务可拆分为 “初始化传感器”、“等待采样完成”、“处理数据” 等阶段,每个阶段结束后返回调度器,从而使更高优先级任务能够及时执行,在协作模式下满足基本的实时性需求。
轻量简化的任务管理模型
Chaos-nano 的任务管理模块以 “精简够用” 为原则,核心仅通过一个 block(阻塞)标志位实现任务状态控制。任务创建时默认处于阻塞状态。当任务触发阻塞操作(如延迟、等待事件)时,block 标志位置位,同时该任务在调度汇总标志字节中对应的优先级位清零;当阻塞条件解除(如延迟结束、事件触发)时,block 标志位清零,任务重新进入就绪状态等待调度。
这种极简设计大幅降低了任务管理的内存开销(每个任务仅需 1 位存储状态),同时简化了开发者的使用成本 —— 无需关注复杂的任务状态转换逻辑,仅需通过系统 API 控制阻塞状态即可实现基本的任务调度需求。
任务的阻塞管理还能简化中断服务程序,减少中断嵌套的使用:
- 可在设备中断中仅执行 “启动设备任务” 的简短操作,将复杂逻辑移交任务处理,缩短中断服务时间;
- 由于中断代码精简,可将部分设备的中断优先级转化为对应任务的优先级,减少中断嵌套层数,降低因嵌套过深导致的栈溢出风险。
此外,任务阻塞状态的设计使 CPU 无需空等阻塞任务,可转向执行其他就绪任务,显著提升了 CPU 利用率,并支撑系统实现异步工作模式。
高效可控的定时功能
系统提供了灵活的延迟函数接口,支持任务进行阻塞式或非阻塞式延迟操作,以优化 MCU 的资源利用率。
- 阻塞式延迟:任务调用阻塞延迟函数时,系统记录延迟时长并置位
block 标志位,任务从就绪状态转为阻塞状态,暂时退出调度。延迟期间,CPU 可被其他就绪任务占用,避免空循环等待造成的资源浪费。当延迟时间到达后,系统自动清除 block 标志位,任务重新进入就绪队列等待调度。
- 非阻塞式延迟:适用于需周期性检查状态的场景。任务调用非阻塞延迟函数后不会立即阻塞,而是通过返回剩余延迟时间的方式,允许任务在等待期间执行其他轻量操作(如状态查询、简单计算),直至延迟结束。
定时功能的实现依赖于系统基准时钟(通常由 MCU 的定时器中断提供,如 1ms 触发一次)。每次时钟中断都会更新所有活跃延迟任务的剩余时间计数,确保延迟精度与系统时钟同步,满足毫秒级定时需求。
由于定时器为每个任务分配了一个结构体,所以所有的任务可以同时进行延迟操作,并在延迟结束后及时被唤醒。
简单的电源管理
当调度器检测到无任何就绪任务时,系统会自动进入 idle(空闲)任务。在 idle 任务中,开发者可通过配置将 MCU 切换至低功耗模式(如休眠模式、停机模式等),从而降低系统待机功耗,延长电池供电设备的续航时间。这一设计无需复杂的电源管理逻辑,即可适配低功耗场景需求。
极低的资源占用率
通过上述特性的协同优化,Chaos-nano 实现了极低的资源占用:核心代码通常仅需数 KB Flash 存储空间和数百字节 RAM 运行内存,完美适配 8 位或 16 位低资源 MCU(如 STM8、AVR 等系列)。其稳定、可预测的任务调度与管理能力,使其成为小型嵌入式项目的高效解决方案,尤其适合资源受限且需平衡功能与成本的场景。
测试
目前通过在系统中通过创建 “test“任务和“bleed”任务,在每个任务中通过定时器延迟一定的时间后打印一条信息来进行测试。
15:40:54.436 -> [test:] loop(true)
15:40:55.693 -> [test:] loop(true)
15:40:55.693 -> [Bleed:] loop(true)
15:40:56.954 -> [test:] loop(true)
15:40:58.210 -> [test:] loop(true)
15:40:58.211 -> [Bleed:] loop(true)
15:40:59.470 -> [test:] loop(true)
15:41:00.727 -> [test:] loop(true)
15:41:00.727 -> [Bleed:] loop(true)
15:41:01.953 -> [test:] loop(true)
15:41:03.211 -> [test:] loop(true)
15:41:03.211 -> [Bleed:] loop(true)
15:41:04.464 -> [test:] loop(true)
15:41:05.719 -> [test:] loop(true)
15:41:05.719 -> [Bleed:] loop(true)
15:41:06.978 -> [test:] loop(true)