#ifndef _ASSEMBLY_ typedef volatile unsigned int AT91_REG;// Hardware register definition #define AT91_CAST(a) (a) #else #define AT91_CAST(a) #endif Dies steht in meiner Datei AT91SAM9263.h In dieser Datei werden Strukturen erzeugt. z.B folgende: #ifndef _ASSEMBLY_ typedef struct _AT91S_AIC { AT91_REG AIC_SMR[32]; // Source Mode Register AT91_REG AIC_SVR[32]; // Source Vector Register AT91_REG AIC_IVR; // IRQ Vector Register AT91_REG AIC_FVR; // FIQ Vector Register AT91_REG AIC_ISR; // Interrupt Status Register AT91_REG AIC_IPR; // Interrupt Pending Register AT91_REG AIC_IMR; // Interrupt Mask Register AT91_REG AIC_CISR; // Core Interrupt Status Register AT91_REG Reserved0[2]; // AT91_REG AIC_IECR; // Interrupt Enable Command Register AT91_REG AIC_IDCR; // Interrupt Disable Command Register AT91_REG AIC_ICCR; // Interrupt Clear Command Register AT91_REG AIC_ISCR; // Interrupt Set Command Register AT91_REG AIC_EOICR; // End of Interrupt Command Register AT91_REG AIC_SPU; // Spurious Vector Register AT91_REG AIC_DCR; // Debug Control Register (Protect) AT91_REG Reserved1[1]; // AT91_REG AIC_FFER; // Fast Forcing Enable Register AT91_REG AIC_FFDR; // Fast Forcing Disable Register AT91_REG AIC_FFSR; // Fast Forcing Status Register } AT91S_AIC, *AT91PS_AIC; #else #define AIC_SMR (AT91_CAST(AT91_REG *) 0x00000000) // (AIC_SMR) Source Mode Register #define AIC_SVR (AT91_CAST(AT91_REG *) 0x00000080) // (AIC_SVR) Source Vector Register #define AIC_IVR (AT91_CAST(AT91_REG *) 0x00000100) // (AIC_IVR) IRQ Vector Register #define AIC_FVR (AT91_CAST(AT91_REG *) 0x00000104) // (AIC_FVR) FIQ Vector Register #define AIC_ISR (AT91_CAST(AT91_REG *) 0x00000108) // (AIC_ISR) Interrupt Status Register #define AIC_IPR (AT91_CAST(AT91_REG *) 0x0000010C) // (AIC_IPR) Interrupt Pending Register #define AIC_IMR (AT91_CAST(AT91_REG *) 0x00000110) // (AIC_IMR) Interrupt Mask Register #define AIC_CISR (AT91_CAST(AT91_REG *) 0x00000114) // (AIC_CISR) Core Interrupt Status Register #define AIC_IECR (AT91_CAST(AT91_REG *) 0x00000120) // (AIC_IECR) Interrupt Enable Command Register #define AIC_IDCR (AT91_CAST(AT91_REG *) 0x00000124) // (AIC_IDCR) Interrupt Disable Command Register #define AIC_ICCR (AT91_CAST(AT91_REG *) 0x00000128) // (AIC_ICCR) Interrupt Clear Command Register #define AIC_ISCR (AT91_CAST(AT91_REG *) 0x0000012C) // (AIC_ISCR) Interrupt Set Command Register #define AIC_EOICR (AT91_CAST(AT91_REG *) 0x00000130) // (AIC_EOICR) End of Interrupt Command Register #define AIC_SPU (AT91_CAST(AT91_REG *) 0x00000134) // (AIC_SPU) Spurious Vector Register #define AIC_DCR (AT91_CAST(AT91_REG *) 0x00000138) // (AIC_DCR) Debug Control Register (Protect) #define AIC_FFER (AT91_CAST(AT91_REG *) 0x00000140) // (AIC_FFER) Fast Forcing Enable Register #define AIC_FFDR (AT91_CAST(AT91_REG *) 0x00000144) // (AIC_FFDR) Fast Forcing Disable Register #define AIC_FFSR (AT91_CAST(AT91_REG *) 0x00000148) // (AIC_FFSR) Fast Forcing Status Register weiter unten steht folgendes: #define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address Und genau damit bin ich überfordert. Was ich verstanden habe ist folgendes: Ganz oben wird ein Typdef definiert. typedef volatile unsigned int AT91_REG;// Hardware register definition Dies ist auch nicht das Problem. Danach wird ein Typdef von einer Struktur erzeugt. Am Ende der Struktur wird eine Variable und eine Pointer auf die Struktur erzeugt. Am Ende kommt dann wieder etwas was ich nicht verstehe. Ganz oben unter dem Typdef fängt es schon an Was bedeutet der nachfoldene Befehl? #define AT91_CAST(a) (a) #else #define AT91_CAST(a) Dies wird anschließend ja folgendermaßen verwendet: #define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address Grüsse Sebastian
Hallo Sebastian, also, wenn du solche Fragen stellst, dann solltest du dir ernsthaft überlegen, ob du den Anfang mit einem ARM9 machst oder doch lieber auf einen AVR umsteigst. Aber zurück zu deinen Fragen: - #ifndef _ASSEMBLY_ typedef volatile unsigned int AT91_REG;// Hardware register definition #define AT91_CAST(a) (a) #else #define AT91_CAST(a) #endif Soll heißen, falls du _ASSEMBLY_ definiert hast mit "#define __ASSEMBLY__", dann wird "#define AT91_CAST(a)" genommen, ansonsten "#define AT91_CAST(a) (a)". - in der Zeile "#define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC)0xFFFFF000)" wird auf AT91PS_AIC gecastet (natürlich abhängig von _ASSEMBLY_). Was hier noch fehlt und in deiner Application auftauchen muss ist der Bezug zwischen der Basisadresse und der dazugehörigen Struktur. Das sollte dann in dieser Form auftauchen: AT91PS_AIC pAic = AT91C_BASE_AIC; damit hast du halt einen Zeiger, mit dem du auf die einzelne Elemente in der Struktur zugreifen kannst. Ich hatte vor einiger Zeit dasselbe Problem mit dem Olimex-Board SAM7-P64. Ich habe mir dann einfach Zeit genommen und das Header-File so umgebaut, dass ich was damit anfangen konnte. Ich persönlich kann mit so einem "Pointer-Geilen"-Headerfile nix anfangen. Andy
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.