Forum: Mikrocontroller und Digitale Elektronik Frage über IRQ unter C


von Charlotte C. (cradle)


Lesenswert?

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?

von johnny.m (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.