Do nobody knows how to run code from ram? (Using RIDE from raisonance) I have read a lot about the attribute ''__ramfunc'', but i think it's a functionality which is implementet in IAR workbench only...i'm right?
Posted on May 17, 2011 at 09:48hi, 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 >>>
.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 = . ; } >RAMexample 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]map report from linker >>>
0x000037fc FMI_BANK0_Write .data 0x50000000 0x23c load address 0x000037fc 0x50000000 . = ALIGN (0x4) 0x50000000 _sdata = . *(.data) .data 0x50000000 0x4 e:/torsten dittrich/raisonance_st9/scpi_arm/main.o 0x50000000 str_pt .data 0x50000004 0x1a4 e:/torsten dittrich/raisonance_st9/scpi_arm/para.o 0x50000004 para_table .data 0x500001a8 0x90 e:/torsten dittrich/raisonance_st9/scpi_arm/scpi.o 0x500001a8 cmd1_table .data 0x50000238 0x4 /cygdrive/c/programme/gnuarm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(ctype_.o) 0x50000238 __ctype_ptr *(.data.*) 0x5000023c . = ALIGN (0x4) 0x5000023c _edata = .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
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.
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? Is Mirou still around? ;)