if ( ! (regdata & DMA_DONE)
-
Guten Abend,
kann mir jemand erklären was man unter : if ( ! (regdata & DMA_DONE))
verstehen kann .
regdata ist ein short variable, die den Inhalt eines 16-bit register enthält
und DMA_DONE ist der erste bit dieses Registers ( bit 0).
bin leider noch Anfänger
MFG
-
Hi
Ich hoffe mal du weißt was if bedeutet und was der "!" Operator ist...
"&" ist ein Bit-Operator. Siehe --> http://www.pronix.de/pronix-676.htmlWie sich das dann genau verhält lass ich dich jetzt damit mal alleine überlegen
-
hi danke schöne ich werde es mal gleich ausprobieren
-
myouness27 schrieb:
Guten Abend,
kann mir jemand erklären was man unter : if ( ! (regdata & DMA_DONE))
verstehen kann .
regdata ist ein short variable, die den Inhalt eines 16-bit register enthält
und DMA_DONE ist der erste bit dieses Registers ( bit 0).
bin leider noch Anfänger
MFG... ohne viele weitere Querverweise:
Die Bit-Operatoren nutzt man u.a. bei maschinennaher Programmierung gerne, um die einzelnen Bits eines Registers abzufragen oder zu setzen, also z.B.:
if (regdata & BIT_15) ... ergibt TRUE <=> BIT_15 des Registers ist auf "1". if (regdata & BIT_0) ... ergibt TRUE <=> BIT_0 des Registers ist auf "1".
Will man prüfen, ob ein Bit auf "0" steht, dann geht das so:
if ((regdata & BIT_15) == 0) oder if (! (regdata & BIT_15))
Will man ein einzelnes Bit setzen, dann geht das so:
regdata |= BIT_8;
Will man ein einzelnes Bit löschen, d.h. auf "0" setzen, dann geht das so:
regdata &= ~BIT_5;
Zweckmäßigerweise werden die Bits entsprechend einenm HW-Manual benannt, also z.B.:
/* output bits */ #define TIMENB 0x8000 /* Bit 15: Timer Enable */ #define BRKON 0x0010 /* Bit 4: ... */ #define RTSON 0x0020 #define RCLK1 0x0002 #define RCLK0 0x0001 /* input bits */ #define TIMINT 0x8000 #define RTS 0x0020 #define CTS 0x0040
Dabei können input bzw. output Bits gleiche Bit-Positionen definieren.
Auf den ersten Blick sieht das etwas kompliziert aus, aber auf die Dauer geht das in Fleisch und Blut über...
-
vielen dank jox für die ausführliche Erklärung.
MFG
-
... und da ist mir doch noch etwas ein/aufgefallen:
Das Setzen bzw. Löschen von HW-Registern kann man auf die Art "regdata |= BIT_8;" natürlich nur, wenn die HW-Register beim Auslesen die identischen Informationen zurückgeben, denn
regdata |= BIT_8;
ist das gleiche wie
accu = regdata; accu = accu | BIT_8; regdata = help;
In der Regel werden aber beim Auslesen eines HW-Registers andere Bit-Werte zurückgeben, und bei den üblichen HW-Bausteinen kann man keine einzelnen Bits setzen, löschen oder abfragen (es sei denn über das CRU-Interface der TMS99XX-Exoten), d.h. beim Setzen bzw. Löschen muss man mit internen Kopien arbeiten, etwa in der folgenden Art:
regdata_copy |= BIT_8; regdata = regdata_copy;
oder in der Kurzform:
regdata = regdata_copy |= BIT_8;
Löschen geht dann mittels:
regdata = regdata_copy &= ~BIT_5;
Die interne Copy-Variable sollte als vergleichbarer Typ definiert werden, z.B. im Beispiel als "unsigned short", was ich dann gerne mache als:
typedef unsigned short bit16; typedef unsigned char bit8; ... bit16 regdata_copy;
Abfragen geht dann (meistens) direkt in der bereits beschriebenen Methode:
if (regdata & BIT_4) ...
, d.h. ohne Copy-Variable.
... es sei denn, mit dem Auslesen verursacht man als Nebeneffekt das Rücksetzen irgendwelcher internen Statuswerte (also eigentlich eine implizite Schreib-Operation, auch das gibt's, aber eher selten).... auch ja, man kann natürlich auch mehrere Bits auf einen Schlag setzen:
regdata = regdata_copy |= (BIT_8 | BIT_5);
oder löschen:
regdata = regdata_copy &= ~(BIT_15 | BIT_14 | BIT_0);
WICHTIG: Beim Löschen nie den Fliegendreck "~" zur Bitweisen Invertierung vergessen!
-
hallo jox,
bin noch Anfänger was embedded program. angeht arbeite im moment an einem
Projekt mit Blackfin 537 unter uClinux und habe noch kleine unsicherheiten .
Sie haben mir das ziemlich gut erklärt herzlichen dank. eine Bitte hätte ich an Sie und zwar welches Buch würden Sie mir empfehlen .MFG, myouness
-
myouness27 schrieb:
... welches Buch würden Sie mir empfehlen .
... Sorry, aber mit Buchempfehlungen kann ich leider nicht dienen.
Ich habe Informatik studiert, aber alles rund um HW-Programmierung, Assembler und Bau von HW-Systemen habe ich mir mehr oder weniger selbst angeeignet. Selbst für C hat nur das Standardwerk (C Programming Language, Kernighan and Ritchie) herhalten müssen. HW habe ich wegen hohen Performanceanforderungen bis jetzt vorzugsweise in einer eigenen Sprache (Assembler mit Kontrollstrukturen und Prozeduraufrufen sowie eigener Betriebssystemkern) programmiert.
Ich habe mir angewöhnt, überwiegend Original-Manuals (z.B. Linux-ManPages oder HW-Manuals) zu benutzen. Irgendwann beherrscht man die Notation der Manuals und kommt dann bestens damit zurecht. Allerdings, zugegeben, ist das für Einsteiger etwas zu schwierig.
Deswegen tut es mir leid, dass ich Dir leider keine Einsteigerlektüre nennen kann ... aber vielleicht kann ja da ein anderer aus dem Forum helfen?
-
hi jox , bin leider noch wach ich will in einem Monat meine DA abgeben
. ich muss gestehen ich habe progrmmieren nie gemocht na ja übung macht den Meister. eins habe ich festgestellt alle die Jahre Studium an der Uni haben mir wenig gebracht ich habe durch meine DA gemerkt, dass Theorie und Praxis 2 Welten sind. vielen danke fir die Wertvollen Tipps und alles gute.