Forum: Compiler & IDEs ein Bit-Variable im GCC?


von tex (Gast)


Lesenswert?

Hi!
Eine kurze und vermutlich dämliche Frage zum GCC. Weil ich die
vielzitiere Dokumentation noch immer nicht gefunden habe und mein
C-Buch  nichts dazu hergibt würde ich gerne wissen, ob es für die µC
Programmierug in GCC eine Variablendeklaration für eine logische
Variable gibt, also etwas vergleichbares wie "boolean"?
Zweite Frage.
Gibt es zum Mitzählen der Interrups eine elegantere Methode als eine
globale Variable?

von Jörg Wunsch (Gast)


Lesenswert?

Solange es keinen 1-Bit-Prozessor gibt, wird wohl eine 1-Bit-Variable
keinen richtigen Sinn haben.  Nein, C kennt sowas nicht.  Du kannst
Bitfields benutzen und damit das Packen der Bits in ein Byte selbst
organisieren.

Wo hast du denn nach der Doku gesucht, dass du sie immer noch nicht
finden konntest?  WinAVR zumindest installiert sämtliche Doku sogar
lokal.

Was ist dir an der globalen Variable zu ,,unelegant''?  Aber
vielleicht erzählst du ja lieber mal, was du damit genau vorhast.

von Sebastian (Gast)


Lesenswert?

wegen den bit variablen.. guck im wiki mal nach bitfeldern. da hast du
das was du suchst... gleich mit beispiel

von tex (Gast)


Lesenswert?

@Jörg
Ich bekomme 15 Zeichen Seriell rein, die ich aus Platzgründen nicht in
einem Array speichere und dann aufwendig wieder auslese, sondern ich
zähle die Zeichen mit und verarbeite es an Ort und Stelle. Im Moment
läuft das Ganze mit Zeitschleifen, aber sowas ist unsauber. Jetzt
möchte ich es halt mit Interrups machen, aber ich kann ja kaum einen
Zähler in der Interruptroutine laufen lassen.

von peter dannegger (Gast)


Lesenswert?

Serielle Interfaces (I2C, SPI, UART) liefern doch schon komplette
Bytes.

Willst Du aber ein Interface in Software nachbilden, dann schau Dir mal
die Schiebeoperatoren an.

Z.B. Einschieben MSB first:

in_byte += in_byte;
if( input_port & 1<<input_pin )
  in_byte++;




Peter

von A.K. (Gast)


Lesenswert?

@Jörg: Es gab mal einen 1-Bit Prozessor. MC14500B. Ziemlich skurriles
Teil.

von tex (Gast)


Lesenswert?

@Jörg
betr. Bier-Lizenz
Wohin soll ich das Bier schicken?
betr. Globale Variable
Wenn ich eine Variable nur in einer Subroutine nutze, definiere ich sie
nicht gerne global, weil sie dann immer im RAM rumliegt und Speicher
frisst. Ist ne alte Manie aus 8051 Tagen als Speicher Luxus war.



@ Peter
??? Nein nein! Ich bekomme aus der UART schon ganze Bytes. Ich muss nur
wissen das wievielte Byte reingekommen ist.

von Jörg Wunsch (Gast)


Lesenswert?

Das Bier kannst du mit mir trinken, wenn du mal in Dresden bist, oder
wenn ich in deiner Gegend bin (dann musst du aber noch erzählen, wo du
wohnst...).

Dann brauchst du eigentlich auch gar keine globale Variable, sondern
nur eine statische, aber eine andere Lösung dafür fällt mir auch nicht
ein.

Das mit dem MC14500B ist natürlich wirklich hübsch. ;-)  Bislang
kannte
ich Prozessoren mit weniger als 4 bits Verarbeitungsbreite nur als
Bit-Slice-Prozessoren, aus denen hat man dann aber vollständige CPUs
mit größerer Breite geschachtelt.

von Rufus T. Firefly (Gast)


Lesenswert?

Was aber hat das Zählen von in einer Interrupt-Routine empfangenen Bytes
mit einer Bit-Variablen zu tun?

von peter dannegger (Gast)


Lesenswert?

@Rufus,

ich bin auch drauf reingefallen.

Man wählt einen Titel und stellt aber eine völlig andere Frage, fertig
ist das Chaos.

Hoffentlich merkt sich Tex das:

Ein Thread - eine Frage !!!



Peter

von Fritz Ganter (Gast)


Lesenswert?

Jörg schrieb:

>Dann brauchst du eigentlich auch gar keine globale Variable,
sondern
>nur eine statische, aber eine andere Lösung dafür fällt mir auch
nicht
>ein.

Ich habs mir auch schon überlegt ob ich ihn so verarschen soll :-)

@tex:
Eine statische Variable gilt nur in der Funktion, aber belegt trotzdem
globalen Speicherplatz, liegt also auch sinnlos herum.

@Jörg:
Wennst nach Hamburg kommst, kriegst von mir auch ein Bier. Oder zwei...

von Sven Bohner (Gast)


Lesenswert?

sallü...

zum thema bitvariable, falls es noch aktuell sein sollte....

die einfachste variante sind bitfelder. diese müssten eigentlich auch
in deinem c-buch stehen (sofern es ein gutes ist).

dazu behilft man sich einer struktur(struct)...

struct [IrgendeinBezeichner]{
    int  [BitName1]    :1;
    int  [BitName2]    :1;
    int  [BitName3]    :1;
...
}[IrgendeinNameZurInstazierung];

wichtig...:
es werden NICHT drei Integer reserviert, sondern nur einer...
die ziffer hinter dem doppelpunkt gibt an, wieviele Bits des Integer
der Variablen davor zugewiesen werden sollen... (da du bits brauchst ->
1)
d.h: speicherbedarf für 1 - 16 Bits = ein Interger...
solltest du eine siebzehnte bitvariable benötigen, so wird ein weiterer
Integer angebrochen...
somit musst du für 17 - 32 Bits mit einem Speicherbedarf von zwei
Intergern rechnen...

schlaue köpfe sagen sich nun, ich baue die struktur mit "unsigned
char" auf, da man vielleicht eh nur 4 Bits braucht.... um speicher zu
sparen... is aber nich... geht nur mit int... vorsicht, hier wird vom
gcc keine fehlermeldung geworfen!

bsp.:

struct BitVariablen{
    int  bool1     :1;
    int  bool2     :1;
    int  bool3     :1;
    int  bool4     :1;
    int  bool5     :1;
}MeineBits = {0,0,1,0,1};//(initialisierung, ahnlich wie "char i =
3;"
                         // nur eben für die structur...

da bedeuted, noch vor dem ersten zugriff auf die bitvariablen, haben
diese bereits einen (anfangs-)wert. hier:
bool1 = 0
bool2 = 0
bool3 = 1
bool4 = 0
bool5 = 1

hier hast du nun fünf einzelne bits, auf die du wie folgt zugreifen
kannst:
    MeineBits.bool1 = 0;
od.
    if(MeineBits.bool5){
        ...
    }
od.
    MeineBits.bool2 = MeineBits.bool3;

poste, wenn du mehr info brauchst...

hoffe ich konnte helfen ;-)

von tex (Gast)


Lesenswert?

@Sven
Excellent! Vielen Dank. Das ist ganz genau das, was ich gesucht habe.

@Fritz
Vieleicht darf ich das mal aufklären.
Ich habe vor 13 Jahren Mutithreadanwendungen in C geschrieben.
Natürlich habe ich viel vergessen, aber viel schlimmer ist, was sich
seither alles verändert hat, mit was für erbärmlichen Werkzeugen die
Leute heute arbeiten müssen, welche gigantischen Recourcen sie
verschlingen und was für jämmerliche Ergebnisse diese liefern,
verglichen mit dem, was ich vor 13 Jahren zur Verfügung hatte. Immer
wieder stelle ich fest, dass div. Projkte, die ich vor einem Jahrzeht
realisiert habe, mit den heutigen Mitteln nicht zu realisieren gewesen
wären, bzw unermesslichen Mehraufwand erfordern.
Das Thema der 1 Bit-Variablen ist ja nicht neu. Statusflags abzulegen
um sie später zur Verfügung zu haben ist ja nicht erst seit gestern
wichtig und auch ich weiß dass eine Boolean nicht nur ein Bit benutzt
hat.
Das Thema ist angesichts der bestürzenden Speichermengen, die die uCs
heute Zur Verfügung stellen vielleicht nichts mehr, worüber man
nachdenken muss, aber ich denke halt immernoch darüber nach.
Für die uCs hat man halt chars verwendet und musste sich seine
Ein-Bit-Variablen dann sinvoll darin aufteilen. Es gibt im 90Can128 der
ja wohl in Kürze den mega128 ablösen soll z.B. 3 Bitadressierbare
Register, vieleicht auch für diesen Zweck??
Vielleicht wäre das Form effektiver, wenn man statt Verarschungen oder
sinnloser Kommetare Ideen oder Wissen posten würde.

von OldBug (Gast)


Lesenswert?

@tex:

Du hast überhaupt_ _nicht verstanden, was Fritz damit sagen wollte!

Er meinte ganz einfach:

Ein statische, lokale Variable belegt zu jeder Zeit genau so viel
Platz im RAM wie eine globale Variable des gleichen Typs! Wogegen eine
nicht-statische lokale Variable eben nur im Kontext der gerade
gerufenen Funktion Platz im RAM belegt. Wird diese Funktion verlassen,
so verschwindet auch diese Variable wieder aus dem RAM.

In C:

unsgined char cGlobal;    /* belegt ständig 1 Byte SRAM */

void
foo(void)
{
    static unsigned char scLocal; /* belegt ständig... */
}

void
bar(void)
{
    unsgigned char cLocal; /* belegt NUR beim Aufruf.. */
}

Auf eine statische Lokale variable könnte man sogar global zugreifen,
wenn man foo() beispielsweise den Pointer als Ergebnis zurück liefern
lassen würde.

Deswegen der etwas "übermotivierte" Ausdruck des "Verarschen"; weil
eben beide Varianten permanent Speicher belegen...
Aber ich wiederhole mich :)

von Jörg Wunsch (Gast)


Lesenswert?

Den Sinn der 3 bitaddressierten frei verfügbaren Register hat er auch
nicht verstanden... ;-)

Nein, ich möchte heute nicht mehr mit dem VT320 von vor 13 Jahren
allein arbeiten, auch nicht mehr wirklich meinen Emacs auf einem
80386SX laufen lassen.

von Matthias (Gast)


Lesenswert?

Hi

mich würde mal interessieren was vor 10 Jahren so einfach war was heute
nur mit enormen Aufwand zu realisieren ist? Beispiele bitte!

Matthias

von Jörg Wunsch (Gast)


Lesenswert?

Man kannte noch jedes Byte im Speicher mit Vornamen. :-))

von Sven Bohner (Gast)


Lesenswert?

war wohl echt ein fehler das Häckchen zu markieren, das veranlasst, bei
jedem analen erguss den ihr meint posten zu müssen eine email an mich
zu versenden...

von Jörg Wunsch (Gast)


Lesenswert?

Darf ich dir noch eine Tüte Smileys zur Selbstbedienung nachreichen?

:-) :-)) :.) :^) 8-) :-> :-° :P) :-I <:-) ;-)

von OldBug (Gast)


Lesenswert?

Tja, das ist wohl Dein Problem, wofür Du uns wohl kaum beschimpfen
brauchst!

Kopf hoch!

von Matthias (Gast)


Lesenswert?

Hi

@Jörg
OK. Hast recht. Das dürfte heute schwierig werden. Wobei sich die Bytes
im Speicher auch immer so ähnlich sehen. Echt schwierig die auseinander
zu halten. $SMILY10

Matthias

von Rufus T. Firefly (Gast)


Lesenswert?

@tex:

"Ich habe vor 13 Jahren Mutithreadanwendungen in C geschrieben."
Worauf und womit?

von Andreas (Gast)


Lesenswert?

"Ich habe vor 13 Jahren Mutithreadanwendungen in C geschrieben."

Also das würde mich auch interessieren.
Zumindest Windows fällt aus, Unix ebenfalls (kannte zu dem Zeitpunkt
nur Prozesse, keine Threads).

von Rufus T. Firefly (Gast)


Lesenswert?

"Zumindest Windows fällt aus" - aber sehr knapp. Im Herbst '92 (also
vor etwas mehr als 12 Jahren) verteilte MS Betaversionen von NT 3.1,
denen auch ein SDK nebst Compiler beilag, so daß man damit anfangen
konnte, sich mit CreateThread und Konsorten auseinanderzusetzen.

Threads auf einem *nix-artigen Betriebssystem namens LynxOS habe ich
schätzungsweise im Winter '93/94 das erste Mal gesehen, das waren
schon PThreads. Das kann zu diesem Zeitpunkt auch nichts sonderlich
neues gewesen sein, weil das in einem Labor an einer Fachhochschule zum
Übungsstoff gehörte.
Die Programmierung war dank eines echten K&R-C-Compilers (keine
Typüberprüfung, keine Prototypen) grauenerregend.
Und natürlich musste der "mächtigste" Texteditor der Welt verwendet
werden - vi.

von tex (Gast)


Lesenswert?

<< Und natürlich musste der "mächtigste" Texteditor der Welt
verwendet
werden - vi.

Alternativ am DOS-Rechner unter Borland C schreiben, und ich meine dann
brauchte man noch ein Tool, damit der HP die Diskette wieder lesen
konnte oder umgekehrt?

von Rufus T. Firefly (Gast)


Lesenswert?

@tex: Ich bin verblüfft. Die Kisten, auf denen damals das LynxOS lief,
waren in der Tat von HP, irgendwelche Vectra-PCs. Und darauf waren die
mtools installiert, mit denen man DOS-Disketten unter LynxOS
lesen/schreiben konnte.
Mein Gott, war das zum Kotzen schlecht.

Hast Du etwa auch mit derlei Dingen hantiert?

von tex (Gast)


Lesenswert?

@Rufus
Wir können gerne bei einem MaiTai über die alten Zeiten sinnieren, aber
das hat nix in diesem Forum zu suchen. Dieser Thread hätte nach dem
Beitrag von Sven enden sollen.

von Rufus T. Firefly (Gast)


Lesenswert?

Kein Problem. Der Thread kann von mir aus aufhören - nur hätte ich gerne
noch meine Frage an Dich beantwortet gesehen.
http://www.mikrocontroller.net/forum/read-2-152288.html#157722

Im Offtopic eröffne ich daher einen Thread "alte Zeiten und Tex'
MaiTai"

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.