mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-02-05 19:39:42 +08:00
@@ -306,27 +306,31 @@ CosyOS的消息队列包括静态队列和动态队列。<br>
|
||||
可重入访问、互斥访问;<br>
|
||||
|
||||
### 临界区
|
||||
|
||||
* **临界区分类** <br>
|
||||
CosyOS的临界区可分为 **任务临界区**、**服务层临界区**、**全局临界区**。<br>
|
||||
* **任务临界区** <br>
|
||||
**1、任务临界区** <br>
|
||||
任务级的临界区保护,仅关闭系统中断(SysTick、PendSV)。<br>
|
||||
* **服务层临界区** <br>
|
||||
**2、服务层临界区** <br>
|
||||
任务临界区 + 系统滴答 + 挂起服务调用/钩子,即CosyOS实时运行模型中的服务层,可实现系统级的临界区保护。<br>
|
||||
对同一个全局公共资源的访问:<br>
|
||||
1、任务中需进入任务临界区访问;<br>
|
||||
2、滴答中直接访问即可;<br>
|
||||
3、中断中采用挂起服务调用/钩子来访问;<br>
|
||||
(1)任务中需进入任务临界区访问;<br>
|
||||
(2)滴答中直接访问即可;<br>
|
||||
(3)中断中采用挂起服务调用/钩子来访问;<br>
|
||||
如此即可实现全局的互斥访问。<br>
|
||||
* **全局临界区** <br>
|
||||
**3、全局临界区** <br>
|
||||
系统级的临界区保护,会关闭总中断。<br>
|
||||
_CosyOS内核中从来不会进入全局临界区,提供此项服务只是为了便于用户对全局公共资源或程序过程的保护。_ <br>
|
||||
|
||||
_CosyOS内核中从来不会进入全局临界区,提供此项服务只是为了便于用户对全局公共资源或程序过程的保护。_ <br><br>
|
||||
任务临界区、全局临界区,都支持嵌套功能,最大嵌套深度:255。<br>
|
||||
|
||||
### 何时应用临界区?
|
||||
* **何时应用临界区** <br>
|
||||
1、对于CosyOS已经提供服务支持的功能,用户直接调用API实现即可,无需考虑临界区问题。<br>
|
||||
2、只有在任务中访问“事件标志组”和“非原子全局变量”时才需要用户自己进入“任务临界区”实现,具体请查阅《API用户参考手册》。<br>
|
||||
3、用户对其它公共资源或程序过程(不可重入)的保护,再考虑“临界区”或“其它互斥访问方式”来实现。<br>
|
||||
|
||||
* **临界区应用原则** <br>
|
||||
临界区应遵循快进快出的原则,临界段代码的执行时间应远小于系统滴答周期,这将促使整个系统更加良性的运行。<br>
|
||||
|
||||
### 互斥访问
|
||||
各访问者对同一个目标资源的访问过程是互相排斥的,即每次只允许一个访问者访问目标资源,目标资源是不可重入资源。<br>
|
||||
下列所述为CosyOS推荐方案:<br>
|
||||
@@ -334,7 +338,7 @@ CosyOS的临界区可分为 **任务临界区**、**服务层临界区**、**全
|
||||
1、互斥信号量:访问耗时的、实时性要求不高的,应尽量采用互斥信号量。<br>
|
||||
2、任务临界区:访问迅速的、实时性要求较高的,再考虑任务临界区。<br>
|
||||
* **全局公共资源** <br>
|
||||
1、服务层临界区:此方式为最优解,可实现全局成功的互斥访问。<br>
|
||||
1、服务层临界区:可实现全局成功的互斥访问,应首先考虑。<br>
|
||||
2、二值信号量:弊端是如果获取失败将导致访问失败。<br>
|
||||
3、全局临界区:弊端是关闭总中断会破坏零中断延迟。<br>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user