Forum: Compiler & IDEs AVR PROGMEM Spezifikt im Quellkode ersetzen


von Alf (Gast)


Lesenswert?

Ich versuche einen umfangreichen AVR-Quellcode in C auf einen ARM zu 
portieren. Deshalb habe ich mir einige Defines gemacht, welche alles was 
mit der AVR-Spezifik des Programmspeichers zu tun hat, normalisiert für 
einen linearen Adressraum.
1
#define prog_char char
2
#define prog_void void
3
#define PROGMEM /* solle Leerstelle erzeugen */
4
#define PSTR(s) s
5
#define pgm_read_byte(ptr)  ((char)*(ptr))
6
#define pgm_read_word(ptr)  ((int)*(ptr))
7
#define pgm_read_dword(ptr) ((long)*(ptr))

Gibst so eine Tabelle schon fertig? Z.B. auch für die _P Funktionen 
usw.?

von Wolfgang H. (Firma: AknF) (wolfgang_horn)


Lesenswert?

Hi, Alf,

schaut auf den ersten Blick gut aus.

Lediglich hier
> #define PSTR(s) s
stolpere ich, ob es nicht *s heissen sollte?

Der eine uP trennt Datenspeicher von Programmspeicher und nutzt sie 
gleichzheitig, der andere packt alles ins SDRAM.

Ciao
Wolfgang Horn

von Karl H. (kbuchegg)


Lesenswert?

Wolfgang Horn schrieb:
> Hi, Alf,
>
> schaut auf den ersten Blick gut aus.
>
> Lediglich hier
>> #define PSTR(s) s
> stolpere ich, ob es nicht *s heissen sollte?

Müsste schon stimmen.

Die typische Verwendung von PSTR ist ja

   lcd_puts( PSTR("Hallo World") );

wobei der PSTR dafür sorgt, dass der String ins Flash kommt und 
stattdessen ein Pointer ins Flash an lcd_puts übergeben wird.

von Helfer (Gast)


Lesenswert?

unsigned <-> signed stimmt IMHO noch nicht und die Bitlänge der 
Datentypen ist eventuell auch wichtig (int 16 oder 32 Bit).

http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

#define pgm_read_byte(ptr)   *((uint8_t *)(ptr))
#define pgm_read_word(ptr)   *((uint16_t *)(ptr))
#define pgm_read_dword(ptr)  *((uint32_t *)(ptr))

von Helfer (Gast)


Lesenswert?

Bei dieser einfachen Ersetzung musst du allerdings aufpassen, ob im AVR 
Programm Zugriffe auf absolute ROM Adressen gemacht werden à la

erstes_byte_im_ROM = pgm_read_byte(0);

von Alf (Gast)


Lesenswert?

Helfer schrieb:
> Bei dieser einfachen Ersetzung musst du allerdings aufpassen, ob im AVR
> Programm Zugriffe auf absolute ROM Adressen gemacht werden à la

Ich denke das kommt nicht vor, werde aber drauf achten!

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.