Re: ARM - reentrantní vstup to IRQ rutiny

Petr Labaj labaj na volny.cz
Úterý Duben 18 16:15:22 CEST 2017


Děkuji za informaci.
O existenci PendSV jsem nevěděl a tedy nikdy ani neřešil.
Takže je to další cesta, jak dosáhnout téhož. Vypadá to, že by to mělo 
fungovat
úplně stejně jako vygenerování simulovaného HW přerušení přes NVIC, dokonce
snad i latence bude stejná.
Přes to NVIC to má výhodu v tom, že se jich dá udělat víc, ale zase se 
musí obětovat
vektor nějaké nepoužívané periferie.

Vzhledem k tomu, že to SW generování přerušení s nízkou prioritou 
funguje opravdu
dobře (ať už přes NVIC nebo pomocí PendSV), tak jsem ty čuňárny typu 
modifikace
zásobníku atd. vypustil z rozhodování.

Díky za osvětu.
PL

******************************

Dne 18.4.2017 v 10:49 Hynek Sladky napsal(a):
> 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ší informace o konferenci Hw-list