mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 24 bit - 3byte Variable in C


Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute!

Ich benötige für eine Zeitmessung eine 3 Byte Variable - denn 4 Byte 
sind zu viel und 2 Byte zu wenig --> daher fallen INT und LONG mal 
weg...

Ich programmiere in C mit CVAVR und verwende eienn AT Mega8...

Gibt es da eine Möglichkeit, dass ich mir eine Variable mit 3Byte/24Bit 
zusammenbastle? Kann ich diese dann noch Problemlos in meinem Array 
verwenden?


lg Patrick

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreibs doch gleich in ein Array, wozu brauchst du dann noch diese 
merkwürdige Variable?

Was spricht sonst dagegen, ein "long" zu nehmen? Das obere Byte wird 
dann halt nicht benutzt, und? Wayne interessierts...

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, leider ist mein Programm sehr umfangreich und daher muss ich mit 
meinen Variablen "sparen wo's nur geht"...
Wenn ich jetzt mehr als 100 Läufer messe, dann stürzt mir das System ab, 
da vermutlich mein Array andere Speicherbereiche "angreift"...

Gibts da keine Möglichkeit eine 3Byte Variable zu erstellen?


lg Patrick

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, gibt's nicht.

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist mit Strukturen? Hab mal gegooglet... Ist das damit nicht 
irgendwie möglich? Was könnte ich sonst noch machen, damit mir die 
Variablen nicht zu groß werden?


lg Patrick

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstellen kann man das schon. Aber zum Rechnen wirds
etwas aufwändig.
Alternative, wenn du schon unbedingt auf 1/1000 genau
messen willst (was ich persönlich für Schwachsinn halte,
Tausendstel sind nicht mal bei den Skirennläufern gefragt
und die brettern mit mehr als 100km/h durchs Ziel. Bei
einer Gesamtlaufzeit von über einer Stunde sind 1/1000
sowas von uninteressant).

Nimm 1 uint16_t for die 1/1000 Sekunden. Damit kannst
du 1 Minute gerade noch abdecken. Dann noch einen uint8_t
für die Minuten dazu. 256 Minuten reichen für etwas mehr
als 4 Stunden


struct MyTime {
  uint16_t   Tausendstel;
  uint8_t    Minuten;
};

struct MyTime[100] Zeiten;

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst drei einzelne Bytes in einer struct ablegen. Dann musst Du 
allerdings bei einer Berechnung alle drei Bytes auch einzeln behandeln 
(Überlauf usw...).

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie wärs mit der einfachen Alternative: Mega88 statt Mega8? Diese 
Klimmzieherei hat doch keinen Sinn, überleg dir mal, wieviel Zeit du 
jetzt schon damit zugebracht hast, zu versuchen, die Chipgrenzen zu 
überlisten...
Fang doch nicht so einen Kram an. Wenn du vorhast, 1000 Stk und mehr 
davon zu bauen, macht es Sinn, alles in einen kleineren Chip zu pressen, 
sonst nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
crazy horse wrote:
> wie wärs mit der einfachen Alternative: Mega88 statt Mega8? Diese
> Klimmzieherei hat doch keinen Sinn, überleg dir mal, wieviel Zeit du
> jetzt schon damit zugebracht hast, zu versuchen, die Chipgrenzen zu
> überlisten...

Das hat nichts mit Chipgrenzen zu tun.
Selbst 100 Stück long brauchen erst 100*4 = 400 Bytes.
Die hat ein Mega8 aber locker.

Nichts gegen einen Chip-Upgrade. Aber auch der kann solides
Handwerk nicht ersetzen.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ crazy horse

>wie wärs mit der einfachen Alternative: Mega88 statt Mega8? Diese
>Klimmzieherei hat doch keinen Sinn, überleg dir mal, wieviel Zeit du
>jetzt schon damit zugebracht hast, zu versuchen, die Chipgrenzen zu
>überlisten...

Ich galube ihm fehlt her noch einiges an Grundverständnis zum Thema 
Programmieren.

>Fang doch nicht so einen Kram an. Wenn du vorhast, 1000 Stk und mehr
>davon zu bauen, macht es Sinn, alles in einen kleineren Chip zu pressen,
>sonst nicht.

Warum nicht gleich nen P4? ;-)
Im Ernst, siehe oben.

MfG
Falk



Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiss ja nicht, was er sonst noch so braucht. Er wird ja nicht 
einfach so auf Speichergrenzen gestossen sein. Ich wollte nur sagen: 
solche "Kunstgriffe" sollte man ohne absolute Notwendigkeit vermeiden. 
Und in dem Fall kann man sie ganz einfach vermeiden, indem man 
zusätzliche 15 Cent investiert. Lohnt es sich in dem Fall, auch nur 
einen Augenblick darüber nachzudenken, wie man mit 3 statt 4 Bytes pro 
Variable auskommt?
So, und jetzt ist für mich hier Schluss.

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:

Genau so ist es...
Dieses Projekt ist meine Diplomarbeit und leider haben wir nicht 
wirklich viel zum Thema C-Programmierung in der Schule gemacht... Das 
was ich bis jetzt weiß, hab ich mir hauptsächlich hier im Forum 
"angelernt" (erklären lassen) oder eben durch Bücher "erlesen"...

Chipupgrade kommt nicht in frage, da ich dann doch einiges im Code 
ändern muss und dafür fehlt mir leider die Zeit... Denn das Projekt soll 
so schnell wie möglich abgeschlossen werden...


@ Karl heinz Buchegger:
Also die Tausendstel hab ich jetzt "aufgegeben" und hab mich jetzt für 
die hundetertstel Variante entschieden...


Mal schaun, ob ich das Programm vl. noch etwas "säubern" kann, um den 
Speicher zu "schonen"...


lg Patrick

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick F. wrote:
>
> Chipupgrade kommt nicht in frage, da ich dann doch einiges im Code
> ändern muss

Nicht wirklich.
Du sagst deinem Compiler, dass du einen Mega88 hast und ... fertig.
Eine Sache auf 10 Sekunden.

> Also die Tausendstel hab ich jetzt "aufgegeben" und hab mich jetzt für
> die hundetertstel Variante entschieden...

Das ist vernünftig.
Rechne mal nach. Selbst wenn du Spitzenläufer hast, dann
legen die in 1/1000 Sekunde im 100Meter Lauf grade mal
1cm zurück. Wenn jetzt sein Leibchen flattert ....

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Patrick F.

>was ich bis jetzt weiß, hab ich mir hauptsächlich hier im Forum
>"angelernt" (erklären lassen) oder eben durch Bücher "erlesen"...

Uhhhhh, das lässt nichts Gutes hoffen. (Auch wenn die Tutorial hier ganz 
gut sind)
Hast du sonstige Programmierkenntnisse in Basic oder so?

>Chipupgrade kommt nicht in frage, da ich dann doch einiges im Code
>ändern muss und dafür fehlt mir leider die Zeit... Denn das Projekt soll
>so schnell wie möglich abgeschlossen werden...

Aha, es brennt also schon. ;-)
Kennt man ja.

>@ Karl heinz Buchegger:
>Also die Tausendstel hab ich jetzt "aufgegeben" und hab mich jetzt für
>die hundetertstel Variante entschieden...

Das ist so ziemlich egal. Nimm Long oder ein Struct mit 3 Byte.

MFG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
crazy horse wrote:
> wie wärs mit der einfachen Alternative: Mega88 statt Mega8?

Aprilscherz ?

Mega8: 1kB SRAM
Mega88: 1kB SRAM
Mega168: 1kB SRAM


Peter

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Dieses Projekt ist meine Diplomarbeit

Mit einer Diplomarbeit wird doch idR. ein Studiengang abgeschlossen und 
man erhält dann ein Diplom und ist dann Diplomingenieur (oder wiedas 
heute heissen mag).

Ich versteh mal garnicht, was die Leute so studieren, wenn die 
Diplomarbeiten sich am Ende mit völlig artfremden Themen 
auseinandersetzen.
Wenn man sein Wissen aus dem Studium in deiner Diplomarbeit nicht unter 
Beweis stellen kann, ist es - wie ich finde - schade um die Zeit, die 
beim Studium drauf gegangen ist. Denn die Diplomarbeit ist doch das 
Aushängeschild, wenn man später auf Jobsuche geht.

Ich schreibe das, weil mir das in letzter Zeit hier im Forum öfters 
aufgefallen ist.

Kann aber auch gut sein, dass solche Äußerungen [Diplomarbeit] nur 
vorgeschoben werden, um sich schneller Hilfe gewiss zu sein. kA.

weitermachen

AxelR.

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

>> Chipupgrade kommt nicht in frage, da ich dann doch einiges im Code
>> ändern muss
>
> Nicht wirklich.
> Du sagst deinem Compiler, dass du einen Mega88 hast und ... fertig.
> Eine Sache auf 10 Sekunden.

Die Register muss ich dazu ja auch "umdrehen" oder? Hab nämlich schon 
mal versucht einen mega8-Code auf nen mega88 "umzuschreiben"... Hat aber 
leider nicht geklappt --> mein Compiler spielt da nicht so recht mit...

>> Also die Tausendstel hab ich jetzt "aufgegeben" und hab mich jetzt für
>> die hundetertstel Variante entschieden...
>
> Das ist vernünftig.
> Rechne mal nach. Selbst wenn du Spitzenläufer hast, dann
> legen die in 1/1000 Sekunde im 100Meter Lauf grade mal
> 1cm zurück. Wenn jetzt sein Leibchen flattert ....

Ich stimme dir völlig zu und werde das dann mal dem Auftraggeber 
"melden" und ihn darauf hinweisen, was das für ein Schwachsinn ist...


@Falk:

Also konkret haben wir in der Schule C/C++ gelernt --> da habe ich also 
mal Grundkenntisse gehabt... Weiters habe ich schon einiges selbst 
dazugelernt, indem ich mir bei Lehrern "Hilfe" geholt habe... Sonstige 
"Kenntnisse" habe ich eben aus Foren, Tut's u.ä....

Basic --> nöö... Keine Ahnung damit...


lg Patrick

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axel Rühl wrote:
>>Dieses Projekt ist meine Diplomarbeit
>
> Mit einer Diplomarbeit wird doch idR. ein Studiengang abgeschlossen und
> man erhält dann ein Diplom und ist dann Diplomingenieur (oder wiedas
> heute heissen mag).
>
> Ich versteh mal garnicht, was die Leute so studieren, wenn die
> Diplomarbeiten sich am Ende mit völlig artfremden Themen
> auseinandersetzen.
> Wenn man sein Wissen aus dem Studium in deiner Diplomarbeit nicht unter
> Beweis stellen kann, ist es - wie ich finde - schade um die Zeit, die
> beim Studium drauf gegangen ist. Denn die Diplomarbeit ist doch das
> Aushängeschild, wenn man später auf Jobsuche geht.
>
> Ich schreibe das, weil mir das in letzter Zeit hier im Forum öfters
> aufgefallen ist.
>
> Kann aber auch gut sein, dass solche Äußerungen [Diplomarbeit] nur
> vorgeschoben werden, um sich schneller Hilfe gewiss zu sein. kA.
>
> weitermachen
>
> AxelR.


Also ich bin in einer HTL für Mechatronik und Automatisierungstechnik 
und habe mir diese Diplomarbeit ausgesucht, da sie für mich am 
interessantesten klang... Das sie aber so umfangreich werden würde, 
wusste ich damals noch nicht... Die Diploarbeit hat nichts mit einem 
"Diplomingeneur" zu tun --> zumindest nicht die, die man in einer HTL 
macht...

lg Patrick

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Patrick F.

>Also konkret haben wir in der Schule C/C++ gelernt --> da habe ich also

Was heisst "In der Schule gelernt?" Programmieren lernt man im 
wesentlichen durch Programmieren! Das was man "in der Schule lernt" ist 
bestenfallst das Grundrüstzeug, der Startschuss.

>mal Grundkenntisse gehabt...

Mal gehabt, also nicht wirklich benutzt/gefestigt, praktisch das meiste 
mangels Anwendung schon wieder vergessen.

> Weiters habe ich schon einiges selbst dazugelernt, indem ich mir bei Lehrern 
"Hilfe" geholt habe..>. Sonstige "Kenntnisse" habe ich eben aus Foren, Tut's 
u.ä....

Also immer nur ein paar Bruchstücke zusammengeflickt, dass es gerade zum 
Überleben reichte. Naja.

>Basic --> nöö... Keine Ahnung damit...

Meine Befürchtung bestätigt sich.

Also mach das, was Karl Heinz gesagt hat. Poste deinen Quelltext (als 
Anhang) und wir können das Kind vielleicht noch retten, im Brunnen liegt 
es sowieso schon. 8-0

Mfg
Falk


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk wrote:
> Also mach das, was Karl Heinz gesagt hat. Poste deinen Quelltext (als
> Anhang) und wir können das Kind vielleicht noch retten, im Brunnen liegt
> es sowieso schon. 8-0

Hat er schon. Im anderen Thread.
Meine Befürchtung wurde noch übertroffen.
Wird nicht leicht da durchzusteigen.

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Quelltext ist in meinem anderen Thread "Interrupt- und 
Speicherproblem mit Mega8"...

Tja wir haben im Laufe der Schulzeit einige Projekte mit µC gehabt, die 
aber nicht allzu schwer waren - z.b. Töne generieren (rechteck mit 200, 
400 und 800Hz)...

Wäre echt toll, wenn ihr mir helfen könntet... Es stecken immerhin schon 
eta hundert Stunden im Programm... =o( Und "nebenbei" muss ich ja auch 
noch für Schularbeiten, Tests und auch für die Matura lernen... 
STRESS!!!


lg Patrick

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Patrick F.

>Wäre echt toll, wenn ihr mir helfen könntet... Es stecken immerhin schon
>eta hundert Stunden im Programm... =o( Und "nebenbei" muss ich ja auch

Mag sein, das heisst aber nicht, dass dabei viel rauskommen muss. Ich 
kann auch 100 Stunden im Kreis rennen . .  . ;-)
OK, hab den Quelltext gefunden, (und glaub ich auch schon einen massiven 
Fehler)
Ich glaube in Zeile 250 fehlt eine {

Die Formatierung ist S******. Da übersieht man auch mal fix fehlende 
Klammern etc. Und dass man sich damit besonders in C sehr schnell ins 
Knie schiessen kann, ist bekannt. Aber das musst du noch lernen, durch 
Schmerz. Das musste ich auch. ;-)

MfG
Falk





Autor: Rainer I. (raih)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum nicht so...
Man kann doch in einer struct beliebige Bitsizes definieren.

typedef struct  {
  uint32_t time   :24;  // 24Bit => 3Byte Laenge
} MYTIME_T;

MYTIME_T MyTime[100];

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> typedef struct  {
> uint32_t time   :24;  // 24Bit => 3Byte Laenge
> } MYTIME_T;
Selbst wenn das so ginge, wäre die komplette struct aber immer noch 32 
Bit groß... Aber afaik sind Bitfelder (C-Standard) nur in 16 Bit (int) 
möglich, einige Compiler unterstützen auch 8-Bit-structs...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rainer I. wrote:
> warum nicht so...
> Man kann doch in einer struct beliebige Bitsizes definieren.
>
> typedef struct  {
>   uint32_t time   :24;  // 24Bit => 3Byte Laenge
> } MYTIME_T;
>
> MYTIME_T MyTime[100];

Und?
Was bringt dir das, wenn der Compiler einen uint32_t
für die Speicherallokierung benutzt und dann nur
24 Bit davon zum Rechnen benutzt. Die restlichen
8 Bit verschwinden ja nicht magisch, die sind immer
noch da, nur benutzt sie keiner.



Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz Buchegger

>Und?
>Was bringt dir das, wenn der Compiler einen uint32_t
>8 Bit verschwinden ja nicht magisch, die sind immer
>noch da, nur benutzt sie keiner.

Sicher, aber das Problem von Patrick liegt sowieso ganz woanders.
Mein Kommentar zum Quelltext ist im anderen Thread.

Den hier sollten wir schliessen und uns auf das Problem im anderen 
Thread konzentrieren.

FOLLOW ME!

Beitrag "Interrupt- und Speicherproblem mit Mega8"

MFG
Falk

Autor: Rainer I. (raih)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz Buchegger

>Und?
>Was bringt dir das, wenn der Compiler einen uint32_t
>für die Speicherallokierung benutzt und dann nur
>24 Bit davon zum Rechnen benutzt. Die restlichen
>8 Bit verschwinden ja nicht magisch, die sind immer
>noch da, nur benutzt sie keiner.

typedef struct  {
  uint32_t time   :24;  // 24Bit => 3Byte Laenge
} MYTIME_T;

Es werden hier definitiv nur 3 Byte im Speicher benutzt !
Der Compiler rundet ggf. auf volle Bytes auf.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rainer I. wrote:
> @ Karl heinz Buchegger
>
>>Und?
>>Was bringt dir das, wenn der Compiler einen uint32_t
>>für die Speicherallokierung benutzt und dann nur
>>24 Bit davon zum Rechnen benutzt. Die restlichen
>>8 Bit verschwinden ja nicht magisch, die sind immer
>>noch da, nur benutzt sie keiner.
>
> typedef struct  {
>   uint32_t time   :24;  // 24Bit => 3Byte Laenge
> } MYTIME_T;
>
> Es werden hier definitiv nur 3 Byte im Speicher benutzt !

Ehrlich?
Das hätte ich nicht gedacht!

Wie hast du das festgestellt?

Was passiert bei

   MYTIME_T Times[100];

Wie gross ist sizeof(Times) ?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es werden hier definitiv nur 3 Byte im Speicher benutzt !
> Der Compiler rundet ggf. auf volle Bytes auf.

Hmmm, das ist ja toll. Mit welchem Compiler hast Du das getestet? GCC? 
Hab grad noch mal im K&R nachgeschlagen, und da steht eigentlich das, 
was ich oben schon angemerkt hatte, allerdings direkt darunter:

"Almost everything about fields is implementation-dependent [...]"

Genau das scheint der Punkt zu sein: In dem Zusammenhang darf 
anscheinend jeder Compiler machen, was er will (weshalb Programme, die 
mit bit fields arbeiten auch i.d.R. nicht portabel sind). Und wenn die 
Optimierung des Compilers merkt, dass nur drei Bytes benötigt werden, 
wird das anscheinend auch auf drei Bytes "zurechtgeschnippelt".

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Sorry, sollte natürlich "portierbar" und nicht "portabel" heißen...

Autor: Rainer I. (raih)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef struct  {
   uint32_t time   :24;  // 24Bit => 3Byte Laenge
} MYTIME_T;

MYTIME_T Times[100];  // 100 * 3Byte

sizeof(Times) ist somit 300, zumindest mit GCC ;-)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs grad mal ausprobiert, und tatsächlich: Es werden nur drei Bytes 
benutzt. Man lernt nie aus...;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rainer I. wrote:
> typedef struct  {
>    uint32_t time   :24;  // 24Bit => 3Byte Laenge
> } MYTIME_T;
>
> MYTIME_T Times[100];  // 100 * 3Byte
>
> sizeof(Times) ist somit 300, zumindest mit GCC ;-)

Ist ja hochinteressant.
Vielen Dank.


Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> typedef struct  {
>   uint32_t time   :24;  // 24Bit => 3Byte Laenge
> } MYTIME_T;
>
> Es werden hier definitiv nur 3 Byte im Speicher benutzt !
> Der Compiler rundet ggf. auf volle Bytes auf.

Darauf würde ich mich nicht verlassen!

Compiler für Maschinen, die auf ungeraden Adressen keine Worte 
lesen/schreiben können, allignen üblicherweise den Beginn von structs 
auf gerade Adressen.

Aber es gibt eine viel simplere Lösung für das Problem:
Du rechnest mit long und schreibst Dir eine kleine Verwaltung für Dein 
3-Byte-Variablenarray:

unsigned char Buffer[100 * 3];
long Get3Bytes(int index) {
  long r = 0;
  assert(sizeof Buffer >= (index + 1) * 3);
  memcpy(Buffer + 3 * index, &r, 3);
  return r;
}
void Put3Bytes(long val, int index);

Die Put... kann Du Dir selbst ausdenken.

@ Falk:
Statt hier klugscheißend rumzupoltern, hättest Du besser Dein Hirn ein 
wenig angestrengt und diese Lösung selbst vorgeschlagen - oder reichen 
dafür die Kenntnisse doch nicht?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Uhu Uhuhu

>Aber es gibt eine viel simplere Lösung für das Problem:
>Du rechnest mit long und schreibst Dir eine kleine Verwaltung für Dein
>3-Byte-Variablenarray:

Ja, die simpelste Lösung ist die Verwendug eine LONG Arrays. Das ist 
auch gar kein Problem, sein Speicher ist nicht übrlastet. Es sind 
Programmierfehler.

>Statt hier klugscheißend rumzupoltern, hättest Du besser Dein Hirn ein
>wenig angestrengt und diese Lösung selbst vorgeschlagen - oder reichen
>dafür die Kenntnisse doch nicht?

Du bist der Held des Tages.

http://de.wikipedia.org/wiki/Arroganz#Interpretation

MfG
Falk


Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk wrote:
> Ja, die simpelste Lösung ist die Verwendug eine LONG Arrays. Das ist
> auch gar kein Problem, sein Speicher ist nicht übrlastet. Es sind
> Programmierfehler.

Die Frage lautetet:

> Gibt es da eine Möglichkeit, dass ich mir eine Variable mit 3Byte/24Bit
> zusammenbastle?

Ich würde sagen: Thema verfehlt, mein Herr.

Autor: Gabriel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe gerade auch genau dieses Problem.
Am besten würde mir genau die Lösung von Rainer I. gefallen.
In meinem Fall sah das so aus:
typedef struct  
{
   long abc :24;  
}Test;
Und lief leider mit einem Tasking-Compiler für C167 nicht.

komischerweise ging folgendes:
typedef struct  
{
   int abc :8;  
}Test;
Ein sizeof() davon belegt aber auch 2 Byte.

Weiterhin habe ich auch noch
typedef struct  
{
   BYTE High;
   BYTE Middle;
   BYTE Low;
}my24bitData;

probiert. Auch hier belegt die Struktur aber 4 Byte...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Gabriel (Gast)

>probiert. Auch hier belegt die Struktur aber 4 Byte...

Dann musst du im Handbuch des Compilers mal nach Alignment, packed etc. 
suchen, um dem Compiler zu verclickern, dass er KEINE Füllbytes in 
Strukturen einfügen soll.

MFG
Falk

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pech. Fast alles rund um Bitfields ist abhängig von Zielmaschine und 
insbesondere Compiler. Zuverlässig portabel ist nur die Speicherung in 
einem Byte-Array.

Wobei die Nummer mit dem Bitfield immerhin auch bei anderen GCC Targets 
funktioniert, Alignment-Regeln zum Trotz, wenn man dem Compiler mit 
-fpack-struct auf die Sprünge hilft (z.B. ARM).

Autor: Rainer I. (raih)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gabriel
Da der C167 ein 16-Bitter ist, nehme ich an, daß er defaultmäßig ein 
alignment von 2 hat, d.h. die Byte-Größe der struct wird geradzahlig 
aufgerundet, damit der Proz. immer 16-bittig auf geradzahlige Adressen 
zugreifen kann.
Schau mal ob beim Tasking-Compiler das aligment umgestellt werden kann.

Autor: Gabriel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tips, ein Blick ins Handbuch hat weitergeholfen.
Ein _packed vor das struct und es funktioniert.
Zumindest die Variante mit den 3 bytes.
Das :24, was sicher die Arbeit erleichtern würde geht ja aus 
irgendwelchen anderen Gründen nicht.

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.