Hallo. Ich möchte meine eigene Struktur herstellen um ein Datum zu speichern. dazu möchte ich folgendes kominieren: Datum: 27.08.05 Tag: 27 -> 5 Bits Monat: 08 -> 4 Bits Jahr: 05 -> 4 bits (höchtes jahr: 2016) Zeit: 2 -> 3 Bits (1 = 00:00 Uhr; 2 = 03:00 Ihr; 3 = 06:00....) das Ganze wären dann 2 Bytes. aber wie mach ich das ? quasi so in der art: struct { Bit[5] Tag; Bit[4] Monat; ... } time;
5+3 =8 4+4 =8 würd ich mit ner union machen, dann kannst entweder bitweise oder komplett drauf zugreifen. dazu typen definieren wie oben von dir so gehts http://pronix.linuxdelta.de/C/standard_C/c_programmierung_18_2.shtml#9
An ne Union hab ich auch scon gedacht nur wie soll ich n halbes byte vergeben? Ich kann ja nicht schreiben struct{ halbes_byte Tag; ... }typ; wie kann ich das mit einer Union machen ? Da muss ich do ch genauso ne Struct definieren. Kann ich das nicht irgendwie so machen, dann ich später über
1 | Datum.Tag = 10; |
zugreifen kann?
Diese Bit-Knauserei spart Dir zwar 2 Bytes SRAM ein, kostet Dich aber Unmengen an Flash bei jedem Zusammenbasteln und Auseinanderklamüsern fürs Shiften, UNDieren und VerODERn. Schau Dir einfach mal den erzeugten Assembler an, dann wird Dir schnell übel werden. Nimm also besser für die 4 Variablen auch 4 Bytes. C unterstützt zwar Bitfelder, aber kaum einer benutzt sie, sind einfach zu teuer in Bezug auf Code und CPU-Zeit. Peter
Hallo Peter. esgeht mir nicht um die SRAM sondern um den EEPROM speicher des Mega16s. Ich hab nur 512 bytes und da müssen möglichst viele messwerte reinpassen sonst muss man jeden Tag die Daten auf den PC laden. Aus platzgründen bekomm ich leider kein 2. EEPROM speicher / Flash auf mein "Brett"
struct { uint16_t Zeit : 3; uint16_t Tag : 5; uint16_t Monat : 4; uint16_t Jahr : 4; } time;
Hi. Wiso muss ich die einzelenen members der structur als uint16 deklarieren ? später hat die Variable ja nur z.B. 3 bit !? wiso dann uint_16_
"wiso dann uint_16_" Das ist eben die Syntax, irgendeinen Typ muß jede Variable haben, wichtig ist hier aber nur, was hinter dem ":" steht. Peter P.S.: Man kann auch Daten im Flash speichern (SPM). Beim Nutzen des EEPROM, unbedingt die Brownout-Fuse setzen !
> C unterstützt zwar Bitfelder, aber kaum einer benutzt sie, sind > einfach zu teuer in Bezug auf Code und CPU-Zeit. Das trifft aber nur für Prozessoren zu, die ihren Speicher nicht bitweise adressieren können! (Zugegeben, das dürfte die Mehrheit sein). Mit "boolschen" Bitvariablen kann der entsprechende Prozessor mind. genauso schnell arbeiten wie mit int-Werten (Prozessorbreite!) und hat dabei den Vorteil des geringeren Speicherbedarfs für diese Variablen. > "wiso dann uint_16_" "korrekter" wäre int(!), da ANSI/ISO(?)-C das so verlangt. ----, (QuadDash).
>> "wiso dann uint_16_" >"korrekter" wäre int(!), da ANSI/ISO(?)-C das so verlangt. Tut es nicht (zumindest C99).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.