<html>
<head>
<meta content="text/html; charset=ISO-8859-2"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<font face="Helvetica, Arial, sans-serif">Pro tento ucel by se dalo
pouzit PendSV preruseni. </font><font face="Helvetica, Arial,
sans-serif">Musi se mu nastavit nizka priorita pres SCB->SHPR
registry. Neni vazane na zadnou HW funkci a n</font><font
face="Helvetica, Arial, sans-serif">eda 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...<br>
<br>
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.<br>
<br>
<br>
Hynek Sladky<br>
<br>
<br>
<br>
<br>
</font>
<div class="moz-cite-prefix">Dne 17.4.2017 19:57, Petr Labaj
napsal(a):<br>
</div>
<blockquote cite="mid:7f7aa5ca-4408-7ca4-89db-bfb5f33d1d9d@volny.cz"
type="cite">Já vím, je to prasárna, takže bych to měl asi napsat,
že "jeden známý se ptá". ;-)
<br>
<br>
Potřeboval bych zajistit reentrantní vstup do přerušovací rutiny.
Tj. obsloužit dané
<br>
přerušení ještě v době trvání předchozí obsluhy téhož přerušení.
<br>
Jde o Cortex M3, konkrétně o nějaký STM32F1 až 4.
<br>
<br>
Situace: nějaké přerušení je voláno cca 4000x za sekundu. Běžně se
za tu dobu
<br>
spolehlivě obslouží, ale při každém 5. zavolání bych potřeboval
udělat delší výpočet,
<br>
který může přesáhnout dobu 1/4000 sekundy. Spolehlivě se ale
provede do doby
<br>
dalšího takového 5. přerušení, takže nějaké přetečení stacku
reentrancí nehrozí.
<br>
<br>
Jestli správně chápu přerušovací mechanismy u Cortexu M, tak
ukončení přerušení
<br>
a tedy možnost dalšího vstupu do IRQ rutiny je možné až po
instrukci RET (neboli BX).
<br>
<br>
Vidím 3 možnosti, jak to oblbnout, ale ani jedna není ideální:
<br>
- Nacpat na stack adresu třeba sebe sama a udělat falešný RET. A
doufat, že to
<br>
nenarazí na nějaké cachování zápisu do RAM nebo jiný zádrhel.
<br>
- Dynamicky v rámci té rutiny zvýšit přioritu toho přerušení,
takže další požadavek
<br>
na stejné IRQ již bude mít vyšší prioritu a bude přijat. Tohle
by se mi líbilo, ale
<br>
nevím, jestli se to zvýšení priority promítne okamžitě.
<br>
- Z IRQ rutiny naplánovat nějaké přerušení s nízkou prioritou od
jiné periferie,
<br>
to se uplatní hned po opuštění aktuální obsluhy IRQ. Pokud
nenajdu nic lepšího,
<br>
tak to asi nakonec dopadne takhle.
<br>
<br>
Žádná z variant mi nepřijde moc sexy.
<br>
Nemáte někdo tip na nějaký mechanismus, který by byl elegantnější?
Třeba
<br>
jestli nějak nejde násilně na NVIC jako-že-ukončit obsluhu
přerušení, aby si
<br>
NVIC myslel, že může přijmout další stejné IRQ?
<br>
<br>
Děkuji za případné tipy.
<br>
PL
<br>
</blockquote>
</body>
</html>