update 说明文档/CosyOS原理与应用.md.

Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
This commit is contained in:
零中断延迟的RTOS
2024-01-03 11:56:59 +00:00
committed by Gitee
parent 7d1fe43f37
commit 0200e38436

View File

@@ -253,44 +253,41 @@ MCU的核心价值在于中断的使用实现对紧急事件的及时响应
高速PWM失调、影响调制精度<br>
高速信号采样(丢失采样、采样点偏离)<br>
事实上RTOS以关闭总中断的方式来保护临界段是最为直接有效的可实现最少的指令。
CosyOS通过特殊的方法来保护临界段必然是走了一条弯路需要执行更多的指令牺牲了
整体的运行效率但同时确换取了零中断延迟这一点与RTOS通过牺牲整体的运行效率来换
取实时性是相同的道理。
事实上RTOS以关闭总中断的方式来保护临界段是最为直接有效的可实现最少的指令。CosyOS通过特殊的方法来保护临界段必然是走了一条弯路需要执行更多的指令牺牲了整体的运行效率但同时确换取了零中断延迟这一点与RTOS通过牺牲整体的运行效率来换取实时性是相同的道理。<br>
零中断延迟是CosyOS的宗旨是原则和底线必须坚决贯彻落实。
零中断延迟是CosyOS的宗旨是原则和底线必须坚决贯彻落实。<br>
### 零中断延迟基本原理
服务层中SysTick、PendSV、任务临界区三者间是互斥访问的。换言之整个服务层是一个大临界区。
所有内核服务(中断本地服务除外),均在服务层(临界区)执行,从而保证服务的“操作流”不会被打断。
中断本地服务采用互斥访问机制。
* 服务层中SysTick、PendSV、任务临界区三者间是互斥访问的。换言之整个服务层是一个大临界区。<br>
* 所有内核服务(中断本地服务除外),均在服务层(临界区)执行,从而保证服务的“操作流”不会被打断。<br>
* 中断本地服务采用互斥访问机制。<br>
### 服务详解
任务服务
* **任务服务**
是指在任务中调用的服务,并在任务临界区中执行。
滴答服务
* **滴答服务**
是指在滴答中调用的服务,并在滴答中执行。
用户可在滴答钩子、定时中断钩子、定时查询钩子中调用滴答服务。
中断服务
* **中断服务**
是指在用户中断中调用的服务,分为中断本地服务和中断挂起服务。
中断本地服务
* **中断本地服务**
是指在中断中调用并直接本地执行的服务,需要互斥访问机制相配合。
中断挂起服务
* **中断挂起服务**
是指在中断中调用的服务不在本地直接执行,而是把服务的相关信息存入局部的结构体中,
再把结构体指针存入中断挂起服务缓存再触发PendSV而后在PendSV中执行。
### 互斥访问机制
用户中断中读全局变量
重入访问:如果变量正在被写入,仍可成功读取变量。
首先,用户需定义全局变量的副本,并按照指定方式来更新副本。中断中读全局变量时,
需调用 iWhichGVarToRead 来询问应该读哪一个全局变量返回0读正本返回1读副本。
* 用户中断中读全局变量 <br>
重入访问:如果变量正在被写入,仍可成功读取变量。<br>
首先,用户需定义全局变量的副本,并按照指定方式来更新副本。中断中读全局变量时,<br>
需调用 iWhichGVarToRead 来询问应该读哪一个全局变量返回0读正本返回1读副本。<br>
用户中断中接收邮件
重入访问:如果邮箱正在被写入,仍可成功接收邮件(将读取写入过程所读取的局部邮箱)。
互斥访问如果邮箱正在被写入将返回失败false
* 用户中断中接收邮件
重入访问:如果邮箱正在被写入,仍可成功接收邮件(将读取写入过程所读取的局部邮箱)。<br>
互斥访问如果邮箱正在被写入将返回失败false<br>
用户中断中接收消息
互斥访问如果队列正在被访问将返回失败NULL
* 用户中断中接收消息
互斥访问如果队列正在被访问将返回失败NULL<br>
### 中断挂起服务缓存队列PendSV_FIFO
CosyOS-II 中断挂起服务缓存队列已实现所有内核的MCU均为先入先出队列FIFO