ARM - reentrantní vstup to IRQ rutiny

Hynek Sladky econf na centrum.cz
Úterý Duben 18 10:49:10 CEST 2017


Pro tento ucel by se dalo pouzit PendSV preruseni. Musi se mu nastavit 
nizka priorita pres SCB->SHPR registry. Neni vazane na zadnou HW funkci 
a neda se spustit jinak nez nastavenim bitu SCB->ICSR.PENDSVSET. V 
manualech se toto preruseni zminuje jako systemove pro prepinani 
kontextu u RTOS. Tak pokud neni pouzity...

Podstrceni falesne adresy by asi bylo mozne, ale obnaselo by to docela 
dost peclive naprogramovani, protoze by to vyzadovalo ulozeni registru 
nekterych pred volanim funkce a pak jejich obnoveni - interrupt to dela 
automaticky a pri volani ve funkci se o to postara prekladac. Tady by se 
o to musel postarat programator v assembleru.


Hynek Sladky




Dne 17.4.2017 19:57, Petr Labaj napsal(a):
> Já vím, je to prasárna, takže bych to měl asi napsat, že "jeden známý 
> se ptá". ;-)
>
> Potřeboval bych zajistit reentrantní vstup do přerušovací rutiny. Tj. 
> obsloužit dané
> přerušení ještě v době trvání předchozí obsluhy téhož přerušení.
> Jde o Cortex M3, konkrétně o nějaký STM32F1 až 4.
>
> Situace: nějaké přerušení je voláno cca 4000x za sekundu. Běžně se za 
> tu dobu
> spolehlivě obslouží, ale při každém 5. zavolání bych potřeboval udělat 
> delší výpočet,
> který může přesáhnout dobu 1/4000 sekundy. Spolehlivě se ale provede 
> do doby
> dalšího takového 5. přerušení, takže nějaké přetečení stacku 
> reentrancí nehrozí.
>
> Jestli správně chápu přerušovací mechanismy u Cortexu M, tak ukončení 
> přerušení
> a tedy možnost dalšího vstupu do IRQ rutiny je možné až po instrukci 
> RET (neboli BX).
>
> Vidím 3 možnosti, jak to oblbnout, ale ani jedna není ideální:
> - Nacpat na stack adresu třeba sebe sama a udělat falešný RET. A 
> doufat, že to
>   nenarazí na nějaké cachování zápisu do RAM nebo jiný zádrhel.
> - Dynamicky v rámci té rutiny zvýšit přioritu toho přerušení, takže 
> další požadavek
>   na stejné IRQ již bude mít vyšší prioritu a bude přijat. Tohle by se 
> mi líbilo, ale
>   nevím, jestli se to zvýšení priority promítne okamžitě.
> - Z IRQ rutiny naplánovat nějaké přerušení s nízkou prioritou od jiné 
> periferie,
>   to se uplatní hned po opuštění aktuální obsluhy IRQ. Pokud nenajdu 
> nic lepšího,
>   tak to asi nakonec dopadne takhle.
>
> Žádná z variant mi nepřijde moc sexy.
> Nemáte někdo tip na nějaký mechanismus, který by byl elegantnější? Třeba
> jestli nějak nejde násilně na NVIC jako-že-ukončit obsluhu přerušení, 
> aby si
> NVIC myslel, že může přijmout další stejné IRQ?
>
> Děkuji za případné tipy.
> PL
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20170418/2c52420f/attachment.html>


Další informace o konferenci Hw-list