www.mikrocontroller.net

Forum: Compiler & IDEs uint16_t auf uint8_t


Autor: Robert M. (xertno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich will ein 16Bit Datenwort auf zwei 8Bit Datenworte aufteilen.
Habe folgendes geschrieben.

uint8_t Data1, Data2;
uint16_t Temp;

  Data2=Temp;
  Temp>>=8;
  Data1=Temp;

die Frage ist geht das so.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso schiebst Du an dem Ausgangswert rum?
dataL = temp;
dataH = temp >> 8;

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich habe eine Variable: uint16_t id
und ein Array: uint8_t array[10]

Nun habe ich dass hier geschrieben:
*(uint16_t*)&array[1]= id;

damit weiße ich array[1] das lowbyte und array[2] das highbyte zu. Laut 
*.lss wird dass ohne irgendeinen Overhead wie gewünscht richtig 
umgesetzt.


Die Frage ist jetzt nur kann man das auch lesbarer schreiben?

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ulrich wrote:

> Nun habe ich dass hier geschrieben:
>
*(uint16_t*)&array[1]= id;

> Die Frage ist jetzt nur kann man das auch lesbarer schreiben?

Statt einem Array eine Struct verwenden, in der die einzelnen 
Speicherstellen aussagekräftige Namen haben. Evtl mit anonymen Unions 
drinnen, wenn sowohl 16- als auch 8-Bit Zugriffe nötig sind.

z.B.
struct wasweisich {
  uint8_t befehl;
  union {
    uint16_t argument;
    uint8_t argument_byte[2];
  }
}

...


struct wasweisich a;
a.befehl=42;
a.argument=5678;
if (a.argument_byte[0]==23) {


Wenn das Speicherlayout wichtig ist, noch ein __attribute(packed) an die 
struct-definition anhängen.

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aso ich habe noch was vergessen:

An vielen verschiedenen stellen im code habe ich solche zuweisungen in 
vorhandenen arrays mit unterschiedlichem aufbau. Deswegen kann ich das 
nur so wie oben schreiben. Die frage ist nur kann man den cast 
verkürzen? Kann man da irgendwie den referenzierungs und 
dereferenzierungsoperator weglassen?

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein.

Du kannst das ganze ge-caste aber in ein Macro packen,

Ungetestet:
#define INT(x) (*(uint16_t*)&(x))


INT(array[42])=444;
uint16_t z=INT(array[23]);

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schade, habe gedacht da gibts noch einen Trick. Jetzt muss ich halt 
aufpassen das ich bei den ganzen casts usw. keinen Fehler machen.

Trotzdem Danke für deinen Hilfe.

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder du hast deinen Post noch editiert oder ich habs überlesen.

Ich mache es jetzt mit #define:
#define cast16 *(uint16_t*)&

cast16 array[1]= id;

funktioniert perfekt und vermeidet sicherlich den einen oder anderen 
bösen castfehler.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.