Saya memiliki masalah dengan penulisan interrupt handler di kompiler ARM Keil untuk LPC1114. Ketika saya menulis program dalam C ++ dan menentukan opsi --cpp compiler, semua kode dari interrupt handler menghilang, diganti dengan infinite loop. Saya menulis program sederhana yang menggambarkan masalah saya.
#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();
}
Ketika mencoba mengkompilasi kode ini dengan opsi --cpp compiler, saya mendapatkan infinite loop dalam disasm:
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Ini adalah tempat di mana __NOP () dari program di atas harus. Dan itu ada ketika saya mengkompilasi kode dengan opsi kompiler --c99 atau tanpa opsi tambahan. Versi Keil MDK adalah 4.12. Adakah yang bisa memberi tahu saya apakah ada solusi atau solusi?
c++
interrupts
keil
x4mer
sumber
sumber
volatile
di dalamnya.Jawaban:
Referensi "lemah" hanya berarti bahwa rutin akan diganti dengan rutin dalam kode Anda dengan nama yang sama. Ketika menggunakan C ini sederhana, nama-nama akan selalu identik tetapi nama C ++ merusak fungsi (untuk fungsi yang berlebihan dll) sehingga nama yang dikompilasi mungkin tidak akan cocok dengan nama ISR default. Anda perlu membungkus fungsi (atau setidaknya referensi maju, saya tidak yakin secara spesifik saya sebagian besar bekerja di C) dalam pembungkus "C" eksternal untuk memaksa kompiler untuk tidak memotong nama.
sumber