I'm using Reva v2.10 with RIDE (BN747) and an STR912FAW44X6. For my project i need to store parameter und structures in the flash, it should be possible to change the values so that they are persistent in flash. My program code is in flashbank0. flashbank1 (32kB) is reserved for another task of my project. My purpose is to write and erase an area in flashbank0 from my execution code which is in same bank. For this i need a function executed in ram, i know. I have adapted the linker scripts for my requirements.
memory mapping >>>
Code:
MEMORY
{
FLASH (rx) : ORIGIN = 0, LENGTH = 448K
USERSPACE (xrw) : ORIGIN = 0x00070000, LENGTH = 64K /*space between 448 - 512 KB in FLASH bank0*/
FLASHB1 (rw) : ORIGIN = 0x00080000, LENGTH = 32K
EXTMEMB0 (rx) : ORIGIN = 0x30000000, LENGTH = 64M
EXTMEMB1 (rx) : ORIGIN = 0x34000000, LENGTH = 64M
EXTMEMB2 (rx) : ORIGIN = 0x38000000, LENGTH = 64M
EXTMEMB3 (rx) : ORIGIN = 0x3C000000, LENGTH = 64M
RAM (xrw) : ORIGIN = 0x50000000, LENGTH = 96K
}
this is for my USERSPACE section >>>
Code:
.usertext :
{
. = ALIGN(4);
*(.usertext)
. = ALIGN(4);
} >USERSPACE
for example to use this : int __attribute__((section(''.usertext''))) flash_var;
for my ram function i have adapted the .data section in this way >>>
Code:
.data : AT ( _sidata )
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_sdata = . ;
*(.data)
*(.data.*)
. = ALIGN(4);
*(.gnu.linkonce.d*)
*(.fastrun) /* !!!! ''RAM-Function'' example */
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_edata = . ;
} >RAM
example of function declaration:__attribute__((section(''.fastrun''))) void FMI_BANK0_Write(void)
But when i want to run my program code, the linker reports an error like
section.data[000037fc -> 00003a37] overlaps section .fastrun [000037fc -> 00003867]
I'm not an expert in view of linker syntax, but i don't understand why the .fastrun section is located in adresses which belongs to the flash (000037fc...). Maybe there is a simple mistake i made. Hope anyone can help me.
thanks a lot in advance...
best regards
T.Dittrich
Posted on May 17, 2011 at 09:48
I did not find that link helpful. Perhaps I didn't understand it. The Keil uVision kit provides a nice example of running function from ram. It is small and easy to understand. So I'm starting there.
What I would like is an example program of how to write (and rewrite) data to some area of flash (say Bank 0 Sector 3), that is persistent between resets.
For example: user sends data over serial port. data is stored to flash. User powers down processor. 3 days later processor is powered up. Data is read from flash. Repeat.
If anyone has an example it would be very much appreciated.
Posted on May 17, 2011 at 09:48
FYI: I am using the Keil uVision IDE and Realview ARM toolchain.
I think the basic problem is something like:
1. Reserve a sector of flash in bank 0
2. inform the linker that this is for data
3. create methods that executes from RAM that read and write to this reserved sector.
This should be a simple problem to solve. I think it is mostly a problem of configuration.
Anyone have a small sample to do this that they would like to share?