From 29428703b6157be415768435ba30d0233e266f1e Mon Sep 17 00:00:00 2001 From: MacRsh <1063220965@qq.com> Date: Thu, 13 Mar 2025 22:11:07 +0800 Subject: [PATCH] docs(README): Add readme. --- README.md | 50 +++++++++++++++++++++++++++ document/resource/README/kobject.png | Bin 0 -> 21365 bytes include/kernel/mr_kversion.h | 2 +- 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 README.md create mode 100644 document/resource/README/kobject.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c68591 --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +

MR-X

+ +MR-X是一个高度模块化的内核,专为资源受限的嵌入式系统设计。提供确定性执行环境和完整系统服务,使开发者能够构建可靠的嵌入式应用,同时保持极小的内存占用和高效的资源利用。 + +## 核心特性 + +- **模块化架构**:通过配置宏按需引入功能模块,实现极致的资源优化 +- **对象管理系统**:基于Kobject的统一对象模型,实现引用计数和分层组织 +- **内存管理**:高效的动态内存分配器,支持标准内存操作接口 +- **定时器系统**:精确的定时服务支持一次性和周期性定时任务 +- **工作队列**:灵活的任务延迟执行框架,优化系统响应性 +- **同步机制**:提供自旋锁、原子操作等线程安全原语 +- **标准库实现**:轻量级的字符串处理、格式化输出等基础函数 +- **初始化框架**:依赖感知的系统初始化机制,确保组件正确启动顺序 + +## 关键组件 + +### Kobject系统 + +Kobject(内核对象)系统是MR-X的核心基础设施,提供统一的对象管理框架: + +- **引用计数**:通过Kref实现精确的对象生命周期管理,防止内存泄漏,确保资源正确释放 +- **层次结构**:对象按父子树结构组织,支持基于路径的对象查找和遍历 +- **类型系统**:ktype机制支持多态行为和特定对象的释放方法,实现通用与特定行为的分离 +- **属性接口**:对象可暴露可读写属性,支持运行时配置和状态监控 +- **命名空间**:类文件系统的路径访问方式,简化对象定位和管理 + +![Kobject](document/resource/README/kobject.png) + +### Ktimer系统 + +Ktimer(内核定时器)提供高精度的定时服务,是实时操作的关键组件: + +- **双模式支持**:一次性定时与周期性定时统一接口 +- **回调机制**:定时到期时自动触发用户定义函数 +- **动态控制**:运行时可启动、停止、修改定时参数 +- **精确调度**:基于系统时钟提供确定性的时间行为 +- **对象化管理**:作为Kobject实例,集成引用计数和层次管理 + +### 工作队列系统 (kworkqueue) + +kworkqueue提供任务延迟执行机制,实现资源高效利用: + +- **执行模式**:支持即时执行和定时延迟执行 +- **上下文转换**:安全地将中断上下文任务转移到线程上下文 +- **任务模型**:通过工作项封装回调函数和上下文数据 +- **定时集成**:与ktimer紧密集成实现精确的执行调度 +- **电源管理**:支持自定义挂起/唤醒钩子函数,便于系统线程/功耗管理 +- **对象化设计**:利用Kobject特性实现统一的生命周期管理 + diff --git a/document/resource/README/kobject.png b/document/resource/README/kobject.png new file mode 100644 index 0000000000000000000000000000000000000000..e0a3aa46ac80a84049b3b3e2f3ffccb9fecd2048 GIT binary patch literal 21365 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