-         

Ergebnis 1 bis 6 von 6

Thema: Statemachine Beispielprogramm

  1. #1
    Benutzer Stammmitglied Avatar von fulltime
    Registriert seit
    08.10.2011
    Beiträge
    50

    Statemachine Beispielprogramm

    Anzeige

    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?
    Code:
            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!

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.05.2005
    Ort
    Berlin
    Beiträge
    316
    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.

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Danke, wieder was gelernt bzw. aus den Untiefen der Erinnerungen wieder was nach oben befördert.

    :)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    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
    Tiny ASURO Library: Thread und sf.net Seite

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Ich hab' das auch noch nie verwendet, hatte es aber vor Jahren mal hier gesehen:

    Code:
    /*****************************************************************************/
    // 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: http://www.roboternetz.de/community/...fehler-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)


    [Esraubtmirdenschlaf]
    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:
    http://www.roboternetz.de/community/...t-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?
    [/Esraubtmirdenschlaf]
    Geändert von radbruch (26.01.2012 um 23:09 Uhr)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    :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.
    Tiny ASURO Library: Thread und sf.net Seite

Ähnliche Themen

  1. Frage zu Statemachine Menü aus RN-Wissen
    Von kolisson im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 29.08.2010, 14:55
  2. UART-Beispielprogramm
    Von datatom im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 06.04.2010, 21:09
  3. Fragen zum I2C und zum Beispielprogramm
    Von TrainMen im Forum Robby RP6
    Antworten: 5
    Letzter Beitrag: 21.06.2009, 22:55
  4. C Beispielprogramm flashen
    Von Da_Vinci13 im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 13
    Letzter Beitrag: 12.02.2009, 13:40
  5. ATMEGA2560 Beispielprogramm
    Von mattschach im Forum C - Programmierung (GCC u.a.)
    Antworten: 17
    Letzter Beitrag: 06.01.2008, 16:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •