DisableAllInterrupts VS SuspendAllInterrupts (OSEK\VDX)
DisableAllInterrupts VS SuspendAllInterrupts (OSEK\VDX)
我想知道 OSEK 中 DisableAllInterrupts
和 SuspendAllInterrupts
的区别?
disable/enable接口不适合嵌套。 suspend/resume 可以嵌套,这样如果一个函数在调用者已经挂起时挂起和恢复,中断只会在最外层的恢复调用上启用。
文档还说suspend保存“识别状态”。我不清楚那是什么意思;我查看了整个文档,但没有清楚地定义该术语。我假设之前识别的所有中断都在调用后恢复。那(我猜)意味着如果您在挂起时启用了一个新中断,则恢复可能会禁用它。另一方面,在 disabled 部分中启用新中断将在 enable 之后持续存在。然而 IMO 还不清楚。
嵌套 suspend/resume 将按如下方式工作:
会有一个计数器,当调用suspend时,如果计数器为零,则中断被挂起,识别状态被保存。在任何情况下,计数器都会增加。
当调用resume时,计数器减1,如果变为0,则恢复识别状态并允许中断。
效果是,例如:
Nest-count Interrupts
-----------------------------------------------
0 Enabled
suspend() ; 1 Disabled
suspend() ; 2 Disabled
resume() ; 1 Disabled
suspend() ; 2 Disabled
suspend() ; 3 Disabled
resume() ; 2 Disabled
resume() ; 1 Disabled
resume() ; 0 Enabled
如果您在一个可能被其他函数调用的函数中编写临界区,您应该使用 suspend/resume。如果您在上述情况下使用 disable/enable,它会过早地启用中断:
Interrupts
--------------------------------
Enabled
disable() ; Disabled
enable() ; Enabled
enable() ; Enabled
disable() ; Disabled
disable() ; Disabled
enable() ; Enabled
enable() ; Enabled
enable() ; Enabled
看到在enable/disable中嵌套没有效果。如果您从临界区调用函数,而此类函数中可能也包含临界区,则应使用嵌套 - 以确保外部临界区不会过早终止。
我想知道 OSEK 中 DisableAllInterrupts
和 SuspendAllInterrupts
的区别?
disable/enable接口不适合嵌套。 suspend/resume 可以嵌套,这样如果一个函数在调用者已经挂起时挂起和恢复,中断只会在最外层的恢复调用上启用。
文档还说suspend保存“识别状态”。我不清楚那是什么意思;我查看了整个文档,但没有清楚地定义该术语。我假设之前识别的所有中断都在调用后恢复。那(我猜)意味着如果您在挂起时启用了一个新中断,则恢复可能会禁用它。另一方面,在 disabled 部分中启用新中断将在 enable 之后持续存在。然而 IMO 还不清楚。
嵌套 suspend/resume 将按如下方式工作:
会有一个计数器,当调用suspend时,如果计数器为零,则中断被挂起,识别状态被保存。在任何情况下,计数器都会增加。
当调用resume时,计数器减1,如果变为0,则恢复识别状态并允许中断。
效果是,例如:
Nest-count Interrupts
-----------------------------------------------
0 Enabled
suspend() ; 1 Disabled
suspend() ; 2 Disabled
resume() ; 1 Disabled
suspend() ; 2 Disabled
suspend() ; 3 Disabled
resume() ; 2 Disabled
resume() ; 1 Disabled
resume() ; 0 Enabled
如果您在一个可能被其他函数调用的函数中编写临界区,您应该使用 suspend/resume。如果您在上述情况下使用 disable/enable,它会过早地启用中断:
Interrupts
--------------------------------
Enabled
disable() ; Disabled
enable() ; Enabled
enable() ; Enabled
disable() ; Disabled
disable() ; Disabled
enable() ; Enabled
enable() ; Enabled
enable() ; Enabled
看到在enable/disable中嵌套没有效果。如果您从临界区调用函数,而此类函数中可能也包含临界区,则应使用嵌套 - 以确保外部临界区不会过早终止。