![logo](images/logo.png) _温馨舒适的操作系统、零中断延迟的操作系统_ :grey_exclamation: 

![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-1.3.4-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 取得重大技术突破，现已升级至 **CosyOS-II**，代码风格焕然一新，说明文档持续更新中。。。
* **CosyOS-II** 已支持 Cortex-M 系列全部内核，M0/M0+/M23/M3/M4/M33/M7。
* 原有 CosyOS-I 停止更新维护，但仍提供下载及技术支持。

### 序
当今形势下，已经有越来越多的用户对RTOS中断响应的实时性提出了要求，希望高优先级中断能够实时抢占（零中断延迟）。随着时代的发展、科技的进步，零中断延迟已经成为可能，RTOS正悄然的面临着一场时代的变革。

### 简介
CosyOS始创于2021年，并于2022年底完成kernel的第一个版本V1.0.0。作者以“零中断延迟”为宗旨，“突破创新”为方针，“简单易用”为原则，经过不懈的努力，终于大获成功。在实现传统技术推陈出新的同时，还独创了一些新技术。**从经典的8051内核，到流行的Arm Cortex-M内核，均可实现全局不关总中断、零中断延迟。** <br>

### CosyOS-实时运行模型
* **中断层** 【用户中断按中断优先级实时抢占、零中断延迟】
  * **用户中断** <br>
  **->** 中断本地服务的执行<br>
  **->** 中断挂起服务的装载<br>
* **服务层** 【内核服务】
  * **SysTick** [minpri]<br>
  **->** 软件RTC/定时器计数<br>
  **->** 恢复定时任务<br>
  **->** 调用定时钩子/滴答钩子（滴答服务的执行）<br>
  * **PendSV** [minpri]<br>
  **->** 中断挂起服务的执行<br>
  **->** 任务调度/切换<br>
  * **任务临界区** [关闭SysTick/PendSV]<br>
  **->** 任务服务的执行<br>
* **任务层** 【不同优先级的任务抢占式调度，相同优先级的任务时间片轮转调度】
  * Taskmgr[maxpri]
  * Debugger[maxpri]
  * Starter[maxpri-1]
  * 一般用户任务[maxpri-1 ~ minpri+1:1]
  * 用户空闲任务[minpri:0]
  * 系统空闲任务[minpri:0]

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

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

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

| 任务名称       | 任务优先级 | 任务栈大小 | 安全运行时 | 私信    |
|------------|-------|-------|-------|-------|
| demo1_task | 1级    | 128字节 | 0，无限长 | 0，无私信 |
| demo2_task | 2级    | 256字节 | 9个时间片 | 3个参数  |

注1：**安全运行时**是CosyOS的安全关键技术，可防止某任务长期独占或超时使用处理器。<br>
注2：**私信**是CosyOS独创的一种任务间通信方式，可用来实现信号、事件、消息等功能。<br>

```c
# 创建demo1_task
uCreateTask(demo1_task, 1, 128, 0, 0)
{
    uSendTaskMsg(demo2_task) "hello", 999, 3.14); // 发送私信至demo2_task
    uDelay_ms(100); // 阻塞延时100ms
    uEndTasking; // 所有任务线程的最后一句代码
}
```
```c
# 创建demo2_task
uCreateTask(demo2_task, 2, 256, 9, 3)(char *p, int a, float b)
{
    if(uRecvTaskMsg(500)){ // 接收私信，超时时间为500个滴答周期，返回真则接收成功
        /* 使用私信（读取p、a、b）*/
    }
    uEndTasking;
}
```
```c
# 启动钩子
void start_hook(void)
{
    uStartTask(demo1_task, 0); // 启动demo1_task并置任务的初始状态为就绪状态
    uStartTask(demo2_task, 1); // 启动demo2_task并置任务的初始状态为挂起状态
}
```

您有没有眼前一亮呢？CosyOS创建一个任务竟如此简单，通过调用API“uCreateTask”，输入各项参数并直接写任务代码即可（已集成用于任务循环的while(1)，用户可不必再写循环）。下一步就是在启动钩子中启动任务，任务便可参与调度并运行了。<br>
CosyOS还开创性的把任务形参用做私信，私信参数（数量、名称、类型）可随意定义，与普通函数定义形参如出一辙。其它应用也都有着异曲同工之妙，即无论做什么事，都尽可能做到简化流程一步完成，最大程度的降低开发者的工作量，给开发者创造一个温馨舒适的开发环境。<br>

### 突破创新
* 实现了**所有内核全局不关总中断（零中断延迟）**，保证了中断中用户代码的实时性
* 独家技术实现系统服务的可重入，使51彻底摆脱可重入栈、全面提速
* 针对51做了高度的性能优化，使51迸发出蓬勃生机、熠熠生辉
* 251支持MSP、PSP两种栈模式，其中PSP模式可使任务的切换效率等同于Cortex-M
* 独创的**飞信**，极简类型、极速通信，是线程间通信的利器
* 独创的**私信**，随意定义，灵活多变，便于多条消息的传递
* **软件RTC**，支持设置时间和获取时间，可替代硬件RTC
* **定时服务（软件定时器中断）**，包括定时中断任务/钩子、定时查询任务/钩子，优先级都可由用户灵活配置
* **消息邮箱**，每个邮箱在创建时，都可定义自己的数据类型，极大的丰富了邮件的形式，方便了线程间消息的传递
* **消息队列**，支持静态队列和动态队列，传输模式支持FIFO、LIFO，采用高效的指针引用方式
* **事件标志组**，声明标志组的同时定义标志位，不同标志组的标志位可以重名，对标志组和标志位的访问通过组名和位名来实现，极大的方便了标志组的应用
* **全局变量访问**，通过调用API可实现在任意任务和中断中对全局变量的安全访问，而不必担心重入的发生
* **安全关键技术**，拥有多项安全关键技术，如中断挂起服务空间隔离、安全运行时，可靠性高
* **任务栈监控**，拥有多项任务栈监控措施，可提前预判任务栈溢出的风险

### 因循守旧
* 完全开源的免版税、确定性的RTOS
* 任务调度支持抢占式调度、时间片轮转调度
* 用户任务数量不限，且每个任务都可以有255级优先级（0~254）
* 简洁高效的代码，极低的硬件资源占用，使CosyOS可轻松应用于各种小型MCU
* 任务管理器，可实时监控各任务的运行，便于开发者急时发现设计中存在的潜在问题<br>
![任务管理器](images/taskmgr.png "任务管理器")<br>
—————————— CosyOS-任务管理器 ——————————

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

### 编译环境
CosyOS是在keil C51、C251、MDK-Arm编译器下开发的，对其支持最好。<br>
未来，将会陆续优化调整对其它编译器的支持。

### 文件说明
| 名称     | 描述                           |
|--------|------------------------------|
|  **System**  |  **CosyOS的内核文件** <br>ur_api.h：用户API<br>sv_：系统服务文件<br>os_：其它内核文件 |
|  **Config**  |  **CosyOS的配置文件** <br>syscfg.h：系统配置文件<br>mcucfg_：MCU配置文件 |
|  **Hook**    |  **CosyOS的系统钩子** <br>CosyOS已经为用户创建好了六个系统钩子函数，<br>分别位于各自的同名文件中，用户直接写代码即可。 |

### 文档中心
#### [CosyOS原理与应用](https://gitee.com/cosyos/cosyos/blob/master/%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3/CosyOS%E5%8E%9F%E7%90%86%E4%B8%8E%E5%BA%94%E7%94%A8.md)
#### [开发流程](https://gitee.com/cosyos/cosyos/blob/master/%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3/%E5%BC%80%E5%8F%91%E6%B5%81%E7%A8%8B.md)
#### [API用户参考手册](https://gitee.com/cosyos/cosyos/blob/master/%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3/CosyOS-II%20API%20%E7%94%A8%E6%88%B7%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C_V1.0.0.rar)

### 参与贡献

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

 _CosyOS现征集试用者，可免费获得作者的一对一在线指导，您有什么疑问、意见或建议都可以提出来！_ <br>
