Как я могу прочитать регистр процессора на STM32F4?
Отображены ли эти регистры где-нибудь в памяти?
Если нет, не могли бы вы предоставить простой ассемблерный код для чтения регистра (например, LR) в локальную переменную?
Спасибо.
Как я могу прочитать регистр процессора на STM32F4?
Отображены ли эти регистры где-нибудь в памяти?
Если нет, не могли бы вы предоставить простой ассемблерный код для чтения регистра (например, LR) в локальную переменную?
Спасибо.
В инструментальной цепочке Keil я использовал такой подход:
register int R0 __asm("r0");
где 'R0' теперь распознается компилятором как переменная.
Найдите "Именованные регистровые переменные", например :
http://www.keil.com/support/man/docs/armcc/armcc_chr1359125006491.htm
Во-первых, если вы просто пытаетесь заглянуть в выполнение программы, вам следует просто загрузить версию IAR Embedded Workbench для ARM (IAR EWARM) с ограниченным размером (без даты окончания пробной версии).
Но если вы действительно хотите сделать это в коде ... ну, это зависит от того, какие регистры вы хотите читать, что вы хотите с ними делать и для чего компилятор решает их использовать.
Регистры общего назначения будут использоваться, однако компилятор решит, что он хочет их использовать, поэтому вам необходимо понять базовую сборку, чтобы понять, что они представляют.
Ваши локальные переменные обычно хранятся в 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
.
Для Eclipse доступен хороший инструмент под названием EmbSys Registers. Это действительно удобно, хотя иногда и тормозит