禁用所有中断 VS 暂停所有中断 (OSEK\VDX)

问题描述 投票:0回答:2

我想知道OSEK中

DisableAllInterrupts
SuspendAllInterrupts
之间的区别?

DisableAllInterrupts description in OSEK doc

SuspendAllInterrupts description in OSEK doc

operating-system embedded interrupt rtos autosar
2个回答
1
投票

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

文档还指出,suspend保存“识别状态”。我不清楚这意味着什么;我浏览了整个文档,没有任何地方明确定义该术语。我假设之前识别的所有中断在调用后都恢复了。这(我猜)意味着如果您在挂起时启用了新的中断,则恢复可能会禁用它。另一方面,在“disabled”部分中启用新中断将在“enable”之后持续存在。然而,IMO 还不太清楚。 嵌套挂起/恢复将按如下方式工作:

会有一个计数器,当调用

suspend
    时,如果计数器为零,则中断被挂起,识别状态被保存。无论如何,计数器都会递增。
  1. 当调用

    resume
  2. 时,计数器递减,如果它变为零,则恢复识别状态并启用中断。
  3. 其效果是,例如,如果您:

  4. 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

看到启用/禁用

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

以下情况会导致微控制器复位。 挂起所有中断() 暂停所有中断()


0
投票

有人可以解释一下为什么这种实现会导致微控制器的软件重置吗?

© www.soinside.com 2019 - 2024. All rights reserved.