operating-system - DisableAllInterrupts VS SuspendAllInterrupts (OSEK\VDX)
问题描述
我想知道OSEKDisableAllInterrupts
和in 的区别?SuspendAllInterrupts
解决方案
禁用/启用接口不适合嵌套。挂起/恢复可以嵌套,这样如果函数在调用者已经挂起时挂起并恢复,中断只会在最外层的恢复调用上启用。
该文档还指出,暂停保存“识别状态”。我不清楚这意味着什么。我浏览了整个文档,但没有一处清楚地定义该术语。我假设之前识别的所有中断都在调用后恢复。那将(我猜)意味着如果您在挂起时启用了新中断,则恢复可能会禁用它。另一方面,在禁用部分启用新中断将在启用后持续存在。然而,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
请参阅启用/禁用嵌套无效。如果您从临界区调用函数,而这些函数中可能也有临界区,则应该使用嵌套 - 以确保外部临界区不会过早终止。
推荐阅读
- r - 根据 dplyr R 中的多个条件删除组
- javascript - importScripts 的问题
- flutter - 更改未反映在颤振中添加到列表中
- r - 存储 igraph 的对象
- python - 如何使用scrapy [python] 将scrapy 制作成PDF
- junit - 如何知道测试是否被 PIT 突变测试中的 Junit 断言错误杀死
- security - 如何将 ESP8266 设备安全地连接到 Web 前端?
- openmp - 在 Xcode 中打开 MP 设置
- r - Shiny:向 uiOutput 中的列添加绘图
- animation - 在 Three.js 中镜像 FBX 动画