/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
hardware registre...
Fra : holst


Dato : 17-06-02 22:00

Hej NG...

Jeg sidder og kigger på noget hardwarenært c-kode, og kan ikke rigtig finde
ud af hvorfor følgende kode skrives på flg. måde:

#define SYSCFG (0x03FF0000)
#define INTMASK (SYSCFG + 0x4008)
#define EnableInt(IntSrcNum) (*(volatile unsigned *)INTMSK &= ....osv.

(I sidste linie) Hvad betyder volatile helt præcist i dette tilfælde, og
hvorfor castes den egentlig til en pointer (og så endda to gange)!

Disse to ting står noget uklart for mig...håber nogen vil hjælpe..!!

på forhånd tak
Allan



 
 
Anders Borum (18-06-2002)
Kommentar
Fra : Anders Borum


Dato : 18-06-02 09:52

"holst" <holst@nork.auc.dk> wrote in message news:aemklr$b5$1@sunsite.dk...
[klip]
> #define EnableInt(IntSrcNum) (*(volatile unsigned *)INTMSK &= ....osv.
>
> (I sidste linie) Hvad betyder volatile helt præcist i dette tilfælde, og
> hvorfor castes den egentlig til en pointer (og så endda to gange)!
>
> Disse to ting står noget uklart for mig...håber nogen vil hjælpe..!!

volatile er et hint til oversætteren om at variablen ikke opfører
sig som variabler plejer. Oversætteren kan så ikke længere antage
at variablen husker den værdi du skriver til den eller at variablen
har samme værdi hvis den læses to gange efter hinanden.

Dette er nyttigt til hardware-registre, men bruges også hvis man vil
tilgå samme variabel fra forskellige tråde.

Umiddelbart ser det ikke ud som om der castes flere gange. Den ene
asterisk bruges til typecasting og den anden til at dereferere pointeren.
Men det kan være jeg forstår makroen forkert, da du ikke har skrevet den
helt ud.

Hvis vi nu siger den er:
#define EnableInt(IntSrcNum) (*(volatile unsigned *)INTMSK &= IntSrcNum

Så vil linien:
EnableInt(1 << 3);
slette bit 3 i interrupt-mask registret. Det er sandsynligt at en slettet
bit betyder at denne interrupt er slået til.

Tilsvarende vil DisableInt måske være:
#define DisableInt(IntSrcNum) (*(volatile unsigned *)INTMSK |= ~IntSrcNum

Hilsen Anders




Søg
Reklame
Statistik
Spørgsmål : 177496
Tips : 31968
Nyheder : 719565
Indlæg : 6408491
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste