mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-02-05 19:39:42 +08:00
@@ -119,20 +119,25 @@ CosyOS的任务调度时机分为 **定时调度** 与 **临时调度** 。<br>
|
||||
CosyOS的任务调度策略可最大程度的实现尽可能实时高效的任务切换,使CosyOS的实时性更为优异。<br>
|
||||
|
||||
### 八、任务栈
|
||||
|
||||
* **任务栈模式** <br>
|
||||
CosyOS把任务栈的处理方式称之为任务栈模式,共包括三种类型,MSP模式、PSP模式、MSP+PSP模式。<br>
|
||||
**MSP模式** 任务切换时,先拷贝主栈内容至当前任务栈(保存现场);再拷贝新任务栈内容至主栈(恢复现场)。<br>
|
||||
**PSP模式** 每个任务的任务栈都是主栈,哪个任务运行时,哪个任务的任务栈(当前任务栈)就是当前主栈。<br>
|
||||
**MSP+PSP模式** 中断时为Handler模式,入栈入的是主栈;任务时为Thread模式,入栈入的是当前任务栈。<br>
|
||||
1、对于51来说,CosyOS采用了搬栈这一传统方案,也就是MSP模式。<br>
|
||||
2、对于Arm来说,CosyOS所采用的方法当然是主流的双栈指针了,也就是MSP+PSP模式。<br>
|
||||
3、对于251来说,CosyOS支持MSP模式、PSP模式,这两种栈模式供用户选择。<br>
|
||||
**PSP模式与MSP+PSP模式的异同** :PSP模式,中断入栈也入任务栈,相比MSP+PSP模式,需要更大的任务栈,也就是需要更大的edata内存。<br>
|
||||
**1.MSP模式** 任务切换时,先拷贝主栈内容至当前任务栈(保存现场);再拷贝新任务栈内容至主栈(恢复现场)。<br>
|
||||
**2.PSP模式** 每个任务的任务栈都是主栈,哪个任务运行时,哪个任务的任务栈(当前任务栈)就是当前主栈。<br>
|
||||
**3.MSP+PSP模式** 中断时为Handler模式,入栈入的是主栈;任务时为Thread模式,入栈入的是当前任务栈。<br>
|
||||
对于51来说,CosyOS采用了搬栈这一传统方案,也就是MSP模式。<br>
|
||||
对于Arm来说,CosyOS所采用的方法当然是主流的双栈指针了,也就是MSP+PSP模式。<br>
|
||||
对于251来说,CosyOS支持MSP模式、PSP模式,这两种栈模式供用户选择。<br>
|
||||
|
||||
* **PSP模式与MSP+PSP模式的异同** <br>
|
||||
PSP模式,中断入栈也入任务栈,相比MSP+PSP模式,需要更大的任务栈,也就是需要更大的edata内存。<br>
|
||||
|
||||
* **MSP模式的优势** <br>
|
||||
凡事都是辩证的,有一利必有一弊。<br>
|
||||
MSP模式虽然在任务切换时会保存并恢复现场,导致效率较低,但只要主栈和内存池足够大,就可确保所有任务栈永不溢出。<br>
|
||||
当然,前提是任务栈得是动态的,CosyOS将自动启用任务栈重分配机制,以抵御任务栈溢出的风险。<br>
|
||||
这一点是PSP模式、MSP+PSP模式所不具备的。PSP模式、MSP+PSP模式,一旦任务栈溢出,既成事实,数据覆盖可能已经发生,无法挽回。<br>
|
||||
|
||||
* **任务栈重分配机制** <br>
|
||||
任务栈重分配机制,在正式的产品中可有效抵御任务栈溢出的风险。<br>
|
||||
在概率上,也许测试一年也不会碰到一次任务栈溢出,但大批量产品投入使用后不一定哪天就会碰到。<br>
|
||||
@@ -145,10 +150,10 @@ MSP模式虽然在任务切换时会保存并恢复现场,导致效率较低
|
||||
任务栈重分配机制的启用条件:<br>
|
||||
1、对于8051,当任务创建模式非静态创建时,CosyOS将自动启用任务栈重分配机制。<br>
|
||||
2、对于80251,当任务栈模式为MSP模式、任务创建模式非静态创建时,CosyOS将自动启用任务栈重分配机制。<br>
|
||||
* **任务栈之初始定义**
|
||||
1、对于51及251的MSP模式,当任务创建模式非静态创建时,任务栈的初始定义可以小(因为有重分配机制),而后根据监控及报警情况再调整(增大)。
|
||||
2、对于251的PSP模式及Arm的MSP+PSP模式,任务栈的初始定义一定要够大,否则可能会运行不起来或死机,而后再根据测试情况重新调整任务栈。
|
||||
3、对于251的PSP模式,由于中断入栈也入任务栈,所以需要用户自己根据中断的使用情况来计算一个中断嵌套入栈的最大size(不必包括最低优先级的中断入栈),累加到“前面的字节数”中,看是否会大于 “后面的字节数”,再行调整。
|
||||
|
||||
* **任务栈之初始定义** <br>
|
||||
1、对于51及251的MSP模式,当任务创建模式非静态创建时,任务栈的初始定义可以小(因为有重分配机制),而后根据监控及报警情况再增大。<br>
|
||||
2、对于251的PSP模式及Arm的MSP+PSP模式,任务栈的初始定义一定要够大,否则可能会运行不起来或死机,而后再根据测试情况重新调整任务栈。<br>
|
||||
|
||||
### 九、任务管理器
|
||||
|
||||
|
||||
Reference in New Issue
Block a user