avr/gcc 'expected expression before 'ZoomSettings_t'

Moderator #4898827
Lesenswert?

Lass mich mal Detektiv spielen:

Du hast die Zeile falsch abgeschrieben, und sie lautet in Wirklichkeit

1
uint8_t *bufferPtr = (uint8_t *)&ZoomSettings_t;

Dabei ist ZoomSettings_t ein mit typedef definierter Typ. Da es dem
Compiler schwer fällt, von einem Typ die Adresse zu bestimmen, bringt er
die genannte Fehlermeldung.
Gast #4898836
Lesenswert?

Yalu X. schrieb:
> uint8_t *bufferPtr = (uint8_t *)&ZoomSettings_t;

sorry is wohl beim copy&paste passiert die Funktion lautet eigentlich 
so, bekomme aber immer noch diesen Fehler in der Zeile
1
 uint8_t *bufferPtr = (uint8_t *)&ZoomSettings_t;
1
 
2
void copyPayload(uint8_t *in, uint8_t payloadNum)
3
{
4
  uint8_t *bufferPtr = (uint8_t *)&ZoomSettings_t; 
5
  uint8_t a,base;
6
  
7
  base = payloadNum * PAYLOADSIZE;
8
  for(a = 0; a < PAYLOADSIZE; a++)
9
  {
10
    bufferPtr[base + a] = in[a];
11
        }
12
}
#4898857
Lesenswert?

Das was du da veranstaltest ist dummer Quark !

ZoomSettings_t kommt mir aus einer anderen Thread bekannt vor?


uint8_t *bufferPtr = (uint8_t *)&ZoomSettings_t;  ? woher soll aus dem 
Type ein Zeiger kommen ?

ZoomSettings_t test;

 uint16_t *bufferPtr = (uint16_t *)&test;


Die Adresse passt auch gar nicht in eine uin8_t, das wäre das nächste 
...

Ist aber total blöd da du nicht weist wie test im Speicher angelegt 
wurde. Greifst du undefiniert irrend wo in den Speicher hinein.

Deine Funktion ist alles andere als save.
#4898883
Lesenswert?

Nunja es kommt drauf an der AVR(8bit) teilt die Adressen auf je ein byte 
auf MSB-LSB.  Wenn du diese Adresse in 1byte quetscht sollte beim AVR 
nur das LSB übrigbleiben.  So lange die Adresse nicht über den 
Wertebereich liegt mag das sogar funktionieren.


Ebene und die schleife springt immer eine Adresse nach oben.  Ist der 
Datentype größer wie 1Byte  gibt es Probleme, bei einen 16bit Datentype 
müsste er 2 byte springen. Auch wenn die Daten nicht mit aufsteigenden 
Adressen im Speicher liegen. Mit einen ARM landet er mit dem Code im 
dummy Handler.

Solch einen Käse sollte man sich gar nicht erst aneignen! Sondern sich 
ausgiebig mit Pointern und der Architektur beschäftigen.
Gast #4898911
Lesenswert?

Marco H. schrieb:
> Wenn du diese Adresse in 1byte quetscht
Das passiert ja nicht...

Marco H. schrieb:
> Solch einen Käse sollte man sich gar nicht erst aneignen! Sondern sich
> ausgiebig mit Pointern und der Architektur beschäftigen.
Solltest du auch mal...

Auf meinem PC (64 Bit) kann ich auch sowas machen:
1
uint64_t x = 349587987;
2
uint8_t *p = (uint8_t *)&x;
Oh, wunder, das funktioniert ganz wunderbar.

Nochmal:
Der Datentyp des Pointers hat nichts mit der breite des Pointers zu 
tun.
In meinem Beispiel hat p eine groesse von 64 Bit und nicht 8 Bit, so wie 
du es bescheinigst.
Der Datentyp des Pointer sagt nur wie die Daten interpretiert werden, 
und nichts anderes.
1
uint8_t* a;
2
uint16_t* b;
3
uint32_t* c;
4
uint64_t* d;
5
float* e;
6
double* f;
7
char* g;
Die Pointer sind alle 64 Bit gross auf meinem PC, weil der Datentyp 
nichts mit der breite des Pointers zu tun hat!
Gast #4898960
Lesenswert?

Marco H. schrieb:
> ZoomSettings_t test;
>
>  uint16_t *bufferPtr = (uint16_t *)&test;

Danke! Hast recht hab es jetzt so abgeändert
1
ZoomSettings_t RAMZoomSettings;
2

3
uint8_t *bufferPtr = (uint8_t *)&RAMZoomSettings;

Der Hintergrund ist: Ich bekomme Daten Byte für Byte bis 5 Bytes 
empfangen wurden. Ich schreibe diese in der reihenfolge wie ich sie 
empfangen habe in ein struct hintereinander weg und schreibe dann wenn 
das struct (112 Byte groß) voll ist ins EEPROM weg...

Danach lese ich die Variable aus dem EEPROM aus und verarbeite sie 
weiter....
#4899024
Lesenswert?

Aha also doch das selbe  Thema !


Er meinte ein Struct in dem sich ein Array befindet.

Das was du machst ist sehr ineffektiv was die Anordnung im EEROM 
betrifft. So wirst du nie den Speicher gut ausnutzen und nutzt nur einen 
Teil dessen als wenn man die Daten Sinnvoll anordnet das sie auf einer 
Page passen.

Das mit dem dauernden Schreiben in den EEROM würde ich mir gut 
überlegen! Das sollte man lieber über ein externen RAM etc. machen.

Aber auch dieser ist Blockweise organisiert.

Sein Problem wird sein das er nicht weiß wie man darauf zugreift.
Man kann sich ja auch die Adresse des Array aus dem struct ziehen.

uint8_t *buffer=&RAMZoomSettings.array[0];

oder uint8_t *buffer=&RAMZoomSettings.array[index_schon_geschieben];

Arrays hängen immer zusammenhängt im Speicher damit wäre sichergestellt 
das er auch wirklich darauf zugreift.
Gast #4899091
Lesenswert?

Hallo habe es jetzt so implementiert und es funktioniert soweit für ein 
Datenpaket empfange ich das zweite wird es überschrieben... wie gehe ich 
weiter vor wenn jetzt mehrere Datenpakete ankommen die ich nacheinander 
im EEPROM ablegen möchte... stehe gerade auf dem Schlauch

An sowas hab ich gedacht i soll nach jedem empfangen Datenpaket 
inkrementiert werden, sodass die Daten immer weiter rücken

dafür muss ich wissen wann ucRxBuffer vollständig empfangen wurde dann 
i++
usw.

Jemand ne Idee?
1
//hab an sowas gedacht
2
copyPayload(&ucRxBuffer[3], i);
1
//dieses funktioniert
2

3
ZoomSettings_t EEMEM EEPROMZoomSettings;
4
ZoomSettings_t RAMZoomSettings;
5

6
void copyPayload(uint8_t *in, uint8_t payloadNum)
7
{
8
  uint8_t *bufferPtr = (uint8_t *)&RAMZoomSettings; 
9
  uint8_t a,base;
10
  
11
  base = payloadNum * PAYLOADSIZE;
12
  for(a = 0; a < PAYLOADSIZE; a++)
13
  {
14
    bufferPtr[base + a] = in[a];
15
  }
16
}
17

18
copyPayload(&ucRxBuffer[3], 0);
19
eeprom_update_block( &RAMZoomSettings, &EEPROMZoomSettings, sizeof(ZoomSettings_t) );

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren