Timo Birnschein schrieb:
> // CONST Object Dictionary Data
> #define MEM_CONST const code
> // Process data and frequently used variables
> #define MEM_NEAR data
> // Seldomly used variables
> #define MEM_FAR xdata
>
> Was sollte ich beim AVR tun?
Die einfachste Lösung ist die Defines leer auszuführen, also
1 | #define MEM_CONST const
|
2 | #define MEM_NEAR /* empty */
|
3 | #define MEM_FAR /* empty */
|
Offenbar verwendet der Code nich-standard Qualifier code, data, und
xdata.
Eine besserer Ansatz wäre damit die Makros so zu lassen wie sie sind und
1 | #define code /* empty */
|
2 | #define data /* empty */
|
3 | #define xdata /* empty */
|
4 |
|
5 | #define MEM_CONST const code
|
6 | #define MEM_NEAR data
|
7 | #define MEM_FAR xdata
|
oder auch "global" per Kommandozeile, da daß man den Code nicht anfassen
muss:
1 | avr-gcc ... -Dcode= -Ddata= -Dxdata=
|
Daß statische read-only Daten bei AVR üblicherweise im Falsh abgelegt
werden ist lediglich eine Optimierung — allerdings eine, die aufgrund
des sehr begrenzten SRAM bei vielen Anwendungen essenziell ist.
Mit avr-gcc 4.7 und neuer gibt es den Address-Space Qualifier __flash
gemäß der Embedded-C Erweiterung ISO/IEC TR 18037. Damit könnte das
dann auch so aussehen:
Damit werden die "code"-Daten ins Flash gelegt und die richtigen
Zugriffe erzeugt. Im Gegensatz dazu landen die Daten mit einem reinen
"const" zwar in der read-only Section .rodata, diese muss bei AVRs aber
im RAM liegen.
Für avr-gcc bis 4.6 muss man mehr ändern um Daten im Flash abzulegen und
richtig zuzugreifen, d.h. die Ablage der Daten muss per Attribut progmen
(aka. PROGMEM, ein Makro auf dieses Attribute) händisch erfolgen und
ebenso auch der Zugriff über die pgm_read_xxx Makros aus avr/pgmspace.h
der der AVR-Libc.