Re: Statická knihovna (objektový soubor) a vektory přerušeni (reset)

Josef Štengl ok1ced na nagano.cz
Pondělí Srpen 8 15:29:45 CEST 2016


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 :-)


Dne 8.8.2016 v 14:19 Petr Labaj napsal(a):
> Mrzí mě, že jsem Váš příspěvek asi nepochopil, protože to zřejmě může být zajímavé téma.
> Hlavně jsem nepobral to kolem vektorů.
> Vy píšete knihovnu, kterou někdo přilepí do svého programu. Pak přece vektory řeší on
> ve svém programu, ne?
>
> Já všechny své projekty mám dělané tak, že znovupoužitelné věci dávám do knihoven
> a překládám pak vždy jen hlavní program.
> Ale to je tak jednoduché, že na to byste se zrovna Vy určitě neptal. Proto by mě hodně
> zajímalo, jak jste to vlastně myslel.
>
> PL
>
> ************************************
>
> Dne 8.8.2016 v 11:23 Josef Štengl napsal(a):
>> Ahoj,
>>   neřešil někdo (nebo neví co mám vlastně hledat) jak vytvořit statickou knihovnu objektů včetně nastavení základních
>> vektorů přerušení (reset), která by šla jen jednoduše přilinkovat/připojit k projektu jako jeden další soubor?
>>
>> O co jde. Vytvářím spodek pro jednočip (ARM) aby to motoráři nemuseli pořád překládat
>>
>> Vytvořil jsem statickou knihovnu (pomocí ar) ale pak se do paměti nezapisují vektory přerušení jako reset, abort a
>> podobně. Usoudil jsem, že je to pro knihovny tak nějak logické, protože vektory přerušení jaksi nikdo nevolá.
>>
>> Zkusil jsem vytvořit jeden objekt a nezdařilo se. Použitý překladač (od TI) jaksi vyváří pro každý soubor jeden objekt a
>> když jsem vytvořil relokovatelný objekt, tak jsem sice byl úspěšný, ale nešlo to pak slikovat s aplikací - hlásilo to,
>> že to nemůže najít použité objekty.
>>
>> Co funguje, je vytvořit knihovnu (vlastně archiv), z ní vyjmout objekt s vektory přerušení a při linkování to pak
>> slinkovat všechno dohromady - zvlášť knihovnu pomocí -l + objekt s vektory + zbytek objektů (aplikaci)
>>
>> Nemá někdo nějaký nápad, jak vytvořit pouze jeden objektový soubor?
>>
>>
>> Díky za každou radu.
>
> _______________________________________________
> 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