<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>