2014-09-09 12:26 AM
Hi,
The MAP file shows the variables declared in some hap hazard way. Is there any option in the compiler to make the variable appear sequentially in the MAP file as these variables are declared in the main file. I am working on STM32F103ZE using keil MDK-ARM. Best regards, Nick.2014-09-09 01:41 AM
I don't know about MDK-ARM, but there can be good reasons not to store them in the order they are declared.
The case I have in mind are where the variables are of different types. Some types (e.g. int and long) are most efficient on a 4-byte boundary. If you declare a one-byte ''char'' type between two longs, then the compiler would have to add (i.e. waste) 3 bytes of padding to keep everything in the order you specified.One thought: What about if you put all of these variables into a big struct - I think the compiler isn't supposed to reorder them then.Hope this helps,Danish2014-09-09 05:09 AM
In general it's not a desirable feature to have variables assigned in the order of declaration. It's the compiler's job to optimize storage by combining like types to maintain alignment (all longs, all shorts, all chars). This makes a difference in stack size when allocating from the stack during a procedure call.
Depending on what toolchain you use you can assign globals to specific sections to group them together. I do this with GCC to create a block of field modified configuration parameters that are saved in flash but copied to RAM on a reset. Here's a GCC example:#if __SNMP_H_
// SNMP identification strings, only used if TCP/Ip and SNMP protocol enabled
unsigned char __attribute__ ((section(''.infomem''))) Community[6] = ''public'';
unsigned char __attribute__ ((section(''.infomem''))) TrapComm[6] = ''traps'';
unsigned char __attribute__ ((section(''.infomem''))) Contact[32] = ''Jack Peacock'';
unsigned char __attribute__ ((section(''.infomem''))) Domain[64] = ''engineering.local'';
unsigned char __attribute__ ((section(''.infomem''))) Node[64] = ''DuoMini'';
unsigned char __attribute__ ((section(''.infomem''))) Location[32] = ''Engineering'';
#endif
The attribute and section keywords group all the globals into one memory section which can be placed by the linker:
/* Configuration parameter defaults
INFOMEM is initialized from FLASH when no saved parameters are available. The
FLASH image is copied to INFOMEM in SRAM1 inside the application. */
.infomem : AT (_sfdata)
{
. = ALIGN(4); /* word align, follows runtime init */
_sinfo = .; /* start working configuration parameters */
*(.infomem*) /* default field parameters */
. = ALIGN(4); /* word align for fast init */
_einfo = .; /* end working config parameters */
} > SRAM1
The section is mapped to a specific area of SRAM with some linker defined globals to mark the address so the program knows where the section is located.
Jack Peacock
2014-09-09 12:23 PM
Is there any option in the compiler to make the variable appear sequentially in the MAP file as these variables are declared in the main file.
Why would you want to do that? What do you hope to achieve by it?2014-09-09 01:02 PM
Collecting them in a structure (object) or section/segment seems to make the most sense if you want them grouped together for whatever purposes. Presumably a debug view of memory.