Доступ к регистрам MSP и PSP Cortex-M3 в коде C/C++ с использованием Keil's µVision

Мне нужно получить доступ к регистрам MSP и PSP (основной регистр и регистры стека процессов) процессора Cortex-M3.

Пишу на С/С++.

µVision и связанный с ним компилятор не позволяют выполнять встроенную сборку только для этого ядра Thumb-2 (и я в любом случае не уверен, что это будет хорошей идеей).

Мне нужно сделать это, чтобы я мог извлечь непосредственное значение инструкции svc независимо от того, была ли она выполнена в режиме потока или в режиме обработчика.

Спасибо,


person Captain NedD    schedule 01.06.2010    source источник


Ответы (2)


В настоящее время у меня нет доступа к компилятору Keil, чтобы проверить это, но, согласно документам, вы должны иметь возможность использовать функцию компилятора "именованная регистровая переменная":

register uint32_t msp __asm("msp");
register uint32_t psp __asm("psp");
person Michael Burr    schedule 01.06.2010
comment
Спасибо, Майкл. Я не понимал, что могу делать встроенную сборку. Компилятор отказывается выполнять блочную встроенную сборку, потому что для этого, по-видимому, требуются инструкции режима Arm, а Cortex-M3 выполняет только Thumb-2. - person Captain NedD; 02.06.2010
comment
Ограничение Keil, конечно. GCC позволяет встроенную сборку на Cortex-M3. - person David Grayson; 20.06.2010

Для чего-то подобного я обычно использую крошечный вызов сборки.

Вы можете использовать инструкцию доступа к специальному регистру (MRS/MSR) для доступа к SP. Я думаю, что в uVision MSP – это SP_main, а PSP – SP_process.

Моя сборка ARM немного заржавела, но я думаю, что это будет что-то вроде:

MRS   R0, SP_process   // R0 holds retval
BX    LR                // return

Судя по вашему вопросу, вы уже понимаете разницу между MSP и PSP и знаете, как определить, какой из них читать (через LR).

person Dan    schedule 01.06.2010