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?
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.
wegen den bit variablen.. guck im wiki mal nach bitfeldern. da hast du das was du suchst... gleich mit beispiel
@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.
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
@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.
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.
Was aber hat das Zählen von in einer Interrupt-Routine empfangenen Bytes mit einer Bit-Variablen zu tun?
@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
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...
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 ;-)
@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.
@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 :)
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.
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
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...
Darf ich dir noch eine Tüte Smileys zur Selbstbedienung nachreichen? :-) :-)) :.) :^) 8-) :-> :-° :P) :-I <:-) ;-)
Tja, das ist wohl Dein Problem, wofür Du uns wohl kaum beschimpfen brauchst! Kopf hoch!
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
@tex: "Ich habe vor 13 Jahren Mutithreadanwendungen in C geschrieben." Worauf und womit?
"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).
"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.
<< 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?
@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?
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.