首页 > 解决方案 > DisableAllInterrupts VS SuspendAllInterrupts (OSEK\VDX)

问题描述

我想知道OSEKDisableAllInterrupts和in 的区别?SuspendAllInterrupts

OSEK 文档中的 DisableAllInterrupts 描述

OSEK 文档中的 SuspendAllInterrupts 描述

标签: operating-systemembeddedinterruptrtosautosar

解决方案


禁用/启用接口不适合嵌套。挂起/恢复可以嵌套,这样如果函数在调用者已经挂起时挂起并恢复,中断只会在最外层的恢复调用上启用。

该文档还指出,暂停保存“识别状态”。我不清楚这意味着什么。我浏览了整个文档,但没有一处清楚地定义该术语。我假设之前识别的所有中断都在调用后恢复。那将(我猜)意味着如果您在挂起时启用了新中断,则恢复可能会禁用它。另一方面,在禁用部分启用新中断将在启用后持续存在。然而,IMO 尚不清楚。

嵌套暂停/恢复将按如下方式工作:

  1. 会有一个计数器,当调用suspend时,如果计数器为零,则中断被挂起,识别状态被保存。在任何情况下,计数器都会递增。

  2. 当调用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

请参阅启用/禁用嵌套无效。如果您从临界区调用函数,而这些函数中可能也有临界区,则应该使用嵌套 - 以确保外部临界区不会过早终止。


推荐阅读