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