![logo](images/logo.png) -- _零中断延迟的RTOS_ :grey_exclamation: <br><br>
![Author](https://img.shields.io/badge/Author-迟凯峰-red?style=flat-square)
![languge](https://img.shields.io/badge/languge-C、Asm-blue)
![license](https://img.shields.io/badge/license-Apache2.0-brightgreen.svg)
![version](https://img.shields.io/badge/version-3.0.8-green)
[![star](https://gitee.com/cosyos/cosyos/badge/star.svg?theme=dark)](https://gitee.com/cosyos/cosyos/stargazers)
[![fork](https://gitee.com/cosyos/cosyos/badge/fork.svg?theme=dark)](https://gitee.com/cosyos/cosyos/members)

* CosyOS-QQ交流群：303421780.

### 最新消息
CosyOS-III V3.0.1 版本发布，针对 RISC-V32，推出了自研先进技术，可实现 **CH32V 全程开启硬件压栈** 。该技术为纯软件实现，不依赖特定硬件（0x804->bit5），V103、203 等皆可完美支持。

### 移植流程
**Cube安装方式：** <br>
**1、裸机工程** 先准备好项目的裸机工程。<br>
**2、升级安装** 运行 CosyOS-III Cube.exe，把 裸机工程 升级为 CosyOS工程。<br>
**3、系统构建** 打开工程，参照 CosyOS-例程（系统构建）> readme.txt 中的说明，完成系统构建。<br>

**手动移植方式：** <br>
RISC-V32 暂不支持 Cube安装，只能自行手动移植，移植可参考 Demo-Build/RISC-V32/readme.txt 中的说明，如移植过程中遇到问题可加入社区获取工程模板和技术支持。

### 序言
* 近年来，随着RTOS的普及及在嵌入式设备中的广泛应用，以关闭总中断等方式来保护临界段所带来的危害性（丢失响应、处理延误）正日益凸显出来，其中以高速通讯接收丢帧、高速捕获丢失脉冲等中断丢失响应现象最为紧要和普遍。有些RTOS关闭总中断可能过于频繁，且未能提供“系统最大关闭总中断时间”等核心关键参数，实时性有待商榷。<br>
* 随着时代的发展、科技的进步，零中断延迟已经成为可能，RTOS正悄然的面临着一场时代的变革... ...<br>
* 2023年，CosyOS 应运而生！<br>

### 简介
CosyOS是一款来自中国的开源实时操作系统，从经典的8051内核，到流行的Arm Cortex-M内核，均可实现全局不关总中断、零中断延迟，适用于对系统实时性及中断响应速度有较高要求的场合。CosyOS以极具浪漫主义色彩的宏定义，实现了高度的面向对象及良好的易用性。

### CosyOS-实时运行模型
* **用户中断层** [用户中断按中断优先级实时抢占、零中断延迟]<br>
    * 中断本地服务 -> 执行<br>
    * 中断FIFO服务 -> 装载<br>
    * 中断FLAG服务 -> 设置<br>
* **内核服务层**
  * **SysTick** [minpri]<br>
    * 系统节拍<br>
    * 滴答服务 -> 执行<br>
  * **PendSV** [minpri]<br>
    * 中断FIFO服务 -> 执行<br>
    * 中断FLAG服务 -> 执行<br>
    * 任务调度切换<br>
  * **内核锁** [关闭 SysTick/PendSV]<br>
    * 任务服务 -> 执行<br>
* **任务层**
  * 系统调试器 [maxpri]
  * 任务管理器 [maxpri-1]
  * 任务启动器 [maxpri-2]
  * 一般用户任务 [maxpri-3 ~ minpri+1:1]
  * 系统空闲任务 [minpri:0]<br>

### 零中断延迟
* 零中断延迟并非是中断响应时间为零，而是指当引入了RTOS以后，由RTOS保护临界段而导致的中断响应时间延迟为零。换言之，中断响应时间不受RTOS影响，与裸机编程是一样的。

### 零中断延迟基本原理
* 内核服务层中，SysTick、PendSV、内核锁，三者间是互斥访问的。换言之，整个服务层是一个大临界区（**服务层临界区**）。
* 所有内核服务（中断本地服务除外），均在服务层临界区执行，从而保证服务的 **“操作流”** 不会被打断。
* 中断本地服务，根据各自特征单独处理。

### 初体验
下面，让我们来初步体验一下CosyOS的易用性。<br>

 **CosyOS-III 一步创建任务示例：** <br>

| 任务名称 | 任务优先级 | 任务栈大小 | 安全运行时 | 任务名称文本（兼容模式）|
|------------|-------|-------|-------|-------|
| task_1 | 1级    | 128字节 | 0为无限长 | 0为自动引用任务名称，即"task_1" |
| task_2 | 2级    | 256字节 | 6滴答周期 | "task_led"为任务名称文本 |
| task_3 | 3级    | 384字节 | 9滴答周期 | "task_key"为任务名称文本 |

注：**安全运行时**是CosyOS的安全关键技术，可防止任务长期独占或超时使用处理器。<br>

```c
# 静态创建 task_1
uCreateTask(task_1, 1, 128, 0, 0)
{
    while(1){
        /* 任务代码 */
    }
}

# 动态创建 task_2
dCreateTask(task_2, 2, 256, 6, "task_led")
{
    while(1){
        /* 任务代码 */
    }
}

# 动态创建 task_3
dCreateTask(task_3, 3, 384, 9, "task_key")
{
    while(1){
        /* 任务代码 */
    }
}

# 启动钩子
void start_hook(void)
{
//  uScheduleLock();            // 如果不想在启动任务过程中进行任务调度，可开启调度锁。
    uStartTask_Ready  (task_1); // 启动 task_1，初始状态为就绪状态
    uStartTask_Block  (task_2); // 启动 task_2，初始状态为阻塞状态（阻塞类型为延时阻塞，延时时间为无限长）
    uStartTask_Suspend(task_3); // 启动 task_3，初始状态为挂起状态
//  uScheduleUnlock();
}
```

您有没有眼前一亮呢？CosyOS创建任务竟如此简单，通过调用API并输入各项参数，而后直接写任务代码即可。下一步就是在启动钩子中启动任务，任务便可参与调度并运行了。 _**任务静态创建与动态创建的相互转换也极为便利，API名称中，仅需 “u”改“d” 或 “d”改“u” 即可。**_ 

### 突破创新
* 所有支持内核均可实现 **全局不关总中断、零中断延迟**，从系统层面保证了用户中断的实时响应
* 领先的零中断延迟技术，率先应用于 8051、Cortex-M0 等处理器，在世界上可能尚属首例
* **任务就绪表**，采用 零/一/二级位图，保证了抢占式任务调度的硬实时性
* **三维链表**技术，可显著的减少操作链表，服务的执行速度更快
* 创新的**协作式调度**，协作仅作用于相同优先级的任务，具有高度的实用价值
* 独家技术实现系统服务的可重入，使51彻底摆脱可重入栈、全面提速
* **定时服务（软件定时器中断）**，包括任务和钩子，任务优先级都可由用户灵活配置
* **事件标志组**，对标志组和标志位的访问通过组名和位名来实现，极大的方便了标志组的应用
* **全局变量访问**，支持在任意任务和中断中对全局变量的安全访问，而不必担心重入的发生
* **安全关键技术**，有多项安全关键技术，如中断挂起服务空间隔离、安全运行时，可靠性高

### 因循守旧
* 完全开源的免版税、确定性的RTOS
* 任务调度，支持不同优先级“抢占式调度”，相同优先级“协作式调度”或“时间片轮转调度”
* 用户任务数量不限，最多支持256级任务优先级
* 简洁高效的代码，极低的硬件资源占用，使CosyOS可轻松应用于各种小型MCU
* 任务管理器，实时监控各任务的运行，协助开发者及时发现设计中存在的潜在问题<br>
<br>
![任务管理器](images/taskmgr.png "任务管理器")<br>
-—————— CosyOS-III 任务管理器 ——————-

### 支持架构
CosyOS 现支持 8051、80251、Cortex-M、RISC-V32 等架构，未来会陆续添加对其它架构的支持。<br>

### 编译环境
CosyOS 现支持 keil C51、C251、MDK-Arm（AC5、AC6），GCC-Arm，IAR-EWARM 等主流编译器，<br>
未来会继续提供对其它编译器的支持。

### 文件说明
| 名称 | 描述 |
|--------------------|------------------------------|
|  **System**        |  **内核文件** <br>CosyOS.H：系统链接头文件 <br>ur_api.h：用户API（含doxygen注释）<br>ur_eapi.h：用户API扩展 <br>sv_❃.c/h：内核服务文件 <br>os_❃.c/h：其它内核文件 |
|  **Hook**          |  **钩子文件** <br>CosyOS 已经为用户创建好了六个系统钩子函数，<br>分别位于各自的同名文件中，用户直接写代码即可。 |
|  **Port**          |  **移植文件** <br>syscfg.h：系统配置文件 <br>其它文件夹：各MCU配置和移植文件 |
|  **Demo-Build**    |  **例程文件** <br>例程文件 for 系统构建 |
|  **Setup**         |  **安装程序** <br>**CosyOS-III Cube** 升级安装程序 |
|  **Demo-Service**  |  **例程文件** <br>例程文件 for 服务应用 <br> _不会通过安装程序添加到工程中，用户需自行查阅。_ |

### 文档中心
#### [API用户参考手册](https://gitee.com/cosyos/cosyos/blob/master/CosyOS-III%20API%E7%94%A8%E6%88%B7%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C%20v3.0.0.chm)

 **[CosyOS官网](https://www.cosyos.com/)** 为大家提供了丰富的说明文档，包括 内核原理、开发指南、注意事项、疑难解答 等，可前往查阅。

### 参与贡献

1.  Fork 本仓库
2.  新建 Feat_xxx 分支
3.  提交代码
4.  新建 Pull Request
