#define Fehler

OP #4987194
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
Gast #4987201
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...
#4987310
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)))
Gast #4987323
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...
#4987520
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.