2012-03-25 2 views
5

Этот вопрос будет коротким и сладким.Возможно ли прерывание ARM в середине инструкции?

Я знаю, что инструкция может возникать между инструкциями, но может ли прерывание произойти во время инструкция? Может ли прерывание нагрузки несколькими инструкциями прерываться до того, как будет загружено все значения в регистры?

mov r0, r1 
       < interrupt can happen here 
ldm r0, {r1-r4} < can an interrupt happen **during** a load multiple instruction? 

ответ

6

Нагрузка нескольких инструкций явно не является атомарной. См. Раздел A3.5.3 справочного руководства по архитектуре ARM V7C.

LDM, LDC, LDC2, LDRD, СТМ, НТК, STC2, StrD, PUSH, POP, инструкции РСЕ, SRS, VLDM, VLDR, VSTM и встр выполнены в виде последовательности выровнено по границе слова доступ к словарю. Каждому доступ к 32-битовому словарю гарантируется атомарным экземпляром. Архитектура не требует подпоследовательностей двух или более слов доступа из последовательности, которая должна быть одной копией атомарной.

Если вы прочитали, вы узнаете, что инструкции LDM/STM могут быть прерваны прерыванием (и перезапущены с начала при возврате прерывания). Инструкции LDM и STM всегда могут прерываться прерыванием данных, поэтому они не являются атомарными в этом смысле. В противном случае архитектура ARMv7-A сделает все возможное, чтобы помочь вам. Для прерываний их можно только прервать, если включена низкая латентность прерывания, и к нормальной памяти обращаются. Поэтому, по крайней мере, вы не будете получать повторный доступ к памяти устройства. Однако вы не хотите делать ничего, что ожидает атомарного чтения/записи нормальной памяти.

В режиме V7-M, LDM и STM могут быть прерваны в любое время (см. Раздел B1.5.10 Справочного руководства по архитектуре ARMv7-M). Реализация определяется, перезапускается ли инструкция с начала списка загрузок/хранилищ или перезапускается ли она с того места, где она была остановлена. Как ARM говорит:

Архитектура ARMv7-M поддерживает продолжение или перезапуск с начала, оставленная LDM или STM инструкции, как описано ниже. Если LDM или STM заброшены и перезапущены (биты ICI не поддерживаются ), инструкции не должны использоваться с энергозависимой памятью.

Другими словами, не полагайтесь на то, что LDM или STM являются атомарными, если вы пытаетесь написать переносимый код.

+0

Также, на v5 (возможно, на всех> = v4?), Это реализация определила, будет ли инструкция с записью базового регистра иметь базовый регистр, уже обновленный при прерывании данных. – ninjalj

Смежные вопросы