Estou com um problema ao escrever manipuladores de interrupção no compilador Keil ARM para LPC1114. Quando escrevo um programa em C ++ e especifico a opção do compilador --cpp, todo o código dos manipuladores de interrupção desaparece, sendo substituído por um loop infinito. Eu escrevi um programa simples que ilustra meu problema.
#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();
}
Ao tentar compilar esse código com a opção de compilador --cpp, recebo um loop infinito no desastre:
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Este é o local onde o __NOP () do programa acima deve estar. E está lá quando estou compilando código com a opção de compilador --c99 ou sem opções adicionais. A versão Keil MDK é 4.12. Alguém pode me dizer que existe alguma solução ou solução alternativa?
c++
interrupts
keil
x4mer
fonte
fonte
volatile
nela.Respostas:
A referência "fraca" significa apenas que a rotina será substituída por uma rotina no seu código de mesmo nome. Ao usar C, isso é simples, os nomes sempre serão idênticos, mas o nome C ++ gerencia as funções (para sobrecarga de função, etc.), portanto o nome compilado provavelmente não corresponderá ao nome ISR padrão. Você precisa agrupar a função (ou pelo menos uma referência direta, não tenho certeza dos detalhes que geralmente trabalho em C) em um wrapper externo "C" para forçar o compilador a não alterar o nome.
fonte