Datum: 02.10.2007 12:56
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.
Datum: 02.10.2007 13:02
Wieso schiebst Du an dem Ausgangswert rum?
dataL = temp;
dataH = temp >> 8;
|
Datum: 16.05.2008 15:02
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?
Datum: 16.05.2008 15:11
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.
Datum: 16.05.2008 15:22
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?
Datum: 16.05.2008 15:26
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]); |
Datum: 16.05.2008 15:28
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.
Datum: 16.05.2008 15:36
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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel


