PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Statemachine Beispielprogramm



fulltime
26.01.2012, 17:40
Hy Leute!
Da wir in der Schule wieder ein bisschen mehr über C gelernt haben, habe ich mir das Beispielprogramm 04 angesehen und ich verstehe nicht was bei dir,move und rotate der ":" und die folgende Ziffer bedeuten sollen. Kann mir jemand Klarheit verschaffen?


typedef struct {
uint8_t speed_left; // left speed (is used for rotation and
// move distance commands - if these commands are
// active, speed_right is ignored!)
uint8_t speed_right; // right speed (if required...)
unsigned dir:2; // direction (FWD, BWD, LEFT, RIGHT)
unsigned move:1; // move flag
unsigned rotate:1; // rotate flag
uint16_t move_value; // move value is used for distance and angle values
uint8_t state; // state of the behaviour
} behaviour_command_t;
Danke schön schon im voraus! ;)

lokirobotics
26.01.2012, 18:39
Das ist eine Bitmap.
Die Zahlen geben an, wie viele Bits, der Wert belegt. Der Compiler optimiert das dann und so passen dir, move und rotate in ein Byte, anstatt für jeden Wert ein ganzes Byte zu verschwenden.

radbruch
26.01.2012, 18:56
Danke, wieder was gelernt bzw. aus den Untiefen der Erinnerungen wieder was nach oben befördert.

:)

markusj
26.01.2012, 19:40
Das sollte man aber wenn möglich meiden, es bläst den generierten Code wohl ziemlich auf. Ich meine mich daran erinnern zu können, dass jemand mit Ahnung Mal schrieb, dass GCC da ziemlich unschöne Dinge anstellt.

mfG
Markus

radbruch
26.01.2012, 20:13
Ich hab' das auch noch nie verwendet, hatte es aber vor Jahren mal hier gesehen:


/************************************************** ***************************/
// Status LEDs

// A shadow register that simplifies usage of status LEDs:
union {
uint8_t byte;
struct {
unsigned LEDsR:3;
unsigned LEDsL:3;
unsigned reserved:2;
};
struct {
unsigned LED1:1;
unsigned LED2:1;
unsigned LED3:1;
unsigned LED4:1;
unsigned LED5:1;
unsigned LED6:1;
unsigned reserved1:1;
unsigned reserved2:1;
};
} statusLEDs;
(Aus RP6RobotBaseLib.h)

Oje: https://www.roboternetz.de/community/threads/34426-Einfaches-Programm-Denkfehler-gesucht


...dass GCC da ziemlich unschöne Dinge anstellt.Ich glaube, hier treffen zumindest zwei große Fallen aufeinander:

1.: Mit :1 wird keine boolesche Variable im Sinne vom GCC erzeugt, vielmehr handelt es sich um eine 1-Bit Variable. Eine Zuweisung mit True/False ist deshalb nicht legitim. Richtig wäre die Zuweisung eines 1-Bit-Wertes, deshalb verwendet GCC in meinem verlinkten Beitrag nur das Bit0 bei der Zuweisung.

2.: Die schwammigen Definitionen und Verwendungen von True und False. Weil allgemein angenommen wird, dass False gleich 0 ist (Ziffer Null, kein O), und alles außer 0 wäre True, ergeben sich Probleme, wenn man versucht, der 1-bit-Variable den boolesche Wert "True" zuzuordnen. Wie ich schon vor fast vier Jahren geschrieben hatte:

"(ACHTUNG! Das funktioniert nicht generell in C weil nicht definiert ist, wie der Compiler intern ein true speichert. true könnte auch z.B. 0b10000000 sein. Nur so am Rande erwähnt)"

(Ich hoffe, dass stimmt so halbwegs)



Wenn man, wie gewöhnlich,

char true=1, false=0;
if( (1==1) == true)

verwendet, würde das auch mit

char true=0b10000000, false=0;
if( (1==1) == true)

funktionieren?

(1==1) ist das GCC-True. Egal wie, dieses True ist in seiner Logikeinheit fest gespeichert. Welcher Datentype würde für mein eigenes true passen? Sind vielleicht deshalb die booleschen Variablen in GCC nicht definiert?

Ist ja lustig, so trifft man sich wieder:
https://www.roboternetz.de/community/threads/51152-Gibt-es-den-Datentyt-Boolean-in-C

"...da "false" theoretisch nicht Null sein muss." *heul*


´Programmiersprache C/C++
6.2.5. Datentyp bool
C sieht keinen eigenen Datentyp für logische Werte vor.
Logische Ausdrücke und Vergleiche liefern stattdessen einen Wert vom Typ int:

0 "Falsch" ( false )
sonst "Wahr" ( true )

Diese Eigenschaft ermöglicht in C das Erstellen sehr kompakter Quelltexte.(Aus http://www.imb-jena.de/~gmueller/kurse/c_c++/c625.html)

Diese Eigenschaft ist Schummeln?

markusj
26.01.2012, 22:41
:1 definiert auch keine boolesche Variable sondern einen Integer mit einer Breite von einem Bit. Und ein(!) Wert für true wird in stdbool.h definiert. Grundsätzlich sicher ist der Vergleich mit false, also == false oder != false. Und wenn es um Zahlenwerte geht: Ebenso, direkt vergleichen und nicht irgendwelche Tricksereien mit true/false.

mfG
Markus

Nachtrag: Das Unschön bezog sich mehr auf die Qualität des generierten Maschinencodes.