Hali,
Szeretnek egy valtozot egy fix abszolut cimre tenni, a nehezites, hogy kizarolag a linker filebol, tehat a forrast (.c) nem akarom modositani (szoval pont a
int myvar __attribute__((section(".mySection")))
jellegu, a forrashoz hozzaadott dolgokat szertnem kikuszobolni).
Az architekture Cortex M4, de felteszem ez nagyjabol lenyegtelen.
A dolog hattererol: van egy (konstans) tomboket, stukturakat, ezek egymasbaagyazasat tartalmazo kod es a forras generalva van, kulso eszkozzel - ezek a valtozok alapbol az applikacioba fordulnak (linkelodnek) bele, de ki kellene szervezni egy masik memoriacimre (egy file-ban van minden, amit az applikaciotol fuggetlenul kellene kezelni).
Az a resze mar megvan, hogy az egesz file egy megadott cimre kerul, viszont van egy "fo" valtozo (minden mas onnan indul). Viszont most az, hogy ez a valtozo hova kerul a szekcion belul, az a tobbi valtozo meretetol fugg (tehat kb. random). Ennek kellene fixhelyre kerulni, hogy az applikaco akkor is elerje, ha ez ezek a tombok, strukturak, etc. valtoznak.
Ezek a tombok, egyebek konstansok, szoval mindenkepp a flashbe kerulnek, csak ha nem specifikalom kulon, akkor egybe lesznek linkelve az alkalmazassal, nekem viszont egy kijelolt regioban kellene, hogy legyenek.
Nem tudom mennyire sikerult erthetoen fogalmaznom, ha kell, szivesen pontositok rajta.
Koszi
Vegulis csinaltam meg egy szekciot es a "fo" tombot attettem ebbe masik szekcioba, ahol csak az van, igy a cime fixalodott - meg nem probaltam ki, de eddig hasznalhatonak tunik.
Koszi mindenkinek az otleteket!
- 383 megtekintés
Hozzászólások
Attol felek hogy ezt nem uszod meg :( Nekem is tele vannak ilyenekkel a programjaim, mindenhol igy kell csinalom :/ Sot, Neha tobb section-ra is felosztom a rom-ot, szoval "megdurvabb", ha ugy vesszuk:
MEMORY
{
rom (rx) : ORIGIN = 0x08000000, LENGTH = 14K
cfg (r) : ORIGIN = 0x08003800, LENGTH = 2K
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 16K
}
SECTIONS
{
[...]
.config :
{ *(.config)
} > cfg
[...]
}
Es a C hivatkozas:
grb_config flash_gc __attribute__ ((section(".config"))) =
{ .gc_route_table =
{ { TX_IFACE_NONE,0 }, /* 0 */
{ TX_IFACE_RS485, 1 }, /* 1 */
[...]
}
};
Masik megoldas lehet hogy linker scriptben definialsz szimbolumokat, amikor az adott szegmenst feltoltod, es akkor azt hivatkozod meg extern-kent a C kodban. Ilyeneket csak startup-kodban szoktam hasznalni de vegulis semmi nem tiltja hogy barmi mast helyezz oda a megfelelo operatorok (ertekadas, align, stb) hasznalataval - vagy akar igy a fentiekhez hasonloan onallo szegmenskent. Akkor is bele kell nyulnod a C-be, sajnos, de kihivatkozhatsz siman extern-kent. Pelda a BSS linker szkript:
MEMORY
{
rom (rx) : ORIGIN = 0x08000000, LENGTH = 14K
cfg (r) : ORIGIN = 0x08003800, LENGTH = 2K
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 16K
}
SECTION
{
[...]
.bss :
{ __bss_start = .;
*(.bss)
*(COMMON)
. = ALIGN(4);
__bss_end = .;
} >ram
[...]
}
Es a hozza tartozo crt-kod:
extern uint32_t __bss_start;
extern uint32_t __bss_end;
void __attribute__ (( naked )) _startup(void)
{
uint32_t * bss_start_p = &__bss_start;
uint32_t * bss_end_p = &__bss_end;
[...]
while ( bss_start_p != bss_end_p )
{ *bss_start_p = 0;
bss_start_p++;
}
[...]
main();
while(1);
}
Itt ugye arra kell figyelned hogy a linker szkript logikaja szerint ezek a szimbolumok inkabb "pointer-szeru" valamikent viselkednek, de valojaban nem azok. Igy egy indirekcios szintet le kell venned. Lasd fent, _startup() legeleje.
Ezek itten fentebb mind Cortex-M0 kodok... De ez a resze Cortex-M4-ben ugyanaz. Legalabb ennyi :)
- A hozzászóláshoz be kell jelentkezni
Bár írtad, hogy a C forrást nem akarod módosítani, én externként veszem fel, symbol fileban listázva vannak a címek és ezt a file-t használom linkelésnél. Ha érdekel ez a megoldás, leírom.
- A hozzászóláshoz be kell jelentkezni