ARM - reentrantní vstup to IRQ rutiny

Petr Labaj labaj na volny.cz
Pondělí Duben 17 19:57:29 CEST 2017


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ší informace o konferenci Hw-list