Difference between revisions of "How to use Linker-generated symbols"

From SEGGER Wiki
Jump to: navigation, search
(Created page with "This article will explain how to use linker generated symbol in the right way. Linker-generated symbols are actually pointers / arrays at the address instead of integers with...")
 
m
 
Line 27: Line 27:
 
_Print((unsigned int)__FLASH_segment_used_start__, (unsigned int)__FLASH_segment_used_end__, (unsigned int)__FLASH_segment_used_size__);
 
_Print((unsigned int)__FLASH_segment_used_start__, (unsigned int)__FLASH_segment_used_end__, (unsigned int)__FLASH_segment_used_size__);
 
}
 
}
  +
</source>
   
  +
'''Note:'''
 
  +
Linker-generated symbols should always be defined as char/byte arrays and can then be cast or converted to integers.
</source>
 
  +
Other types, such as integer arrays, may lead to unexpected behavior due to compiler optimizations based on the type information.

Latest revision as of 15:21, 15 February 2024

This article will explain how to use linker generated symbol in the right way.

Linker-generated symbols are actually pointers / arrays at the address instead of integers with the address as value.

As such its use might be a bit different and unusual.


The following code snippet shows a example of using Linker-generated symbols:

extern unsigned char __FLASH_segment_start__[];
extern unsigned char __FLASH_segment_end__[];
extern unsigned char __FLASH_segment_size__[];

extern unsigned char __FLASH_segment_used_start__[];
extern unsigned char __FLASH_segment_used_end__[];
extern unsigned char __FLASH_segment_used_size__[];

static void _Print(unsigned int Start, unsigned int End, unsigned int Size) {
 printf("  0x%.8X - 0x%.8X, size: %u\n", Start, End, Size);
}

int main(void) {
 printf("Flash:\n");
 _Print((unsigned int)__FLASH_segment_start__, (unsigned int)__FLASH_segment_end__, (unsigned int)__FLASH_segment_size__);
 printf("Used:\n");
 _Print((unsigned int)__FLASH_segment_used_start__, (unsigned int)__FLASH_segment_used_end__, (unsigned int)__FLASH_segment_used_size__);
}

Note: Linker-generated symbols should always be defined as char/byte arrays and can then be cast or converted to integers. Other types, such as integer arrays, may lead to unexpected behavior due to compiler optimizations based on the type information.