mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-02-05 19:39:42 +08:00
@@ -324,22 +324,6 @@ CosyOS-II 中断挂起服务缓存队列(PendSV_FIFO),已实现所有内
|
||||
* 用户中断应遵循快进快出的原则,对事件仅做必要的紧急处理,再以同步方式通知 **中断服务任务** 做善后处理。<br>
|
||||
* 用户中断的最大执行时间应远小于系统滴答周期,这将促使整个系统更加良性的运行。<br>
|
||||
|
||||
### 调用服务注意事项
|
||||
在中断中调用服务时,需要注意以下事项。<br>
|
||||
* **中断中写全局变量** <br>
|
||||
当用户在中断中调用iWriteGVar(gv, lv)、iWriteGAry(gp, lp, size)、iWriteGStr(gs, ls)写一个全局变量时,局部变量要做为专用。<br>
|
||||
1、当服务调用以后,该局部变量在本次中断中不应该被改变,原因是写全局变量为挂起服务;<br>
|
||||
2、如果某次进入中断以后,该局部变量被更新,必须再次调用相同的服务写同一个全局变量。<br>
|
||||
* **中断中发送邮件** <br>
|
||||
当用户在中断中调用iSendMail(mbox, mail)发送邮件时,mail所指向的局部邮箱要做为专用。<br>
|
||||
1、当服务调用以后,该局部邮箱在本次中断中不应该被改变,原因是发送邮件为挂起服务;<br>
|
||||
2、如果某次进入中断以后,该局部邮箱被更新,必须再次调用相同的服务发送邮件至同一个邮箱。<br>
|
||||
* **中断中接收邮件** <br>
|
||||
1、当用户在中断中调用iRecvMail(mail, mbox)接收邮件时,其它不同优先级的中断、任务、滴答,均不可再接收这一邮箱中的邮件。也就是说,所有任务和滴答可以接收来自同一个邮箱中的邮件;所有相同优先级的中断可以接收来自同一个邮箱中的邮件。<br>
|
||||
2、当邮箱的数据类型为非原子访问类型时,中断最好不要发送邮件给中断(除非这个中断的发生频率足够低,可确保在PendSV中最终完成发送以后,这个中断才会再次发生),否则会有出错的风险。<br>
|
||||
* **中断中接收飞信** <br>
|
||||
1、当用户在中断中调用iRecvFetion(tbox)接收飞信时,其它不同优先级的中断、任务、滴答,均不可再接收这一信箱中的飞信。也就是说,所有任务和滴答可以接收来自同一个信箱中的飞信;所有相同优先级的中断可以接收来自同一个信箱中的飞信。<br>
|
||||
|
||||
## 第三章、线程同步
|
||||
|
||||
### 事件同步
|
||||
@@ -389,11 +373,19 @@ CosyOS-II 中断挂起服务缓存队列(PendSV_FIFO),已实现所有内
|
||||
可重入访问、互斥访问;<br>
|
||||
|
||||
### 临界区
|
||||
CosyOS的临界区可分为任务临界区、服务层临界区、全局临界区。<br>
|
||||
* **任务临界区** 任务级的临界区保护,仅关闭系统中断(SysTick、PendSV)。<br>
|
||||
* **服务层临界区** 任务临界区 + 系统滴答 + 挂起服务调用/钩子,即CosyOS实时运行模型中的服务层,可实现系统级的临界区保护。<br>
|
||||
* **全局临界区** 系统级的临界区保护,会关闭总中断。<br>
|
||||
CosyOS内核中从来不会进入全局临界区,提供此项服务只是为了便于用户对全局公共资源和程序过程的保护。<br>
|
||||
CosyOS的临界区可分为 **任务临界区**、**服务层临界区**、**全局临界区**。<br>
|
||||
* **任务临界区** <br>
|
||||
任务级的临界区保护,仅关闭系统中断(SysTick、PendSV)。<br>
|
||||
* **服务层临界区** <br>
|
||||
任务临界区 + 系统滴答 + 挂起服务调用/钩子,即CosyOS实时运行模型中的服务层,可实现系统级的临界区保护。<br>
|
||||
对同一个全局公共资源的访问:<br>
|
||||
1、任务中需进入任务临界区访问;<br>
|
||||
2、滴答中直接访问即可;<br>
|
||||
3、中断中采用挂起服务调用/钩子来访问;<br>
|
||||
如此即可实现全局的互斥访问。<br>
|
||||
* **全局临界区** <br>
|
||||
系统级的临界区保护,会关闭总中断。<br>
|
||||
_CosyOS内核中从来不会进入全局临界区,提供此项服务只是为了便于用户对全局公共资源或程序过程的保护。_ <br>
|
||||
|
||||
任务临界区、全局临界区,都支持嵌套功能,最大嵌套深度:255。<br>
|
||||
|
||||
@@ -413,4 +405,34 @@ CosyOS内核中从来不会进入全局临界区,提供此项服务只是为
|
||||
2、二值信号量:弊端是如果获取失败将导致访问失败。<br>
|
||||
3、全局临界区:弊端是关闭总中断会破坏零中断延迟。<br>
|
||||
|
||||
## 第五章、XXX
|
||||
## 第六章、调用服务注意事项
|
||||
|
||||
### CosyOS-II 在临界区中或关闭总中断时调用服务注意事项
|
||||
* 在任务中,以下服务不支持在临界区中(包括任务临界区和全局临界区)或关闭总中断时调用:<br>
|
||||
1、启动任务:uStartTask(task, status)、uStartTask_Ready(task)、uStartTask_Suspend(task)。<br>
|
||||
2、互斥信号量获取:uTakeMut(mut, tc)。<br>
|
||||
3、二值信号量等待:uWaitBin(bin, tc)。<br>
|
||||
4、二值信号量获取:uTakeBin(bin, tc)。<br>
|
||||
5、计数信号量获取:uTakeSem(sem, tc)。<br>
|
||||
6、接收飞信:uRecvFetion(tbox, tc)。<br>
|
||||
7、接收私信:uRecvTaskMsg(tc)。<br>
|
||||
8、接收邮件:uRecvMail(mail, mbox, tc)。<br>
|
||||
9、接收消息:uRecvMsg(que, tc)。<br>
|
||||
A、等待标志组:uWaitFlagGroup(group, tc)。<br>
|
||||
<br>
|
||||
* 其它会导致任务调度/切换的服务,虽支持在临界区中或关闭总中断时调用,但也必须等到最终退出临界区或开启总中断后才能切换任务。<br>
|
||||
|
||||
### CosyOS-II 在中断中调用服务注意事项
|
||||
* **中断中写全局变量** <br>
|
||||
当用户在中断中调用iWriteGVar(gv, lv)、iWriteGAry(gp, lp, size)、iWriteGStr(gs, ls)写一个全局变量时,局部变量要做为专用。<br>
|
||||
1、当服务调用以后,该局部变量在本次中断中不应该被改变,原因是写全局变量为挂起服务;<br>
|
||||
2、如果某次进入中断以后,该局部变量被更新,必须再次调用相同的服务写同一个全局变量。<br>
|
||||
* **中断中发送邮件** <br>
|
||||
当用户在中断中调用iSendMail(mbox, mail)发送邮件时,mail所指向的局部邮箱要做为专用。<br>
|
||||
1、当服务调用以后,该局部邮箱在本次中断中不应该被改变,原因是发送邮件为挂起服务;<br>
|
||||
2、如果某次进入中断以后,该局部邮箱被更新,必须再次调用相同的服务发送邮件至同一个邮箱。<br>
|
||||
* **中断中接收邮件** <br>
|
||||
1、当用户在中断中调用iRecvMail(mail, mbox)接收邮件时,其它不同优先级的中断、任务、滴答,均不可再接收这一邮箱中的邮件。也就是说,所有任务和滴答可以接收来自同一个邮箱中的邮件;所有相同优先级的中断可以接收来自同一个邮箱中的邮件。<br>
|
||||
2、当邮箱的数据类型为非原子访问类型时,中断最好不要发送邮件给中断(除非这个中断的发生频率足够低,可确保在PendSV中最终完成发送以后,这个中断才会再次发生),否则会有出错的风险。<br>
|
||||
* **中断中接收飞信** <br>
|
||||
1、当用户在中断中调用iRecvFetion(tbox)接收飞信时,其它不同优先级的中断、任务、滴答,均不可再接收这一信箱中的飞信。也就是说,所有任务和滴答可以接收来自同一个信箱中的飞信;所有相同优先级的中断可以接收来自同一个信箱中的飞信。<br>
|
||||
|
||||
Reference in New Issue
Block a user