- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 11

Thema: Umrechnung MSB LSB zu INT

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    34
    Beiträge
    1.192
    Man kann ohne Schiebeoperationen auskommen, indem man direkt in den RAM über Pointer schreibt:
    Code:
    #define SaveU16(u16,MSB,LSB) *(((uint8_t*)(&u16))+0)=LSB; *(((uint8_t*)(&u16))+1)=MSB;
    Das sieht furchtbar aus, funktioniert aber
    Im Code verwenden mit
    Code:
    SaveU16(Ergebnis,MSByte,LSByte);
    Das ist schön kompakt und ist im Hauptprogramm gut lesbar,
    ABER: Das funktioniert nur auf 8-Bit Mikrocontrollern, die selber mit Little Endian arbeiten (bei Big Endian müssen +0, +1 getauscht werden), UND das ist nicht ohne weiteres portierbar.

    Grüße,
    Bernhard
    "Im Leben geht es nicht darum, gute Karten zu haben, sondern auch mit einem schlechten Blatt gut zu spielen." R.L. Stevenson

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo Bernhard,
    Zitat Zitat von BMS Beitrag anzeigen
    Das ist schön kompakt und ist im Hauptprogramm gut lesbar,
    ABER: Das funktioniert nur auf 8-Bit Mikrocontrollern, die selber mit Little Endian arbeiten (bei Big Endian müssen +0, +1 getauscht werden), UND das ist nicht ohne weiteres portierbar.
    Es funktioniert auch auf 16-Bit, 32-Bit usw. CPUs, wichtig ist, dass die CPU 8-Bit Zugriffe auf den ganzen Speicher machen kann.

    Eine andere, nicht portierbare Variante, ist über unions. Man legt zwei Bytes und den 16-Bit Wert einfach übereinander.

    Wer einmal in der Verlegenheit war portierbaren Code zu schreiben wird nur noch die Variante mit <<8 verwenden. Zumal vernünftige optimierende Compiler Code erzeugen, welche deiner Pinter-Geschichte entspricht. Es werden also keine Shifts um 8 Bit erzeugt, sondern das Byte entsprechend versetzt abgespeichert
    Dies funktioniert auch bestens mit 32-Bit und es ist egal ob die CPU mit Little/Little, Big/Big, Big/Little oder Little/Big Endian arbeitet.

    Bei manchen RISC-CPUs kommt noch hinzu, dass diese zwischen Big- und Little-Endian per Software umschalten können, da überlasse ich die Übersicht erst recht dem Compiler!

    Ich habe viel portierbaren Code schreiben müssen, vor allem Übertragungsprotokolle zwischen µCs und PCs.
    Die Portierbarkeit war vor allem ein Akt der Faulheit. Wird das Protokoll irgendwie erweitert, muss man nur einmal den Code ändern und 2x compilieren.

    Meistens habe ich auch fopen(), fread() usw. im Code verwendet, wie das unter einem PC-Betriebssystem üblich ist.
    Auf dem µC wurden dann diese Funktionen mit Macros ersetzt und auf die einzige vorhandene Schnittstelle umgelenkt.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Berechtigungen

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

LiFePO4 Speicher Test