#operating-system #embedded #interrupt #rtos #autosar
#операционная система #встроенный #прерывание #rtos #автозапуск
Вопрос:
Я хотел бы знать разницу между DisableAllInterrupts
и SuspendAllInterrupts
в ОСЕКЕ?
Ответ №1:
Интерфейс отключения / включения не подходит для вложения. Приостановка / возобновление могут быть вложенными, так что, если функция приостанавливается и возобновляется, когда вызывающий уже приостановлен, прерывания будут включены только при самом внешнем вызове возобновления.
В документации также указано, что suspend сохраняет «статус распознавания». Мне непонятно, что это значит; Я просмотрел весь документ, и нигде он четко не определяет этот термин. Я предполагаю, что все прерывания, которые были распознаны ранее, восстанавливаются после вызова. Это (я полагаю) означало бы, что если вы включили новое прерывание во время приостановки, возобновление может отключить его. С другой стороны, включение нового прерывания в отключенном разделе будет сохраняться после включения. Это менее чем понятно, однако 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
Если вы пишете критический раздел в функции, которая может быть вызвана из какой-либо другой функции, вам следует использовать suspend / resume . Если вы используете отключить / включить в приведенном выше сценарии, это приведет к преждевременному прерыванию:
Interrupts
--------------------------------
Enabled
disable() ; Disabled
enable() ; Enabled
enable() ; Enabled
disable() ; Disabled
disable() ; Disabled
enable() ; Enabled
enable() ; Enabled
enable() ; Enabled
См. В разделе включение / отключение вложенности, не имеет никакого эффекта. Вы должны использовать вложение, если вы вызываете функции из критической секции, когда такие функции могут также иметь критические секции внутри них — чтобы гарантировать, что внешняя критическая секция не завершается преждевременно.
Комментарии:
1. что вы подразумеваете под вложенностью, вложением чего именно?
2. Я думал, что объяснил это (хотя и кратко) в ответе. Я добавил подробное объяснение. На самом деле это не вопрос того, что я имею в виду — этот термин используется в документации, поэтому вы действительно спрашиваете, что означает документация. Я не знаком конкретно с OSEK — я читаю ту же документацию, что и вы, и опираюсь на знания и опыт — документация явно не является руководством по ОСРВ и предполагает, что у вас есть эти знания. Возможно, вашему работодателю следует записаться на учебный курс?
3. Теперь я понял, большое вам спасибо,