2012-05-14 3 views
0

J'utilise Keil uVision avec compilateur gcc (Sourcery Codebenchlite pour ARM EABI) pour programmer la puce STM32F4 cortex M4.Débogueur s'arrête à l'intérieur des fonctions mathématiques qui ont des arguments à virgule flottante

Les chaînes de commande du compilateur je définis sont les suivants:

-march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -std=gnu99 -fsingle-precision-constant 

Lorsque le débogueur rencontre certaines fonctions mathématiques (par exemple asinf(), atan2f() etc), il se bloque.

J'ai vérifié que les arguments pour ces fonctions sont également à simple précision.

Je pense que c'est à cause de certaines directives de compilation manquantes pour l'utilisation de VFP point flottant, mais n'a pas pu l'identifier.

Y at-il quelque chose que j'ai raté?

Le code de démontage d'un exemple, je l'ai fait:

Le débogueur peut évaluer atan2f (0.3,0.4), mais arrête à 0x0803B9CA quand il évalue atan2f (a, b). Je ne savais pas pourquoi le nombre fonctionne mais pas de variables.

377:   float a = 0.3; 
0x0803B9BA 4B1E  LDR   r3,[pc,#120] ; @0x0803BA34 
0x0803B9BC 63BB  STR   r3,[r7,#0x38] 
    378:   float b = 0.4; 
    379: 
0x0803B9BE 4B1E  LDR   r3,[pc,#120] ; @0x0803BA38 
0x0803B9C0 637B  STR   r3,[r7,#0x34] 
    380:   float c = atan2f(0.3,0.4); 
0x0803B9C2 4B1E  LDR   r3,[pc,#120] ; @0x0803BA3C 
0x0803B9C4 633B  STR   r3,[r7,#0x30] 
    381:   float d = atan2f(a,b); 
    382:   
0x0803B9C6 6BB8  LDR   r0,[r7,#0x38] 
0x0803B9C8 6B79  LDR   r1,[r7,#0x34] 
0x0803B9CA F004F993 BL.W   atan2f (0x0803FCF4) 
0x0803B9CE 62F8  STR   r0,[r7,#0x2C] 
+0

Vous avez "un problème", mais vous ne dites pas ce que c'est? – ams

+0

Edité la question. Désolé pour la question floue car je suis un débutant. – soonhooi

+0

pouvez-vous fournir un démontage de la zone à problème? –

Répondre

1

Sur le STM32F4 vous devez d'abord activer la FPU - sinon la CPU va sauter dans le HardFault_Handler ou BusFault_Handler (je ne suis pas shure que l'on).

Vous pouvez le faire en C/C++ n'importe où avant d'utiliser les instructions à virgule flottante (peut-être au début de main()?). En supposant que vous utilisez la bibliothèque CMSIS et ont le core_m4.h inclus (peut-être par stm32f4xx.h):

void cortexm4f_enable_fpu() { 
    /* set CP10 and CP11 Full Access */ 
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); 
} 

L'alternative est le code assembleur dans le fichier de démarrage:

/*enable fpu begin*/ 
ldr  r0, =0xe000ed88   /*; enable cp10,cp11 */ 
ldr  r1,[r0] 
ldr  r2, =0xf00000 
orr  r1,r1,r2 
str  r1,[r0] 
/*enable fpu end*/ 

(je trouve le code quelque part sur internet, je ne sais pas où, je l'ai utilisé moi-même, ça marche).

Peut-être que votre problème se trouve là?

Questions connexes