Forum: Mikrocontroller und Digitale Elektronik Fragen zur Syntax


von Sebastian (Gast)


Lesenswert?

#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

von Andy (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.