J'ai un problème avec l'écriture des gestionnaires d'interruption dans le compilateur Keil ARM pour LPC1114. Lorsque j'écris un programme en C ++ et que je spécifie l'option du compilateur --cpp, tout le code des gestionnaires d'interruption disparaît, il est remplacé par une boucle infinie. J'ai écrit un programme simple qui illustre mon problème.
#include "LPC11xx.h" // LPC11xx definitions
#define SYSTICK_DELAY 120000 // for 10 ms systick @ 12MHz osc
void SysTick_Handler(void)
{
__NOP();
}
int main (void)
{
SystemInit(); // from system_LPC11xx.c
SysTick_Config(SYSTICK_DELAY); // from core_cm0.h
// Loop forever
while (1) __NOP();
}
Lorsque j'essaye de compiler ce code avec l'option de compilation --cpp, j'obtiens une boucle infinie en disasm:
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
C'est l'endroit où doit être __NOP () du programme ci-dessus. Et il est là lorsque je compile du code avec l'option de compilation --c99 ou sans options supplémentaires. La version Keil MDK est 4.12. Quelqu'un peut-il me dire s'il existe une solution ou une solution?
c++
interrupts
keil
x4mer
la source
la source
volatile
.Réponses:
La référence "faible" signifie simplement que la routine sera remplacée par une routine dans votre code du même nom. Lorsque vous utilisez C, c'est simple, les noms seront toujours identiques mais le nom C ++ modifie les fonctions (pour la surcharge de fonctions, etc.), de sorte que le nom compilé ne correspondra probablement pas au nom ISR par défaut. Vous devez encapsuler la fonction (ou au moins une référence directe, je ne suis pas sûr des détails que je travaille principalement en C) dans un wrapper "C" externe pour forcer le compilateur à ne pas modifier le nom.
la source