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