2009-11-04 01:56 AM
GCC and memory regions
2011-05-17 04:28 AM
I would like to declare a large array in internal flash, in a separate part of Flash to my main code.
Relevant part of linker script:Code:
MEMORY { /* These for STM32T6U6, 32K Flash, 10K RAM */ CODE (rx) : ORIGIN = 0x08000000, LENGTH = 0x00006000 FAT_AREA (r) : ORIGIN = 0x08006000, LENGTH = 0x00002000 DATA (rw) : ORIGIN = 0x20000000, LENGTH = 0x00002800 } /* Section Definitions */ SECTIONS { /* Fixed area in flash to hold internal filesystem .fat : { *(.fat) } >FAT_AREA /* first section is .text which is used for code */ .text : { ...... Relevant C codeCode:
u8 fat_memory_region __attribute__ ((section (''fat''))) = 0; int main(void) { ... init stuff ... uart_putint((int)&fat_memory_region); //Dump address of variable ... I expect to get 0x08006000 output, yet I get 0x200005cc. This tells me that my variable is being put in RAM along with the rest, i.e. my direction to place it in FAT_AREA is being ignored somewhere. Anybody know where the problem is? Tools are GCC (Anglia IDEaliST) Thanks, Chris.2011-05-17 04:28 AM
two things,
firstly that declaration probably wants to be const and volatile: const vu8 __attribute__((section(''.myflashsection''))) SomeArray[2048]; (which sounds strange at first, but makes sense when you look at their definitions) secondly, your special section of flash should be inside code, not after it (and within the .text section of code). so in your .ld file, go down to SECTIONS { .text { and immediately after CREATE_OBJECT_SYMBOLS put in: KEEP(*(.myflashsection)) . = ALIGN(4096); this should give you 4k of .myflashsection (or 8k, 12k, 16k etc if you leak over by a byte or more), although it will be the first 4k of flash, and your code will be after it. if you find out how to put your code before and your special section after, then please post the results in this thread. There's a page on the web somewhere with more info on .ld, keep, align, etc. Paul. [ This message was edited by: paul.smitton on 30-10-2009 09:23 ]2011-05-17 04:28 AM
Thanks for your comments. There's a subtle difference between what you suggest and what I'm trying to do. And that is that your suggestion allocates an area 'in-line' with the code. I want it to be a separate area.
I have fixed it, and it was a stuuuuuuupid mistake. Check out the comment '/* Fixed area in flash to hold internal filesystem ' Observe the missing closing */ If I put that in, it works just as I expect!!! DOH! :( Chris. P.S. Final syntax is: Linker:Code:
MEMORY { /* These for STM32T6U6, 32K Flash, 10K RAM */ CODE (rx) : ORIGIN = 0x08000000, LENGTH = 0x00006000 FAT_AREA (r) : ORIGIN = 0x08006000, LENGTH = 0x00002000 DATA (rw) : ORIGIN = 0x20000000, LENGTH = 0x00002800 } /* Section Definitions */ SECTIONS { /* Fixed area in flash to hold internal filesystem */ .fat : { *(.fat) } >FAT_AREA /* first section is .text which is used for code */ ... and source:Code:
u8 fat_memory_region[512] __attribute__ ((section (''.fat''))) = {0};