Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: ram initialization at reset

2006-03-07 by Guillermo Prandi

Excellent walkthrough, Tom!

I don't get why you're recommending this:

>> in the linker script, place a new section AFTER the bss.
>> You want to avoid placing this in front of "__bss_end__ = . ;"!

I would have put it *before*, and I can't think of a reason not to do 
so (not that putting it after would be harmful).

Guille

--- In lpc2000@yahoogroups.com, Tom Walsh <tom@...> wrote:
>
> ebarker123 wrote:
> 
> >Here is the scenario.
> >
> >I have an MCB2138 eval board. I have a menu talking on a serial 
port.
> >
> >Using the menu, I can set and print a variable called 'mytemp'.
> >
> >I set the value to say, 456, and print that out.
> >
> >I press reset and the value is changed to 0. 
> >Where/How is this variable getting changed. My application requires
> >that we be able to press reset, and the SRAM contents not change.
> >
> >  
> >
> Look in your crt0.s file, bss sections are zeroed there.  'bss' 
data is 
> data which you declared globally and did not provide a value for.  
*ALL* 
> C code systems initialize the bss data section, all, this is a 
> requirement of the C language.
> 
> If you want to create memory which is part of the code but is not 
> initialized, add a section attribute to it and then place the 
section 
> into the linker ld script.  For example:
> 
> char myString [8] __attribute__((section ("noinit")));
> 
> in the linker script, place a new section AFTER the bss.  You want 
to 
> avoid placing this in front of "__bss_end__ = . ;"!
> 
> ================= begin LPC2106ROM.ld ===============
>   /* .bss section which is used for uninitialized data */
>   .bss (NOLOAD) :
>   {
>     __bss_start = . ;
>     __bss_start__ = . ;
>     *(.bss)
>     *(COMMON)
>     . = ALIGN(4);
>   } > RAM
> 
>   . = ALIGN(4);
>   __bss_end__ = . ;
>   PROVIDE (__bss_end = .);
> 
>    .myvars (NOLOAD) :
>    {
>     *(noinit)
>    } > RAM
> 
>   .stack ALIGN(256) :
>   {
>     . += STACK_SIZE;
>     PROVIDE (_stack = .);
>   } > RAM
> 
>   _end = . ;
>   PROVIDE (end = .);
> 
> ================== snip ====================
> 
> Note the new region called ".myvars" in the script?  That is where 
I 
> will put the "noinit" section.
> 
> To make sure that all is well, look at the symbol file produced by 
the 
> linker.  In my case it is main2106.sym, in it I look at the memory 
> location of '__bss_end__' and 'myString'.  Here is a snippet of my 
> symbols file:
> 
> ============= begin main2106.sym ===============
> 400092e2 B serial1ParityMode
> 400092e4 B tx1Buffer
> 40009ae8 B Words
> 40009dec B WordCnt
> 40009df0 A __bss_end__
> 40009df0 B myString
> 4000ae00 A end
> 4000ae00 A _end
> 4000ae00 B _stack
> 
> ================= snip =====================
> 
> Actually, that is the very end of the symbol file.  The variable 
> myString is placed at the end of the RAM.   Adding more data to 
this new 
> section is quite easy now, simply assign the same attribute to each:
> 
> char myString [8] __attribute__((section ("noinit")));
> 
> struct BIG_DATA abort_info  __attribute__((section ("noinit")));
> 
> int timeAborted __attribute__((section ("noinit")));
> 
> ...
> 
> Hope this helps,
> 
> TomW
> 
> 
> 
> 
> -- 
> Tom Walsh - WN3L - Embedded Systems Consultant
> http://openhardware.net, http://cyberiansoftware.com
> "Windows? No thanks, I have work to do..."
> ----------------------------------------------------
>

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.