Problems in boot_card() with configuration

Gedare Bloom gedare at rtems.org
Thu Feb 14 20:19:14 UTC 2013


On Thu, Feb 14, 2013 at 2:57 PM, Matthew J Fletcher <amimjf at gmail.com> wrote:
>
>
> On 14/02/13 19:16, Joel Sherrill wrote:
>> On 2/14/2013 1:09 PM, Matthew J Fletcher wrote:
>>> Hi,
>>>
>>> I am using RTEMS 4.10.2, and a custom BSP based on the ARM rtl22xx.
>>>
>>> I am running through the asm startup ok and calling into boot_card(),
>>> stepping through its all working fine, work_area_start, work_area_size,
>>> heap_start and heap_size are setup as i expect from my linkscript.
>>>
>>> But the test of "work_area_size <= Configuration.work_space_size" fails
>>> because Configuration.work_space_size looks like 0xfffffff, the only
>>> place that assigns to Configuration.work_space_size is a few lines
>>> further down.
>>>
>>> Does this code presume that the BSP has set the Configuration structure
>>> to zero, or the whole memory ? even so the aforementioned test seems odd
>>> as its just testing memory has been initialised.
>>>
>>> Or am i missing some RTEMS initialisation call that needs to be done
>>> before boot_card() ?
>> No but there may be some basic C language assumptions not
>> being met. Configuration is in the .data section and that value
>> does not look like it was initialized to.
>>
>> Is your download correct?
>
> Pretty sure, its via JTAG, am less sure about the .data section. The
> rtl22xx specific start.s only seems to zero the bss
>
>         ldr     r1, =_bss_end_
>         ldr     r0, =_bss_start_
>
> _bss_init:
>         mov     r2, #0
>         cmp     r0, r1
>         strlot  r2, [r0], #4
>         blo     _bss_init        /* loop while r0 < r1 */
>
> I did think that was a bit remiss so in my of asm startup i do
>
>         ldr   r1,=_etext                // -> ROM data start
>         ldr   r2,=_data                 // -> data start
>         ldr   r3,=_edata                // -> end of data
> loop_a: ldr   r0,[r1]
>                 str   r0,[r2]
>                 add   r1,#4
>                 add   r2,#4
>                 cmp   r2,r3                     // check if data to move
>         blo   loop_a                    // loop until done
>
I don't think you want to do this.. it looks like you are initializing
your .data section to zero. But .data stores the program's already
initialized data including precomputed fields.

> and in my custom linkerscript i define
>
>   /* .data section which is used for initialized data */
>   .data : AT (_etext)
>   {
>     _data = .;
>     *(.data)
>   } > RAM
>
>   . = ALIGN(4);
>   _edata = . ;
>   PROVIDE (edata = .);
>
> but the rtl22xx linkerscript it does
>
>   .data :
>   {
>     *(.data)
>     *(.data.*)
>     *(.gnu.linkonce.d*)
>     *(.jcr)
>     SORT(CONSTRUCTORS)
>     _edata = .;
>   } > sdram
>
> i am not overly interested in C++ constructors but i guess the
> *(.data.*) is additional linker magic for gcc4, my previous usage of
> this linkerscript was gcc3.
>
>
>
>
>
>>>
>>> - Matthew
>>> _______________________________________________
>>> rtems-users mailing list
>>> rtems-users at rtems.org
>>> http://www.rtems.org/mailman/listinfo/rtems-users
>>
>>
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-users



More information about the users mailing list