ich würde gerne mal verstehen was da passiert :) im datenblatt zum mega644 aus der int-vektor tabelle: Vector No: 23 Addr: $002C Source: USART0_TX Def: USART0 Tx Complete .. im datenblatt steht also welcher int (hier nummer 23) an welche adresse springt (hier 2C)?? iomxx4.h: /* USART0, Tx Complete */ #define USART0_TX_vect _VECTOR(22) #define SIG_USART_TRANS _VECTOR(22) für jeden interrupt gibt es ein define (alle zahlen sind 1 kleiner als im datenblatt, auf reset (vektor = 1) kann man nicht reagieren) sfr_defs.h: #define _VECTOR(N) _vector ## N was macht dieses define, was soll das "## N" ?? für _vector hab ich kein define gefunden, was tut das? im eigenen code: ISR(SIG_USART_TRANS){ ... } der code würde jetzt an addr $002C gesetzt und wenn der int feuert wird automatisch dahin gesprungen?
Bill wrote: > für jeden interrupt gibt es ein define > (alle zahlen sind 1 kleiner als im datenblatt, auf reset (vektor = 1) > kann man nicht reagieren) Wahrscheinlicher ist, dass eine der beiden Zählungen bei 0 beginnt, während die andere bei 1 beginnt. Ich habs jetzt aber nicht kontrolliert, ob das so ist und wer bei 1 und wer bei 0 anfängt. > #define _VECTOR(N) _vector ## N > > was macht dieses define, was soll das "## N" ?? Das ist die Präprozessor-Anweisung zwei Tokens miteinander zu verketten. Aus "__vector_" und "22" wird so "__vector_22" > für _vector hab ich kein define gefunden, was tut das? Es wird wohl dafür sorgen, dass die Startdresse der Funktion in die Vektortabelle eingetragen wird. > im eigenen code: > > ISR(SIG_USART_TRANS){ ... } > > > der code würde jetzt an addr $002C gesetzt und wenn der int feuert wird > automatisch dahin gesprungen? Fast. Der Code kommt nicht an $002C Am Anfang des Speichers steht die Interrupt Vektor Tabelle. Die kannst du dir wie eine Art INhaltsverzeichnis vorstellen. In diesem Inhaltsverzeichnis wird eingetragen, wo deine Funktion wirklich im Speicher platziert ist. Der µC kennt nur diese Vektor Tabelle. Tritt ein Interrupt auf, dann holt er sich aus dieser Tabelle die Startadresse der Funktion und sprint sie an. Der ganze ISR, _VECTOR und sonstige Klimbim dient nur dazu, den Compiler dazu zubringen, die Startdresse der Funktion an der richtigen Stelle einzutragen (und natürlich den Funktionsreturn anders zu gestalten).
Hallo Karl heinz Buchegger wrote: > Der Code kommt nicht an $002C > Am Anfang des Speichers steht die Interrupt Vektor Tabelle. Die kannst > du dir wie eine Art INhaltsverzeichnis vorstellen. In diesem > Inhaltsverzeichnis wird eingetragen, wo deine Funktion wirklich im > Speicher platziert ist. > Der µC kennt nur diese Vektor Tabelle. Tritt ein Interrupt auf, dann > holt er sich aus dieser Tabelle die Startadresse der Funktion und sprint > sie an. Der ganze ISR, _VECTOR und sonstige Klimbim dient nur dazu, den > Compiler dazu zubringen, die Startdresse der Funktion an der richtigen > Stelle einzutragen (und natürlich den Funktionsreturn anders zu > gestalten). Als kleiner Hinweis wegen der Mehrdeutigkeit: beim AVR wird mit der Abarbeitung ab Vektor-Adresse fortgesetzt. Dort steht üblicherweise ein Sprungbefehl, weil innerhalb der Tabelle nicht mehr Platz pro Vektor reserviert ist. Die "echten" Vektorlisten kenne ich noch vom 6510. ;) Gruß aus Berlin Michael
danke sehr, hab das jetzt zu meiner vollsten zufriedenheit geblickt. wenn mit langweilig ist schaue ich mir mal den asm code an... :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.