Forum: Compiler & IDEs #define Fehler


von Florian R. (fxlxo)


Lesenswert?

Hallo,

ich habe ein funktionsfähiges Projekt von der Arduino IDE über Atmel 
Studio in ein Atmel Studio Projekt importiert. Nun versuche ich den Code 
in Eclipse zu kopieren und möchte das Programm auf einen STM32f103... 
aufspielen.

Jetzt hängt es gerade bei den #defines

z.B.:
1
#define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];}))

hier sagt der  Compiler beim letzten __c: "__c" could not be resolved 
obwohl doch __c[] kurz zuvor deklariet wird. Warum??

Danke im voraus
Grüße

von Dr. Sommer (Gast)


Lesenswert?

STM32 hat/braucht kein PROGMEM. Du kannst da das PSTR vermutlich einfach 
so definieren:
#define PSTR(s) (s)

Außerdem ist __c ein für die Standard Library reservierter Bezeichner, 
de darfst du in deinem Code nicht verwenden.

Hoffentlich hast du den Rest vom Code portiert, weil AVR Code kann man 
ja nicht einfach auf STM32 kompilieren...

von Nico W. (nico_w)


Lesenswert?

PSTR sieht für den STM wie folgt aus:
1
#define PSTR(s) ((const char *)(s))

Wie schon richtig angemerkt kennt der ARM kein Progmem. Demenstprechend 
muss man ggf. auch PROGMEM wegdefinen.

Bei mir sieht das in gänze so aus:
1
  #define PROGMEM
2
  #define PGM_P const char *
3
  #define PSTR(s) ((const PROGMEM char *)(s))
4
  #define pgm_read_byte(x) (*((uint8_t *)(x)))
5
  #define pgm_read_word(x) (*((uint16_t *)(x)))
6
  #define pgm_read_dword(x) (*((uint32_t *)(x)))

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Nico W. schrieb:
> PSTR sieht für den STM wie folgt aus:#define PSTR(s) ((const char
> *)(s))
Wofür denn der cast? String-Literale werden doch automatisch zu "const 
char*" ("decay").

Nico W. schrieb:
> #define pgm_read_byte(x) (*((uint8_t *)(x)))
>   #define pgm_read_word(x) (*((uint16_t *)(x)))
>   #define pgm_read_dword(x) (*((uint32_t *)(x)))
Na hoffentlich werden die nur mit aligned Adressen genutzt...

von Nico W. (nico_w)


Lesenswert?

Dr. Sommer schrieb:
> Nico W. schrieb:
>> PSTR sieht für den STM wie folgt aus:#define PSTR(s) ((const char
>> *)(s))
> Wofür denn der cast? String-Literale werden doch automatisch zu "const
> char*" ("decay").

Ich habe in meine Projekt (AVR-STM32-Port) zwar sehr viel Code 
'hinterfragt', aber nicht jede Zeile. Werde mir das aber bei gelegenheit 
mal ansehen. Danke dafür.

Dr. Sommer schrieb:
> Na hoffentlich werden die nur mit aligned Adressen genutzt...

Der Rest ist letzendlich wie in der Arduino-IDE auch hinterlegt.

hardware/sam/xxx/cores/arduino/avr/pgmspace.h
1
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
2
#define pgm_read_word(addr) (*(const unsigned short *)(addr))
3
#define pgm_read_dword(addr) (*(const unsigned long *)(addr))

Die structs sind alle aligned. Muss mich damit jedoch auch mal näher 
befassen.

von Florian R. (fxlxo)


Lesenswert?

Danke hilft mir weiter!

Gruß

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
Noch kein Account? Hier anmelden.