Hallo,
früher habe ich nur die Erfahrung mit Assembler. Jetzt muss ich mit C
anfangen. Ich habe eine Frage über Interrupt. Also wie kann der
Compiler wissen, mein Unterprogramm IRQ_Service_Routine ist nicht ein
normales Unterprogramm sondern ein Interrupt? Der Prozessor ist ARM7.
Ich habe ein Beispielprogramm in Internet gefunden, aber es geht nicht.
Das Programm ist wie folgendes:
#include<ADuC7020.h>
void My_IRQ_Function();
int i = 0, dat[9];
int main()
{
GP1CON = 0x22; // I2C on P1.0 and P1.1
IRQ = My_IRQ_Function; // Specify Interrupt Service Rountine
IRQEN = 0x200; // I2C0 Slave Interupt
I2C0CFG = 0x1; // Slave Enable
I2C0ID0 = 0xA0; // Slave ID
I2C0STX = 0x77;
while (1)
{
};
return 0;
}
/*************************************************/
/************ IRQ Service Routine *************/
/*************************************************/
void My_IRQ_Function()
{
...
}
Der Fehler ist: I2C.axf: Error: L6218E: Undefined symbol IRQ (referred
from i2c_slave.o).
IRQ = My_IRQ_Function; -> My_IRQ_Function(); dann kein Fehler, aber es
gibt keinen Unterschied zwischen IRQ und normales Programm.
Wie kann ich ein richtiges Interrupt einstellen?
Gast
#356967
Da müsstest Du in der Dokumentation des Compilers bzw. der Lib nachsehen, welche Makros bzw. Schlüsselwörter dafür vorgesehen sind. Bei den AVRs geht das (mittlerweile) mit ISR(Vektorname_vect){}. Andere Compiler handhaben das anders und lassen ISRs aussehen, wie normale Funktionen (z.B. interrupt [vektor_nr] void isr_XXXX(void) oder so ähnlich). Ist von Compiler zu Compiler unterschiedlich, da nicht im ANSI-Standard festgelegt.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.