Я вижу следующие строки в порту Cortex-M FreeRTOS при использовании функциональности без галочки в режиме ожидания, основанной на инструкции WFI

__asm volatile( "dsb" );
__asm volatile( "wfi" );
__asm volatile( "isb" );

См. https: / /github.com/cjlano/freertos/blob/V9.0.0/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c#L530

Я вижу, что в документе ARM Cortex-M Руководство по программированию инструкций по ограничению памяти: «DSB должен использоваться, чтобы гарантировать, что нет никаких незавершенных транзакций памяти до выполнения инструкций WFI или WFE».

Но мне любопытно, зачем здесь нужен ISB? Возможно, это гарантирует, что прерывание, которое разбудило микросхему от WFI, будет выполнено непосредственно перед дальнейшими инструкциями, которые могут находиться в конвейере? Это мое лучшее предположение, но я хотел бы услышать любые другие мысли или подтверждения.

3
satur9nine 30 Окт 2017 в 22:00

3 ответа

Лучший ответ

Я полагаю, что намерение ISB состоит в том, чтобы гарантировать, что инструкция wfi выполняется «по порядку», и никакие инструкции после нее не выполняются, пока не проснется. Тем не менее, я не думаю, что это требуется в соответствии с документацией ARM. Я подозреваю, что это пояс и подтяжки.

1
Realtime Rik 1 Ноя 2017 в 09:53

ISB добавляется после WFI, потому что программист хочет убедиться, что WFI должен выполняться перед любой инструкцией, следующей за WFI. ARM также имеет ядра класса A, которые поддерживают выполнение вне заказа. Если мы запустим приведенный выше код, удалив ISB из вышедших из строя ядер, то инструкция, следующая за WFI, может выполняться перед WFI.

0
RAVI KANT VERMA 24 Янв 2020 в 20:40

Инструкция ISB очищает конвейер и гарантирует, что все предыдущие инструкции выполнены перед выполнением новых инструкций.

Из руководства ARM Cortex-M3.

Инструкции DSB и ISB могут быть важны для самоизменяющегося кода. Например, если программа изменяет свой собственный программный код, следующая исполняемая инструкция должна основываться на обновленной программе. Однако, поскольку процессор конвейеризован, измененное местоположение команды уже может быть получено. Использование DSB и затем ISB может гарантировать, что измененный программный код будет выбран снова. Архитектурно инструкция ISB должна использоваться после обновления значения регистра CONTROL. В процессоре Cortex-M3 это строго не требуется. Но если вы хотите убедиться, что ваше приложение переносимо, вы должны убедиться, что инструкция ISB используется после обновления до регистра CONTROL.

-1
Martin 31 Окт 2017 в 13:40