DisableAllInterrupts ПРОТИВ SuspendAllInterrupts (OSEK VDX)

#operating-system #embedded #interrupt #rtos #autosar

#операционная система #встроенный #прерывание #rtos #автозапуск

Вопрос:

Я хотел бы знать разницу между DisableAllInterrupts и SuspendAllInterrupts в ОСЕКЕ?

Описание DisableAllInterrupts в документе OSEK

Описание SuspendAllInterrupts в документе OSEK

Ответ №1:

Интерфейс отключения / включения не подходит для вложения. Приостановка / возобновление могут быть вложенными, так что, если функция приостанавливается и возобновляется, когда вызывающий уже приостановлен, прерывания будут включены только при самом внешнем вызове возобновления.

В документации также указано, что suspend сохраняет «статус распознавания». Мне непонятно, что это значит; Я просмотрел весь документ, и нигде он четко не определяет этот термин. Я предполагаю, что все прерывания, которые были распознаны ранее, восстанавливаются после вызова. Это (я полагаю) означало бы, что если вы включили новое прерывание во время приостановки, возобновление может отключить его. С другой стороны, включение нового прерывания в отключенном разделе будет сохраняться после включения. Это менее чем понятно, однако 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
 

Если вы пишете критический раздел в функции, которая может быть вызвана из какой-либо другой функции, вам следует использовать suspend / resume . Если вы используете отключить / включить в приведенном выше сценарии, это приведет к преждевременному прерыванию:

                      Interrupts
--------------------------------                     
                     Enabled
disable() ;          Disabled
    enable() ;       Enabled
    enable() ;       Enabled
    disable() ;      Disabled
        disable() ;  Disabled
        enable() ;   Enabled
    enable() ;       Enabled
enable() ;           Enabled
 

См. В разделе включение / отключение вложенности, не имеет никакого эффекта. Вы должны использовать вложение, если вы вызываете функции из критической секции, когда такие функции могут также иметь критические секции внутри них — чтобы гарантировать, что внешняя критическая секция не завершается преждевременно.

Комментарии:

1. что вы подразумеваете под вложенностью, вложением чего именно?

2. Я думал, что объяснил это (хотя и кратко) в ответе. Я добавил подробное объяснение. На самом деле это не вопрос того, что я имею в виду — этот термин используется в документации, поэтому вы действительно спрашиваете, что означает документация. Я не знаком конкретно с OSEK — я читаю ту же документацию, что и вы, и опираюсь на знания и опыт — документация явно не является руководством по ОСРВ и предполагает, что у вас есть эти знания. Возможно, вашему работодателю следует записаться на учебный курс?

3. Теперь я понял, большое вам спасибо,