/
Forside
/
Teknologi
/
Udvikling
/
C/C++
/
Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn
*
Kodeord
*
Husk mig
Brugerservice
Kom godt i gang
Bliv medlem
Seneste indlæg
Find en bruger
Stil et spørgsmål
Skriv et tip
Fortæl en ven
Pointsystemet
Kontakt Kandu.dk
Emnevisning
Kategorier
Alfabetisk
Karriere
Interesser
Teknologi
Reklame
Top 10 brugere
C/C++
#
Navn
Point
1
BertelBra..
2425
2
pmbruun
695
3
Master_of..
501
4
jdjespers..
500
5
kyllekylle
500
6
Bech_bb
500
7
scootergr..
300
8
gibson
300
9
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
Alle emner
Teknologi
Udvikling
C/C++
Indstillinger
Spørgsmål
Tips
Usenet
Reklame
Statistik
Spørgsmål :
177558
Tips :
31968
Nyheder :
719565
Indlæg :
6408925
Brugere :
218888
Månedens bedste
Årets bedste
Sidste års bedste
Copyright © 2000-2024 kandu.dk. Alle rettigheder forbeholdes.