![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() ![]()
Ich möchte dieses Kapitel nur kurz anschneiden da uns dazu noch einige Grundlagen der Systemprogrammierung fehlen. Nehmen wir mal an sie sollen einen Roboter zur Fließbandproduktion programmieren. Machen wir es mal ganz einfach. Der Roboter soll ein Produkt von A nach B. Hier die einzelnen Arbeitsabläufe....
Das ganze soll natürlich auch überprüft werden und bei Fehler ein sogenannter Fehlercode ausgegeben werden. Also benötigen wir noch eine Anzeige. Wir gehen einfach mal davon aus das unser Roboter mit unserem PC schon verbunden ist. Also benötigen wir eine Struktur für unseren Roboter......
Nun benötigt unser Roboter hier 48 Bits also 6 Bytes. Nun wenn sie noch mehrere Roboter so steuern müssen ist das ein rechte Platzverschwendung und meist haben sie nicht unbegrenzt
Speicherplatz bei sogenannten Embeeded Systems. Bei unseren Sensoren und bei dem Schalter benötigen wir eigentlich nur 2 Schaltstellung. 1 für betätigt oder ein und 0 für unbetätigt bzw. aus. Nun gibt es in C die Möglichkeit auch einzelne Bits anzusprechen. Hier unsere Struktur dazu....
Nun benötigt unsere Struktur nur noch sage und schreibe 8 Bits also 1 Byte. Der Trick ist eigentlich ganz einfach wir benutzen hier das Schlüsselwort unsigned das intern im Prozessor auf 0 gesetzt ist falls mit + und - arbeiten. Also signed. Oder das Bit ist auf 1 gesetzt falls sie mit unsigned Arbeiten also ohne Vorzeichen. Aber das ist jetzt in dem Kapitel nicht so wichtig. Es geht lediglich darum das unsigned 1 Bit benötigt und 1 Bit eben nur 1 oder 0 als Wert erhalten kann. Unsere Variable Ausgabe erhält
dagegen 4 Bits womit wir eine Zahl bis 16 darstellen können(2*2*2*2). Hier nun das Beispiel dazu....
Durch das 4-Byte-Alignment (Linux) benötigt in diesem Beispiel die Struktur
robo auch 4-Bytes-Speicher, obwohl drei davon nicht verwendet werden.
Auch hier können sie den Speicherplatz auf 1 Byte Größe mit dem
Keyword attribute zusammenpacken.......
...und voiala, unser Roboter1 benötigt wirklich nur noch 1 Byte.
Hier das ganze nochmals Bildlich....... ![]()
Das dämlich an diesem Beispiel ist eigentlich das es gar nichts taugt da wir ja keine Verbindung mit einem Roboter haben. Die Zeilen z.B. wie .....
...müssen wir alle von selber eingeben. Diese eben sind mit der Schnittstelle von Rechner und Roboter verbunden und müssen normalerweise nicht von Hand eingegeben werden.
Dies Programm läuft leider nur unter Dos bzw. MSWin-Systemen und nicht unter Linux. Die Adresse 0x378 stellt die Adresse des Portes LPT1 dar. Der Statusregister den wir hier überprüfen sieht intern folgendermaßen aus.....
Hier sehen sie nichts anderes wie unsere Struktur die wir oben definiert haben. Die Bits 0-2 werden nicht verwendet. Die Bits 3-7 geben uns anschließend den Status des Druckers zurück je nachdem welche Bits gesetzt sind oder welche nicht. Unsere Funktion druckerstatus() liefert uns dann denn Status zurück. Das Programm selber braucht sie jetzt momentan nicht zu interessieren. Ich komme später beim Systemprogrammieren darauf zurück. Wichtig ist hier nur das sie den Sinn und Zweck von Bit-Feldern verstanden haben. Neu ist bei diesem Programm.....
Hiermit definieren wir 3 Bits ohne einen Namen. In unserem Fall sind es die ersten 3 Bits die wie sie in der Tabelle sehen können nicht verwendet werden. Folglich können sie mit diesen auch nichts (falsch) machen bzw. darauf zugreifen. Man sagt dazu auch anonyme Bitfelder. ![]() ![]() ![]() |