переключение между состоянием ARM / THUMB - PullRequest
4 голосов
/ 12 октября 2009

Почему контроллер ARM должен возвращаться в состояние ARM из состояния THUMB, когда возникает исключение?

Ответы [ 4 ]

6 голосов
/ 12 октября 2009

Одним из объяснений может быть то, что режим ARM является «родным» режимом работы ЦП, и что в этом режиме можно выполнять больше операций, чем в режиме ограниченного Thumb. Режим Thumb, насколько я понял, оптимизирован для размера кода, что может означать, что в нем отсутствуют определенные инструкции, которые, возможно, необходимы при обработке исключений.

На этой странице упоминается, что обработка исключений всегда выполняется в режиме ARM. Это не дает никаких причин, поэтому, может быть, это просто так, как задумано. Тем не менее, в нем говорится о способах выхода из обработки исключений обратно в надлежащий режим (ARM или Thumb), поэтому, если вы сами не пишете обработчик исключений, вы можете игнорировать эту проблему. Это, конечно, предполагает, что ваша система настроена с обработчиком исключений «по умолчанию», который сохраняет режим выполнения.

С другой стороны, эта страница говорит об этих векторах прерываний реализации Cortex-M3 ARM:

LSB каждого вектора исключения указывает, является ли исключение исполняться в состоянии большого пальца.

Так что, похоже, это не универсально, возможно, вы можете заставить ваше конкретное исключение работать в режиме большого пальца.

2 голосов
/ 12 октября 2009

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

Cortex-m3 переопределил таблицу векторов прерываний, чтобы она была более традиционной (адрес вместо инструкции). По необходимости, я бы предположил, что cortex-m3 является процессором только для большого пальца (2), поэтому либо они переопределяют векторную таблицу для хранения инструкций большого пальца, либо они переопределяют таблицу с адресами, либо у них достаточно ядра ядра обработать загрузку или переход, которые вы обычно видите в записи таблицы векторов.

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

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

1 голос
/ 20 января 2010

Это зависит от того, какой у вас процессор, так как есть два набора команд большого пальца. В оригинальном наборе команд большого пальца (используемом в armv4t, armv5te) отсутствовали инструкции, позволяющие справляться с прерываниями; более новый набор thumb2 (в серии cortex) содержит дополнительные инструкции, поэтому вы можете оставаться в режиме thumb2 для обслуживания процедуры прерывания.

0 голосов
/ 28 мая 2015

Традиционные системы ARM загружаются в режиме ARM и перезагружаются для сброса вектора исключений после сброса. Это означает, что все векторы исключений должны быть записаны в сборке ARM. Если ваши исключения являются инструкциями ARM, то, естественно, CPU вынужден изменить свой режим на режим ARM перед обработкой исключений; если этого не произойдет, это приведет к неопределенному исключению, которое вызовет другое, и так далее, и так далее в бесконечном цикле.

В первоначальных системах ARM были только инструкции ARM, позднее были добавлены инструкции THUMB; это может быть другое объяснение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...