Interni pameti AM3358

Pavel Hudeček edizon na seznam.cz
Pátek Květen 15 17:34:47 CEST 2015


Je to kap. 2.1 ARM Cortex-A8 Memory Map.
Tučná ROM by měla být na adrese 0x40000000 s délkou 128+48 kB

Tak díky Davidovi jsem se podíval do cmd od bootloaderu a tam ty RAMky mají deklarované dohromady jako jednu o velikosti 127 kB. Tím méně je mi pak jasné, proč v tom DS rozlišují "SRAM internal" a "L3 OCMC0".

A aby to bylo zajímavější, tak Demo ve Starterwaru zase hned ze začátku vezme data z DDR a hodí do té "SRAM internal". Potom ovšem neudělá nic dalšího, co by tam převedlo běh programu.

Takže napřed je tu boot.cmd:

-stack  0x0008                             /* SOFTWARE STACK SIZE           */
-heap   0x2000                             /* HEAP AREA SIZE                */
-e Entry
--diag_suppress=10063

MEMORY {
        IRAM_MEM        : org = 0x402F0400  len = 0x1FBFF            /* RAM */
}

SECTIONS {
    .init    : {
                 bl_init.obj (.text)
               } load > 0x402F0400

    .text    : load > IRAM_MEM              /* CODE                         */
    .data    : load > IRAM_MEM              /* INITIALIZED GLOBAL AND STATIC VARIABLES. */
    .bss     : load > IRAM_MEM              /* UNINITIALIZED OR ZERO INITIALIZED */
                                            /* GLOBAL & STATIC VARIABLES.   */
                    RUN_START(bss_start)
                    RUN_END(bss_end)
    .const   : load > IRAM_MEM              /* GLOBAL CONSTANTS             */
    .cinit   : load > IRAM_MEM
    .stack   : load > 0x4030FFF0            /* SOFTWARE SYSTEM STACK        */
}
---------------------------
Pak bootloader a main v něm na závěr udělá:

appEntry = (void (*)(void)) 0x80000000;
(*appEntry)();

---------------------------
Nyní přichází na řadu demo.cmd:

-stack  0x0008                             /* SOFTWARE STACK SIZE           */
-heap   0x2000                             /* HEAP AREA SIZE                */
-e Entry
--diag_suppress=10063

MEMORY {
        INT_MEM        : org = 0x40300000  len = 0x000FFFF           /* RAM */
        DDR_MEM        : org = 0x80000000  len = 0x7FFFFFF           /* RAM */
}

SECTIONS {
    .text:Entry : load > 0x80000000

    GROUP {
         IRAM_CODE : { }
         IRAM_DATA : { }
    }load=DDR_MEM, run=INT_MEM, START(iram_start), SIZE(iram_size), RUN_START(relocstart)

    .text    : load > DDR_MEM              /* CODE                          */
    .data    : load > DDR_MEM              /* INITIALIZED GLOBAL AND STATIC VARIABLES */
    .bss     : type = NOLOAD               /* UNINITIALIZED OR ZERO INITIAILZED */
                                           /* GLOBAL AND STATIC VARIABLES  */
                    RUN_START(bss_start)
                    RUN_END(bss_end)
    .const   : load > DDR_MEM              /* GLOBAL CONSTANTS              */
    .stack   : load > 0x87FFFFF0           /* SOFTWARE SYSTEM STACK         */
}
Zde mě poněkud překvapil -stack  0x0008: Není to málo?
V mém projektu jsem to změnil na 10485760 a .stack:load jsem změnil na 0x90000000-10485760-8 (bez těch -8 byl kupodivu error) a heap jsem zvětšil na 104857600, tedy 100M (mám 256 MB DDR)
---------------------------
A pak je main v demoMain.c a v něm:

/* Relocate the required section to internal RAM */
memcpy((void *)(&relocstart), (const void *)(&iram_start), (unsigned int)(&iram_size));

---------------------------
Ale pak prostě main pokračuje dál a nikde nic, co by předalo řízení do té INT_MEM. Jsem z toho zmaten.

PH

Od: Jan Waclawek 
Tu je tucna ROM z ktorej to bootuje (mimochodom, pripojena rovnako ako ta
"SRAM internal". Este by ma neprekvapilo, kebyze je v tej internej SRAM
umiestnovany stack.

PS. u datasheetov je dobrym zvykom uvadzat reviziu a neodkazovat sa na
cisla stran ale na mena kapitol, tabuliek apod. - ja tu mam spruh73K, a na
str.168 akurat konci obsah.

----- Original Message ---------------
>Jestli se nemylim, tak ta interni RAM se pouziva k nahrani a spusteni
>sekundarniho bootloaderu. Ten teprve inicializuje DDR, nahrava
>(...dlouhou baremetal) aplikaci do DDR a pak ji spousti.
>.d.
>
>Pavel Hudeček  writes:
>> V DS od AM3358 (konkrétně ve spruh73 na straně 168) jsou  v Memory map uvedeny:
>>
>> SRAM internal 402F0400-402FFFFF
>> L3 OCMC0     40300000-4030_FFFF
>>
>> Logicky bych očekával, ľe první poloľka je normální RAM pro běľné pouľití a s tím druhým to bude nějaké jiné. Ale ve Starterwaru mají cmd, ve kterém je:
>>
>> MEMORY {
>>    INT_MEM: org = 0x40300000  len = 0x000FFFF           /* RAM */
>>    DDR_MEM: org = 0x80000000  len = 0x7FFFFFF           /* RAM */
>> }
>> a o té první nic
>>
>> Kdyľ udělám nový projekt, je v něm AM3358.cmd a ten obsahuje:
>>     SRAM:     o = 0x402F0400  l = 0x0000FC00  /* 64kB internal SRAM */
>>     L3OCMC0:  o = 0x40300000  l = 0x00010000  /* 64kB L3 OCMC SRAM */
>>     M3SHUMEM: o = 0x44D00000  l = 0x00004000  /* 16kB M3 Shared Unified Code Space */
>>     M3SHDMEM: o = 0x44D80000  l = 0x00002000  /* 8kB M3 Shared Data Memory */
>>     DDR0:     o = 0x80000000  l = 0x40000000  /* 1GB external DDR Bank 0 */
>>
>> a dále v SECTIONS vąe vyuľívá L3OCMC0
>>
>> Jak to s tím tedy je? K čemu slouľí ta "SRAM internal"?


Další informace o konferenci Hw-list