Чтение регистров процессора на STM32

Как я могу прочитать регистр процессора на STM32F4?

Отображены ли эти регистры где-нибудь в памяти?

Если нет, не могли бы вы предоставить простой ассемблерный код для чтения регистра (например, LR) в локальную переменную?

Спасибо.


person barak manos    schedule 23.08.2013    source источник


Ответы (3)


В инструментальной цепочке Keil я использовал такой подход:

register int R0 __asm("r0");

где 'R0' теперь распознается компилятором как переменная.

Найдите "Именованные регистровые переменные", например :

http://www.keil.com/support/man/docs/armcc/armcc_chr1359125006491.htm

person francek    schedule 27.12.2013

Во-первых, если вы просто пытаетесь заглянуть в выполнение программы, вам следует просто загрузить версию IAR Embedded Workbench для ARM (IAR EWARM) с ограниченным размером (без даты окончания пробной версии).

  • Вы можете создать новый проект, перетащить в него свой код и даже запустить его в симуляторе (например, выберите «Симулятор» в Project-> Options-> Debugger). Затем вы можете профилировать все нужные регистры.

Но если вы действительно хотите сделать это в коде ... ну, это зависит от того, какие регистры вы хотите читать, что вы хотите с ними делать и для чего компилятор решает их использовать.

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

Ваши локальные переменные обычно хранятся в GPR, поэтому чтение значения локальной переменной (в коде c) по существу выполняет чтение регистра в этом случае.

Чтение специальных регистров, таких как LR, вероятно, потребует сборки. Например, вы можете написать функцию чистой сборки, которая возвращает LR вызывающей функции, а затем вызывать эту функцию из c-кода.

Например, из main можно выполнить x = lr_return_func();, где lr_return_func() - это функция чистой сборки, которая копирует LR, используемую в main (хранится в стеке над параметрами функции), в регистр R0 (используется для возвращаемых значений). Когда lr_return_func вернется, этот LR будет сохранен в x (например, некоторый регистр вернется в основной).

Вы можете сделать это в режиме in-line, но вам нужно определить, какой регистр ваша локальная переменная использует в первую очередь. Итак, если вы определите, что x хранится, например, в R4, тогда ваша встроенная сборка захочет скопировать LR в R4, и все будет готово ... по существу, сохраняя ваш LR в x.

person bunkerdive    schedule 10.09.2013
comment
Привет? Есть кто-нибудь там? Просто кивни, если ты меня слышишь - person bunkerdive; 23.09.2013
comment
Спасибо и извините за задержку с ответом. Усилия очень ценятся. Пример кодирования был бы отличным. Кстати, там есть кто-нибудь внутри (а не снаружи). - person barak manos; 02.02.2014

Для Eclipse доступен хороший инструмент под названием EmbSys Registers. Это действительно удобно, хотя иногда и тормозит

person Egor    schedule 06.11.2013
comment
Я думаю, что это должен быть комментарий, а не ответ, но, учитывая, что у вас в настоящее время недостаточно репутации для комментариев, я думаю, что это нормально. - person Uli Köhler; 10.09.2015