mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-02-05 19:39:42 +08:00
@@ -235,10 +235,75 @@ opd:中断挂起服务缓存溢出。<br>
|
|||||||
1. taskmgr,启动任务管理器。<br>
|
1. taskmgr,启动任务管理器。<br>
|
||||||
2. exit,退出任务管理器。<br>
|
2. exit,退出任务管理器。<br>
|
||||||
3. taskmgr /s=...,任务管理器更新速度,取值范围:[50~5000]ms。<br>
|
3. taskmgr /s=...,任务管理器更新速度,取值范围:[50~5000]ms。<br>
|
||||||
注意:命令仅支持小写字母,结尾必须加回车换行(\r\n)。
|
注意:命令仅支持小写字母,结尾必须加回车换行(\r\n)。<br>
|
||||||
|
|
||||||
## 第二章、中断篇
|
## 第二章、中断篇
|
||||||
|
|
||||||
|
### 什么是零中断延迟?<br>
|
||||||
|
零中断延迟并非是中断的响应时间为零,而是指当引入了RTOS以后,中断的响应时间仍然能够达到MCU内核特性的响应时间,即只要中断发生,就能按中断优先级立即抢占,绝不延误。也就是说,中断响应时间不受RTOS影响,与裸机编程是一样的。<br>
|
||||||
|
|
||||||
|
### 零中断延迟的意义 <br>
|
||||||
|
MCU的核心价值在于中断的使用,实现对紧急事件的及时响应并处理。如果RTOS内核以关闭总中断的方式来处理内核服务、保护临界段,则意味着会丢失对高速并发事件的响应,并导致处理延误。而“丢失响应”往往是致命的,“处理延误”有时也会产生不良后果。<br>
|
||||||
|
* 误区 <br>
|
||||||
|
即使关闭了总中断,用户中断被触发后标志位仍可置位,当开启总中断后仍可响应中断。<br>
|
||||||
|
首先,这已经导致了“处理延误”,如果超出允许范围会产生不良后果。<br>
|
||||||
|
其次,如果关闭总中断期间,某个用户中断并发(发生了两次或多次),当开启总中断后仅能响应并处理一次,即“丢失响应”。<br>
|
||||||
|
* 示例 <br>
|
||||||
|
高速通讯(丢帧)<br>
|
||||||
|
高速PWM(失调、影响调制精度)<br>
|
||||||
|
高速信号采样(丢失采样、采样点偏离)<br>
|
||||||
|
|
||||||
|
事实上,RTOS以关闭总中断的方式来保护临界段,是最为直接有效的,可实现最少的指令。
|
||||||
|
CosyOS通过特殊的方法来保护临界段,必然是走了一条弯路,需要执行更多的指令,牺牲了
|
||||||
|
整体的运行效率,但同时确换取了零中断延迟,这一点与RTOS通过牺牲整体的运行效率来换
|
||||||
|
取实时性是相同的道理。
|
||||||
|
|
||||||
|
零中断延迟是CosyOS的宗旨,是原则和底线,必须坚决贯彻落实。
|
||||||
|
|
||||||
|
### 零中断延迟基本原理
|
||||||
|
服务层中,SysTick、PendSV、任务临界区,三者间是互斥访问的。换言之,整个服务层是一个大临界区。
|
||||||
|
所有内核服务(中断本地服务除外),均在服务层(临界区)执行,从而保证服务的“操作流”不会被打断。
|
||||||
|
中断本地服务采用互斥访问机制。
|
||||||
|
|
||||||
|
### 服务详解
|
||||||
|
任务服务
|
||||||
|
是指在任务中调用的服务,并在任务临界区中执行。
|
||||||
|
滴答服务
|
||||||
|
是指在滴答中调用的服务,并在滴答中执行。
|
||||||
|
用户可在滴答钩子、定时中断钩子、定时查询钩子中调用滴答服务。
|
||||||
|
中断服务
|
||||||
|
是指在用户中断中调用的服务,分为中断本地服务和中断挂起服务。
|
||||||
|
中断本地服务
|
||||||
|
是指在中断中调用并直接本地执行的服务,需要互斥访问机制相配合。
|
||||||
|
中断挂起服务
|
||||||
|
是指在中断中调用的服务不在本地直接执行,而是把服务的相关信息存入局部的结构体中,
|
||||||
|
再把结构体指针存入中断挂起服务缓存,再触发PendSV,而后在PendSV中执行。
|
||||||
|
|
||||||
|
### 互斥访问机制
|
||||||
|
用户中断中读全局变量
|
||||||
|
重入访问:如果变量正在被写入,仍可成功读取变量。
|
||||||
|
首先,用户需定义全局变量的副本,并按照指定方式来更新副本。中断中读全局变量时,
|
||||||
|
需调用 iWhichGVarToRead 来询问:应该读哪一个全局变量?返回0读正本,返回1读副本。
|
||||||
|
|
||||||
|
用户中断中接收邮件
|
||||||
|
重入访问:如果邮箱正在被写入,仍可成功接收邮件(将读取写入过程所读取的局部邮箱)。
|
||||||
|
互斥访问:如果邮箱正在被写入,将返回失败(false)。
|
||||||
|
|
||||||
|
用户中断中接收消息
|
||||||
|
互斥访问:如果队列正在被访问,将返回失败(NULL)。
|
||||||
|
|
||||||
|
### 中断挂起服务缓存队列(PendSV_FIFO)
|
||||||
|
CosyOS-II 中断挂起服务缓存队列,已实现所有内核的MCU均为先入先出队列(FIFO)。
|
||||||
|
中断挂起服务缓存队列,有必要先入先出吗?答案是确定的,原因在于当中断并发时,服务
|
||||||
|
的执行顺序要符合“不同中断间可能存在的”和“同一个中断中必然存在的”提请服务的时
|
||||||
|
序逻辑关系。
|
||||||
|
再有,“入队列”与“出队列”的过程必须是原子操作,操作流不能被打断。
|
||||||
|
|
||||||
|
### 中断
|
||||||
|
为实现零中断延迟,用户中断应尽量避免使用最低优先级。
|
||||||
|
用户中断应遵循快进快出的原则,仅执行最为紧急的工作,而把可以稍缓的工作转为在任务中执行(中断服务任务)。
|
||||||
|
用户中断的最大执行时间应远小于系统滴答周期,这将促使整个系统更加良性的运行。
|
||||||
|
|
||||||
## 第三章、线程同步
|
## 第三章、线程同步
|
||||||
|
|
||||||
## 第四章、互斥访问
|
## 第四章、互斥访问
|
||||||
|
|||||||
Reference in New Issue
Block a user