Hallo und guten Morgen,
für meine Mikrocontroller Anwendung habe ich folgendes Problem
vorliegen:
Ich habe als Eingangsparameter ein union. Dieses union besteht aus 8 Bit
(uint8_t). Jedes Bit steht für ein bestimmtest Symbol.
Nun soll dieser union Wert verwendet werden, um die entsprechenden
Symbole auf dem Display darzustellen.
1
typedefunion
2
{
3
uint8_trawByte;
4
struct
5
{
6
uint8_tdate:1;
7
uint8_twarning:1;
8
uint8_tlowBattery:1;
9
uint8_ttemp:1;
10
uint8_tpressure:1;
11
}st_displaySymbols;
12
}un_displaySymbols;
Für die Darstellung eines Symbols wird eine Funktion verwendet:
Ist schwer das zu formulieren. Ich versuche es mal.
Ich erhalte einen 8 Bit Wert. In diesen 8 Bits entspricht dann jedem Bit
ein bestimmtes Symbol. Nun soll in der Weiterverarbeitung die Symbole
auf das Display angezeigt werden. Ein einzelnes Symbol zu aktivieren auf
dem Display ist kein Problem. Wenn ich aber einen 8 Bit Wert habe, wo
jedes Bit einem Symbol entspricht, das bereitet mir Probleme wie ich das
in Software umsetzen könnte.
Beispiel:
uin8_t = 0xA0 ==> bit: 1010 0000
Hier soll das entsprechende Symbol von der Bitstelle 7 und auch von der
Bitstelle 5 auf dem Display dargestellt werden. Alle anderen Symbol
sollen nicht angezeigt werden.
Das Problem bei Bit-structs ist, die Order ist nicht eindeutig
definiert.
Daher bevorzugt man oft Bitmasken (0x01, 0x02, .. 0x80).
Und wenn man nicht wirklich mit RAM knausern muß, nimmt man für jedes
Bit einfach ein Byte.
He S. schrieb:> Ich würde es trotzdem gerne irgendwie mit switch case lösen.
Dann such dir halt eine passende Programmiersprache, in der du das
kannst.
Oliver
He S. schrieb:> Ich würde es trotzdem gerne irgendwie mit switch case lösen.
Wird so nicht möglich sein.
Ausser du machst eine switch case mit 256 cases. Aber das macht man so
nicht und auf die Idee würde auch keiner kommen.
Prüfe das jeweilige Bit und gut ist.
He S. schrieb:> Ich würde es trotzdem gerne irgendwie mit switch case lösen.
Das geht nicht.
Switch/Case kann immer nur eine Auswahl treffen, d.h. es darf immer nur
ein Bit gleichzeitig gesetzt sein.
He S. schrieb:> Hallo und guten Morgen,>> für meine Mikrocontroller Anwendung habe ich folgendes Problem> vorliegen:>> Ich habe als Eingangsparameter ein union. Dieses union besteht aus 8 Bit> (uint8_t). Jedes Bit steht für ein bestimmtest Symbol.> Nun soll dieser union Wert verwendet werden, um die entsprechenden> Symbole auf dem Display darzustellen.
Evtl. so:
Ich nehme an, dass Du immer einen vollständige Zustandsupdate benötigst.
Ich hoffe, dir ist bewusst, dass das Dekodieren einer Leitungscodierung
mit Hilfe einer union ein wenig gute Idee ist.
Du kannst den Namen der struct in der union auch weglassen, dann geht es
eleganter:
He S. schrieb:> Ich würde es trotzdem gerne irgendwie mit switch case lösen.
Kein Problem. Prüfe immer das letzte gesetzte Bit ( (n&~(n-1)) ,
"position of rightmost bit"), mache eine Schleife über die Switch-Case
und lösch am Ende des Schleifendurchlaufs die schon behandelten Bits.
Peter D. schrieb:> Walter T. schrieb:>> mache eine Schleife über die Switch-Case>> Quasi nen Knopf an die Backe nähen.
.. und sich dabei dann von hinten durch die Brust ins Auge und dann ins
Knie schießen.
Oliver
Peter D. schrieb:> Quasi nen Knopf an die Backe nähen.
Jupp. Wobei ich das weniger sinnlos auch schon für einen primitiven
priorisierten Scheduler genau so gemacht habe.
Aber der TO wollte doch unbedingt Switch/Case!
Es würde mich noch nicht einmal wundern, wenn der Optimizer daraus
durch loop unrollig wieder eine Reihe von if( byte & (1<<bit) ){} machen
würde.
He S. schrieb:> Ich würde es trotzdem gerne irgendwie mit switch case lösen.
Switch/case benutzt man für entweder/oder Szenarien. Bei dir können aber
mehrere Flags gleichzeitig an sein.
He S. schrieb:> Ich habe es ohne switch/case realisiert.
Das ist die Lösung, die ich oben beschrieben habe.
> Ich übergebe der Funktion den> Wert von der union.
Nicht ganz: Du benutzt eine impl. Typkonversion.
Es ist besser, wenn die Elemente des struct, die ja eigentlich Bool'sch
sind, auch als solche deklariert werden.
Und wie gesagt: die Namen Deine DT sind Mist.
He S. schrieb:> un_displaySymbols displaySymbols;> displaySymbols = incomming_data;
Das schreibt man so:
He S. schrieb:> Nur das mit der uint8_t Variable> funktioniert nicht mehr.
Achtung, C kennt keine echten Bit-Typen. Ein "bool" wird intern als
"int" verarbeitet. Je nach System hast du jetzt also "5 x 16Bit" oder "5
x 32Bit".
He S. schrieb:> Das mit bool lässt der Compiler zu. Nur das mit der uint8_t Variable> funktioniert nicht mehr. Diese ist aber schon für mich notwendig.
Geht mit >= C11. Du solltest ggf. den C-Standard angeben mit -std=c11
oder c17 oder c23.
Nennt sich unnamed Union member.
Irgend W. schrieb:> Achtung, C kennt keine echten Bit-Typen.
Eben. Das noch kombiniert mit Bitfeldern, welche in C weder
plattformkapatibel noch sonstwas sind, setzt dem Ganzen noch die Krone
auf. Man handelt sich ein Problem nach dem nächsten ein.
Meines Erachtens sind Bitfelder in C überflüssig. Man kann das auch
klassisch aufziehen:
He S. schrieb:> Ok diesen Standard nutzen wir nicht.>> Wir nutzen ISO C99.
Wir???? Das alles hört sich sehr nach Hobbygekruschtel an...
Na dann, Gib dem struct wieder einen Namen...
Frank M. schrieb:> Das noch kombiniert mit Bitfeldern, welche in C weder plattformkapatibel> noch sonstwas sind, setzt dem Ganzen noch die Krone auf. Man handelt> sich ein Problem nach dem nächsten ein.
Das habe ich ihm schon gaaaanz oben gesagt. Er hat es ignoriert.
He S. schrieb:> Nur das mit der uint8_t Variable> funktioniert nicht mehr. Diese ist aber schon für mich notwendig.
Dann mach es doch so, wie ich das gestern bereits vorgeschlagen hab:
Beitrag "Re: Unterstützung C Code + union"
Viel eleganter wirst du das in klassischem C kaum hinbekommen.