www.mikrocontroller.net

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


Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

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

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

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

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Sven Bohner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kannte noch jedes Byte im Speicher mit Vornamen. :-))

Autor: Sven Bohner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darf ich dir noch eine Tüte Smileys zur Selbstbedienung nachreichen?

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

Autor: OldBug (Gast)
Datum:

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

Kopf hoch!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@tex:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.