-         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: Daten aus 2 hintereinander liegenden Registern in ein char[8] Array einlesen

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.858
    Anzeige

    Praxistest und DIY Projekte
    Die ganze Sache ist nicht so einfach. Das fängt schon mal mit der Größe der Variablen an. Ein int ist in C mindestens 16 Bit, kann aber auch 64 Bit sein. Dazu kommt noch die Anordnung und die Orientierung der Bytes im Speicher, also ob Big oder Little Endian. Sauberer C-Code sollte von all dem nicht abhängig sein. Spätestens bei der Übertragung der Daten zwischen verschiedenen Systemen fällt einem das sonst auf die Füsse.

    Um die Größe sicherzustellen, kann man int32_t bzw. uint32_t verwenden. Und um Probleme mit der Endianes zu vermeiden ist
    Code:
    pTxReg1 = Data[i+3] << 24 | Data[i+2] << 16 | Data[i+1] << 8 | Data[i+0];
    ein Weg. Rückwärts geht es dann über Schieben nach rechts und ausmaskieren. Das sollte auf allen Architekturen das gleiche Ergebnis liefern.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    35
    Beiträge
    3.416
    kein memcpy?
    hast du denn
    #include <string.h>
    schon probiert?
    Der compiler weis meistens am besten wie man mit registern umgeht, also sollte man es dem compiler auch überlassen.

    Ich unterstütze hier Klebwax mit seiner Aussage, wenn man schon Bare-Bone programmiert sollte man sich ein klein wenig mit der Architektur mit der man arbeitet auseinandersetzen.

    Die Register sind je nach Controller und zugehöriger Bibliothek ander zu benutzen und sollten (wenn man nicht gerade irgendwelche Magie mit DMAs versucht) auch so benutzt werden. Ein Register manuell per Pointer anzusprechen führt nur zu den seltsamsten Effekten. Da gibt es z.B. den XMega (okay nicht gerade ein ARM, aber ein gutes Beispiel) bei dem man immer erst das high und dann das low byte beschreiben muss, weil er sonst nur das low byte kopiert und das high byte dann irgendwo anders landet wenn man ein anderes Register beschreibt.
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #13
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    09.10.2014
    Beiträge
    5.125
    das mit dem #include <cstring> bzw. <string.h> hatte ich oben ja auch bereits angemerkt.
    Welche Endianess vom Compiler bzw. MCU benutzt werden, ist aber eigentlich egal, wenn man es anschließend wieder als (int) bzw. (uint32_t) ausliest oder aber zurückkopiert - das mache ich auch immer so, und es klappt sowohl auf AVRs als auch ARM Cortex M0, M3, M4 als auch auf dem Raspi (ARM57).
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  4. #14
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    35
    Beiträge
    3.416
    das mit dem #include <cstring> bzw. <string.h> hatte ich oben ja auch bereits angemerkt.
    Sorry muss ich überlesen haben

    Welche Endianess vom Compiler bzw. MCU benutzt werden, ist aber eigentlich egal, wenn man es anschließend wieder als (int) bzw. (uint32_t) ausliest oder aber zurückkopiert
    sicher, aber wenn du es vorher in Bytes zerlegst und willkürlich speicherst kommt am Ende nur Murks raus wenn man nicht auf die Byteorder achtet

    Worauf ich hinaus wollte war eher dass man die Register nach Möglichkeit ausschließlich (DMA als Ausnahme genannt) über ihr Registernamen und nicht über Pointer ansprechen sollte! Bzw die Zuweisung zu Registern und ggf. auch das auslesen immer (quasi-)atomar machen sollte und nicht stückeln.
    Bei AtMegas und XMegas wie erwähnt, kann man auch manche Register word- oder byteweise schreiben aber da der Bus nur 8 bzw. 16 bit breit ist muss man da auf die Reihenfolge achten, da quasi der halbe Schreibbefehl in einem Puffer landet und der Latch erst mit dem schreiben des low Byte ausgeführt wird und wenn man falsch herum schreibt kommt auch nur Murks dabei raus.

    Byteweise + Register (>8bit bzw. >Busbreite) sollte man generell vermeiden, das ist der Kern meiner Aussage
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #15
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    09.10.2014
    Beiträge
    5.125
    wieso willkürlich?
    In meinem Beispiel oben mit memcpy kopiere ich doch immer die int32-Bytes in 4er-Gruppen in das Array, anschießend könnte man es genau so weiter- oder wieder zurückkopieren, die Ordnung würde dabei nicht geändert.

    (edit): vorrausgesetzt ntl, es handelt sich tatsächlich um 32-bit-Register....
    Geändert von HaWe (19.02.2019 um 11:04 Uhr)
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #16
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    35
    Beiträge
    3.416
    ich bezog mich auch nicht auf dein Beispiel sondern mein Satz sagte
    aber wenn du es vorher in Bytes zerlegst und willkürlich speicherst kommt am Ende nur Murks raus wenn man nicht auf die Byteorder achtet
    ... du hattest verallgemeinert geantwortet oder dich implizit auf deine Aussage bezogen und das wollte ich relativieren, denn allgemein gilt das nicht!

    Casten alleine reicht nicht wenn man zwischendurch stückelt. Immer Vorsicht mit der Byteorder bei sowas. Das will ich damit sagen...
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #17
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    09.10.2014
    Beiträge
    5.125
    ich habe im meinem Beispiel oben die 32-bit-Variable (ob Register oder nicht) doch gar nicht in einzelne Bytes zerlegt, sondern per memcpy als 4er-Block komplett in den Array rüberkopiert!

    https://www.roboternetz.de/community...l=1#post650420

    - - - Aktualisiert - - -

    PS,
    jetzt verstehe ich - wir haben aneinander vorbei geredet.
    Ich halte das Zerlegen in einzelne Bytes mit anschließendem Shiften oder was auch immer auch für potentiell fehleranfällig, daher ja mein Vorschlag mit memcpy für den ganzen 32bit-Block.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    05.10.2018
    Beiträge
    28
    Hallo Kollegen,

    vielen DANK für die die Erklärung der Sache.

    Wie genau die Register beschrieben werden ??? - da bin ich noch zu jung im Fach

    Also gelernt - Register langsam und sicher zu beschreiben.
    Gewünschten Triks gehen nicht immer durch

    Vielen DANK noch mal.

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Char mit array verbinden ?
    Von AsuroPhilip im Forum Software, Algorithmen und KI
    Antworten: 22
    Letzter Beitrag: 08.09.2011, 13:37
  2. Videoframes online in VisualBasic-Array einlesen
    Von malthy im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 8
    Letzter Beitrag: 26.07.2007, 10:52
  3. gelöst : Frage zu C und 2 Dim char Array
    Von jar im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 29.05.2007, 16:53
  4. zweidemensionales char-array
    Von p_mork im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 15.03.2007, 16:54
  5. Cstring einem char array zuweisen
    Von ceekay im Forum Software, Algorithmen und KI
    Antworten: 8
    Letzter Beitrag: 17.04.2006, 10:20

Berechtigungen

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