re PR target/49868 (Implement named address space to place/access data in flash memory)

PR target/49868
	* doc/extend.texi (AVR Named Address Spaces): Move sample code up.
	Remove note on size/offset limitation.
	(AVR Variable Attributes): Add example how to read data located
	with progmem.  Refer to named address spaces.
	* doc/invoke.texi (AVR Options): Fix typo.

From-SVN: r183473
This commit is contained in:
Georg-Johann Lay 2012-01-24 12:38:52 +00:00 committed by Georg-Johann Lay
parent 7cc35b68d5
commit aa9ec4db5f
3 changed files with 71 additions and 56 deletions

View File

@ -1,3 +1,12 @@
2012-01-24 Georg-Johann Lay <avr@gjlay.de>
PR target/49868
* doc/extend.texi (AVR Named Address Spaces): Move sample code up.
Remove note on size/offset limitation.
(AVR Variable Attributes): Add example how to read data located
with progmem. Refer to named address spaces.
* doc/invoke.texi (AVR Options): Fix typo.
2012-01-24 Richard Guenther <rguenther@suse.de>
Forward-port to trunk

View File

@ -1237,9 +1237,10 @@ in order to put read-only data into the flash memory and access that
data by means of the special instructions @code{LPM} or @code{ELPM}
needed to read from flash.
Per default, any data including read-only data is located in RAM so
that address spaces are needed to locate read-only data in flash memory
@emph{and} to generate the right instructions to access the data
Per default, any data including read-only data is located in RAM
(the generic address space) so that non-generic address spaces are
needed to locate read-only data in flash memory
@emph{and} to generate the right instructions to access this data
without using (inline) assembler code.
@table @code
@ -1265,9 +1266,9 @@ address space @code{__pgm@var{N}}.
The compiler will set the @code{RAMPZ} segment register approptiately
before reading data by means of the @code{ELPM} instruction.
On devices with less 64kiB flash segments as indicated by the address
On devices with less 64@tie{}kiB flash segments as indicated by the address
space, the compiler will cut down the segment number to a number the
device actually supports. Counting starts at @code{0}
device actually supports. Counting starts at@tie{}@code{0}
for space @code{__pgm}. For example, if you access address space
@code{__pgm3} on an ATmega128 device with two 64@tie{}kiB flash segments,
the compiler will generate a read from @code{__pgm1}, i.e.@: it
@ -1284,6 +1285,31 @@ with @code{RAMPZ} set according to the high byte of the address.
Objects in this address space will be located in @code{.progmem.data}.
@end table
@b{Example}
@example
char my_read (const __pgm char ** p)
@{
/* p is a pointer to RAM that points to a pointer to flash.
The first indirection of p will read that flash pointer
from RAM and the second indirection reads a char from this
flash address. */
return **p;
@}
/* Locate array[] in flash memory */
const __pgm int array[] = @{ 3, 5, 7, 11, 13, 17, 19 @};
int i = 1;
int main (void)
@{
/* Return 17 by reading from flash memory */
return array[array[i]];
@}
@end example
For each named address space supported by avr-gcc there is an equally
named but uppercase built-in macro defined.
The purpose is to facilitate testing if respective address space
@ -1311,8 +1337,9 @@ int read_i (void)
Notice that attribute @ref{AVR Variable Attributes,@code{progmem}}
locates data in flash but
accesses to these data will be to generic address space, i.e.@: RAM,
so that you need special access functions like @code{pgm_read_byte}
accesses to these data will read from generic address space, i.e.@:
from RAM,
so that you need special accessors like @code{pgm_read_byte}
from @w{@uref{http://nongnu.org/avr-libc/user-manual,avr-libc}}.
@b{Limitations and caveats}
@ -1331,10 +1358,10 @@ you will have to arrange your linker skript to locate the
@code{.progmem@var{N}.data} sections according to your needs.
@item
Any data or pointers to the AVR address spaces spaces must
also be qualified as @code{const}, i.e.@: as read-only data.
Any data or pointers to the non-generic address spaces must
be qualified as @code{const}, i.e.@: as read-only data.
This still applies if the data in one of these address
spaces like software version number or lookup tables are intended to
spaces like software version number or calibration lookup table are intended to
be changed after load time by, say, a boot loader. In this case
the right qualification is @code{const} @code{volatile} so that the compiler
must not optimize away known values or insert them
@ -1349,52 +1376,12 @@ extern const __pgmx char foo;
const __pgmx void *pfoo = &foo;
@end example
The code will throw an assembler warning and the high byte of
@code{pfoo} will be initialized with @code{0}, i.e.@: the
@code{pfoo} will be initialized with@tie{}@code{0}, i.e.@: the
initialization will be as if @code{foo} was located in the first
64@tie{}KiB chunk of flash.
@item
Address arithmetic for the @code{__pgmx} address space is carried out
as 16-bit signed integer arithmetic. This means that in the following
code array positions with offsets @code{idx}@tie{}>@tie{}8191 are
inaccessible.
@example
extern const __pgmx long lookup[];
long read_lookup (unsigned idx)
@{
return lookup[idx];
@}
@end example
@end itemize
@b{Example}
@example
char my_read (const __pgm ** p)
@{
/* p is a pointer to RAM that points to a pointer to flash.
The first indirection of p will read that flash pointer
from RAM and the second indirection reads a char from this
flash address. */
return **p;
@}
/* Locate array[] in flash memory */
const __pgm int array[] = @{ 3, 5, 7, 11, 13, 17, 19 @};
int i = 1;
int main (void)
@{
/* Return 17 by reading from flash memory */
return array[array[i]];
@}
@end example
@subsection M32C Named Address Spaces
@cindex @code{__far} M32C Named Address Spaces
@ -3235,7 +3222,7 @@ is entered like for, e@.g@. task functions in a multi-threading operating
system. In that case, changing the stack pointer register will be
guarded by save/clear/restore of the global interrupt enable flag.
The differences to the @code{naked} function attrubute are:
The differences to the @code{naked} function attribute are:
@itemize @bullet
@item @code{naked} functions do not have a return instruction whereas
@code{OS_main} and @code{OS_task} functions will have a @code{RET} or
@ -4752,13 +4739,32 @@ data in the non-volatile program memory (flash). The @code{progmem}
attribute accomplishes this by putting respective variables into a
section whose name starts with @code{.progmem}.
This attrubute wirks similar to the @code{section} attribute
This attribute works similar to the @code{section} attribute
but adds additional checking. Notice that just like the
@code{section} attribute, @code{progmem} affects the location
of the data but not how this data is accessed.
In order to read data located with the @code{progmem} attribute
(inline) assembler must be used.
@example
/* Use custom macros from @w{@uref{http://nongnu.org/avr-libc/user-manual,avr-libc}} */
#include <avr/pgmspace.h>
/* Locate var in flash memory */
const int var[2] PROGMEM = @{ 1, 2 @};
int read_var (int i)
@{
/* Access var[] by accessor macro from avr/pgmspace.h */
return (int) pgm_read_word (& var[i]);
@}
@end example
AVR is a Harvard architecture processor and data and read-only data
normally resides in the data memory (RAM).
See also the @ref{AVR Named Address Spaces} section for
an alternate way to locate and access data in flash memory.
@end table
@subsection Blackfin Variable Attributes

View File

@ -10973,11 +10973,11 @@ before calling a function and popped afterwards.
Popping the arguments after the function call can be expensive on
AVR so that accumulating the stack space might lead to smaller
executables because areguments need not to be removed from the
executables because arguments need not to be removed from the
stack after such a function call.
This option can lead to reduced code size for functions that get
their arguments on the stack like functions that perform several
This option can lead to reduced code size for functions that perform
several calls to functions which get their arguments on the stack like
calls to printf-like functions.
@item -mbranch-cost=@var{cost}