Re: Statická knihovna (objektový soubor) a vektory přerušeni (reset)
Josef Štengl
ok1ced na nagano.cz
Úterý Srpen 9 16:57:01 CEST 2016
Teď ne, ale možná pomůže někdy v budoucnu. Jestli do té doby nezblbnu úplně.
Zbaběle jsem to vzdal. Po prozkoumání možností linkeru a práce se stacikými knihovnami a experimentování s možným i
nemožným, jsem se rozhodl pro adresář s o soubory. On tam je eště jeden adresář s h soubory, tak je to prakticky jedno.
Pořád je to jedna řádka v makefile.
Nepřemluvil jsem linker, aby dostal objektový soubor s prakticky binárními daty ze statické knihovny do správného chlívku
bez chlívku jinde :-(.
Dne 9.8.2016 v 09:54 Miroslav Mraz napsal(a):
> Tak se mi povedlo to pro gcc zafixovat. Finta je přepínači --whole-archive pro linker. Ten pak znovu prohledá archiv i
> když už má symbol definovaný jako weak. Jenže to vám asi moc nepomůže.
>
> Mrazík
>
> Dne 8.8.2016 v 16:37 Miroslav Mraz napsal(a):
>> Na podobné chování jsem také narazil u gcc a cortex-m. Chtěl jsem udělat
>> knihovnu pro USB device a taky to nechodilo. Už si to moc nepamatuji,
>> ale problém byl, že ty knihovní funkce používaly callback funkce a ty
>> měly definovaný weak alias. Takže linker neviděl použití tt. funkcí a
>> jednoduše je vyházel. A protože nemůžu najít jak jsem to tenkrát
>> vyřešil, je patrné, že jsem to asi vzdal. Takže řešení bych také uvítal.
>>
>> Mrazík
>>
>> Dne 8.8.2016 v 15:29 Josef Štengl napsal(a):
>>> Snažím se vytvořit vrstvu ovladačů nad daným, poměrně komplexním HW.
>>>
>>> Cortext-r (cortex-m to má asi trochu jinak, tam to budu studovat koncem
>>> tohoto týdne a je to jiný problém) má 8 základních vektorů přerušení.
>>> První je reset, jeden SVC (systémový), jeden rezerva, 3 x chybové a
>>> poslední dva jsou vlastně pevné - adresa do RAM s vektory přerušení od
>>> periférií - takže se vektory od periférií dají snadno měnit za běhu
>>> svého programu (aplikace), pokud je to potřeba.
>>>
>>> Takže ten kdo řeší aplikaci, nemusí (a ani nechci - chci vědět kde se to
>>> zbořilo a ne ‚máš to rozbitý‘) aby měnil nebo psal obsluhy na základní
>>> vektory. Vlastně se zabývá jen programem v main() a obsluhou chyb
>>> (většinou ani to ne). Zbytek má schovaný knihovně.
>>>
>>> O přerušení se nestará, jediné co je většinou zajímá je přerušení od
>>> časovače a to ve stylu‚ tuto funkci volej každých xx µs' - a funkce se
>>> zapíše do správného místa v tabulce přerušení v RAM (ta je tam by
>>> design, tak proč ji nevyužít).
>>> Zbytek dostanou s knihovnou.
>>>
>>>
>>> Problém mám vlastně jen s tímto malým kuse kódu v asm, který se má
>>> nahrát na začátek FLASH/RAM (podle jak se přepnou paměti. Je to jedno,
>>> vždycky reset vektor začíná na 0 :-).
>>>
>>> Doufám, že je to pochopitelné, gcc používá mírně odlišnou syntaxi,
>>> kterou si už nevybavuji.
>>>
>>> +++++++++++++++++++++
>>> .sect ".intvecs"
>>> .arm
>>>
>>> ;-------------------------------------------------------------------------------
>>>
>>>
>>> ; import reference for interrupt routines
>>> ;-------------------------------------------------------------------------------
>>>
>>>
>>>
>>> .ref _c_int00
>>> .ref sys_ErrUndefinedIsr
>>> .ref sys_ErrPrefetchError
>>> .ref r4f_PrefetchIsr
>>> .ref r4f_DabortIsr
>>>
>>> ;-------------------------------------------------------------------------------
>>>
>>>
>>> ; interrupt vectors
>>> ;-------------------------------------------------------------------------------
>>>
>>>
>>>
>>> b _c_int00 ; reset interrupt
>>> b sys_ErrUndefinedIsr ; undefined instruction interrupt
>>> svcEntry
>>> b svcEntry ; software interrupt
>>> b sys_ErrPrefetchError ; abort (prefetch) interrupt
>>> b r4f_DabortIsr ; abort (data) interrupt
>>> reservedEntry
>>> b reservedEntry ; reserved
>>> ldr pc,[pc,#-0x1b0] ; IRQ interrupt (VIM table)
>>> ldr pc,[pc,#-0x1b0] ; FIQ interrupt (VIM table)
>>>
>>> +++++++++++++++++++++
>>>
>>> Poslední dva řádky znamenají skok na adresu, kde jsou v RAM uloženy
>>> vektory od přerušení periférií a jsou vždy stejné (kdysi jsem věděl i
>>> proč).
>>>
>>> Pro zbytek mám napsané rutiny, které vyčítají další informace zapisují
>>> se a volají weak funkce podle toho kde nastal problém - aplikace pak
>>> může pak jednoduše zpracovat předpřipravená data a nemusí starat o
>>> implementační detaily dané architektury a patlat se v ASM (na rozdíl od
>>> cortexu-m se nelze zcela vyhnout assembleru, protože se v obsluhách
>>> přistupuje k registrům koprocesoru).
>>>
>>> Aha, jde mi vlastně o to, jestli lze mít ve statické knihovně sekci (zde
>>> ".intvecs"), kterou bude vždy zapisovat.
>>>
>>> Ano máte pravdu, taky jsem se mohl zeptat rovnou. Ale když já tak nějak
>>> nevím, co vlastně chci a jestli je to vůbec možné tak doufám, že mě
>>> někdo nakopne správným směrem. Zatím se vám to daří, jdu pátrat dále :-)
>>>
>>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list