2010-06-01 21 views
4

J'ai besoin d'accéder aux registres MSP et PSP (les registres de pile principale et de process) du processeur Cortex-M3.Accéder aux registres MSP et PSP du Cortex-M3 en code C/C++ en utilisant la μVision de Keil

J'écris en C/C++. Le μVision et le compilateur associé ne vous permettent pas de faire l'assemblage en ligne pour ce seul noyau de Thumb-2 (et je ne suis pas sûr que ce soit une bonne idée de toute façon).

J'ai besoin de faire ceci afin que je puisse extraire la valeur immédiate d'une instruction svc indépendamment du fait qu'elle ait été exécutée en mode thread ou handler.

Merci,

Répondre

4

Je n'ai pas accès à un compilateur Keil au moment de vérifier, mais selon les documents que vous devriez être en mesure d'utiliser la fonction « variable de registre nommée » du compilateur:

register uint32_t msp __asm("msp"); 
register uint32_t psp __asm("psp"); 
+0

Merci, Michael. Je n'avais pas réalisé que je pouvais faire l'assemblage en ligne. Le compilateur refuse de faire un bloc en ligne parce que, apparemment, il nécessite des instructions en mode Arm et le Cortex-M3 ne fait que Thumb-2. –

+0

Une limitation de Keil, bien sûr. GCC permet l'assemblage en ligne sur Cortex-M3. –

1

Pour quelque chose comme cela, je l'habitude d'utiliser un appel-out de montage minuscule pour le faire.

Vous pouvez utiliser l'instruction d'accès au registre spécial (MRS/MSR) pour accéder à SP. Je pense qu'avec uVision, le MSP est SP_main, et la PSP est SP_process.

Mon assemblage ARM est un peu rouillé, mais je pense que ce serait quelque chose comme:

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

De votre question, il semble que vous comprenez déjà la distinction entre le MSP & PSP, et de savoir comment pour déterminer lequel lire (via le LR).