gcc string relocation && IAR stringek flashbol

Petrik Gergely spee at freemail.hu
Fri Apr 23 09:41:06 CEST 2004


On Thu, 22 Apr 2004 ide.ne.irj at freemail.hu wrote:

> > epp tegnap volt egy mokas meresem az egyetemen. EIB instabus
> > epuletautomatizalasi berendezeseket kellett "felprogramozni".
>
> Oops, ilyen is van? Mifele busz az?
9600 bps aszinkron, Forditott RZ kodolassal. asszem. de
csak deltol irok belole ZH-t, ugyhogy meg nem tudom. :)

> > #define printf printf_P // :)
>
> Nem ez a gond. Azt sem irhatod be, hogy printf_P("hello world");
> Ugyanis a sztring konstanst a flashbol atteszi a memoriaba minden
> korulmenyek kozott. Ez tehat hibat fog jelezni, nem egyezik a tipus,
> az egyik char *, a masik _flash char * vagy ilyesmi.
most sotetultem fol vegkepp azugyben, mi volt a bajotok
(vagy baja Arnoldnak :).

> Tehat a problema az, hogy a sztring konstans tarolasi osztalyat nem
> tudod definialni a fuggvenyhivasban. Ha egy valtozoba beteszed elotte,
> akkor termeszetesen nem problema.
> De lehet hogy a gcc-ben megy.
> Idezetek a megapeg-bol:
> (lib/printf_P.h)
>
> extern void _printf_P (char const *fmt0, ...);
>
> #define printf(format, args)  _printf_P(PSTR(format) , ## args)
>
> Mi az a PSTR? Nem vilagos, de ez lenne a _tuti_ megoldas.
bizony, ez a tuti.

<avr/pgmspace.h> :

#define PSTR(s) ({static char __c[] PROGMEM = (s); __c;})

azaz on-the-fly flashbe teszi az argumentumot, es egy
konstans pointert ad vissza a _printf_P-nek. egy ilyen sor:

printf("%d: aztahetszazat, most mar ertem!",1);

a programkodban azt eredmenyezi, hogy a format string a
flashbe fordul, nem masolodik memoriaba, es a _printf_P
hivodik meg a kiirasra, ami szinten flashbol dolgozik (es a
stackre olvassa be a stringet, tehat csak addig eszi a
SRAM-ot, amig muszaj). a {}-ben levo __c; lesz a
"visszateresi ertek", ezt kapja meg parameterul a
_printf_P. ez a define nagyon nem volt vilagos eddig, ilyen
trukkos C makrot meg nem lattam...

> A PSTR-t az IAR nem ismeri, de eleg valoszinu, hogy letezik megoldas.
ha erted, hogy mit csinal a PSTR(s) gcc-ben, megprobalhatod
reprodukalni az IAR-ban. Arnold nekem valaszul irt leveleben
mintha ez lett volna:

_flash const char str[] = "konstans string a flashben";

a flashbe pakolas modja IAR-ban. ez alapjan en modositanam a
PSTR makrot az alabbira:

#define PSTR(s) ({ _flash static char __c[] = (s); __c;})

es utana a vararg makrok hianya miatt egy flashbol dolgozo
printfet elasnek egy inline void printf(...) fuggvenybe,
aminel a varargolas mar gond nelkul megy.

> > pedig avr asm-et tanulni. alapveto szempont volt, hogy gnu
> > cuccokkal lehessen fejleszteni, mert az ilyenolyan IDE-kkel
> > az utobbi honapokban meggyult a bajom, es elegem van
> > beloluk (nem avr kapcsan, de akkor is).
>
> A Studio-t jo hogy nem raktad fel, az nem valo semmire, hulladek.
> De az IAR pl nagyon jo, es az asm only resze ingyenes is.
a studiorol azt hittem, hasznalhato. vagy az atmel csak
mutatoba csinalja, hogy elmondhassa magarol, hogy ad
ingyenes fejlesztokornyezetet a uC-ihez? az IAR-t
latokorszelesitesi cellal talan majd megnezem egyszer, de
most sietek a "projekttel", es maradok a C-nel.

--
G




More information about the Elektro mailing list