Re: ARM - reentrantní vstup to IRQ rutiny
Petr Labaj
labaj na volny.cz
Pondělí Duben 17 20:31:40 CEST 2017
To je trochu problém.
Potřebuju vždy po 5 průchodech udělat předzpracování přijatých dat.
Těch dat je docela dost, takže si nemůžu moc dovolit příliš natahovat buffer
pro přijatá syrová data.
No a hlavní program pak dělá poměrně náročné zpracování těch
předzpracovaných
dat, včetně dost pomalých trigonometrických funkcí. Pokud bych i to
předzpracování
(které musí být děláno periodicky cca 1000x za sekundu) dal do hlavní
smyčky, tak
bych neustále v průběhu výpočtů musel testovat, jestli už něco přišlo.
Asi by to šlo (něco jako kolaborativní multitasking), ale bylo by to
dost komplikující.
PL
*********************************
Dne 17.4.2017 v 20:14 Milan Kratochvíl napsal(a):
> Zdravím, jen myšlenka, a co ten výpočet dát úplně pryč z přerušení a
> jen si nastavit hodnoty a příznak, pro start výpočtu a příznak pro
> hotový výpočet a v přerušení si už jen vzít výsledky.
>
> Milan
>
> Dne 17.4.2017 v 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
>>
>> _______________________________________________
>> 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