如何解决DisableAllInterrupts VS SuspendAllInterrupts (OSEK\VDX)
我想知道OSEK中DisableAllInterrupts
和SuspendAllInterrupts
的区别?
解决方法
禁用/启用接口不适合嵌套。 suspend/resume 可以嵌套,这样如果一个函数在调用者已经挂起时挂起和恢复,中断只会在最外层的恢复调用中启用。
文档还指出 suspend 保存“识别状态”。我不清楚这意味着什么;我查看了整个文档,但没有任何地方清楚地定义该术语。我假设之前识别的所有中断在调用后都会恢复。这将(我猜)意味着如果您在挂起时启用了新的中断,则恢复可能会禁用它。另一方面,在 disabled 部分中启用新中断将在 enable 后持续存在。然而,IMO 尚不清楚。
嵌套挂起/恢复的工作方式如下:
-
会有一个计数器,当suspend被调用时,如果计数器为零,则中断中断,保存识别状态。在任何情况下,计数器都会递增。
-
调用resume时,计数器递减,如果为零,则恢复识别状态并启用中断。
这样的效果是如果你例如:
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
如果您在可能从其他函数调用的函数中编写临界区,则应使用挂起/恢复。如果您在上述场景中使用禁用/启用,则会过早启用中断:
Interrupts
--------------------------------
Enabled
disable() ; Disabled
enable() ; Enabled
enable() ; Enabled
disable() ; Disabled
disable() ; Disabled
enable() ; Enabled
enable() ; Enabled
enable() ; Enabled
在启用/禁用嵌套中看到没有效果。如果您从临界区调用函数,而这些函数中可能也有临界区,则应使用嵌套 - 以确保外部临界区不会过早终止。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。