ein Bit-Variable im GCC?

Gast #179716
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?
Gast #179717
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.
Gast #179719
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.
Gast #179720
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
Gast #179722
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.
Gast #179723
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.
Gast #179725
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
Gast #179726
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...
Gast #179727
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 ;-)
Gast #179728
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.
Gast #179729
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 :)
Gast #179730
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.
Gast #179738
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).
Gast #179739
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.
Gast #179740
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?
Gast #179741
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren