To je v pohode. Tolko sa tu stale omiela, ze na rozne udalosti treba vyuzivat HW a najlepsie este kazdy s vlastnym prerusenim, ze sa niet co divit
Ale je to prepruzenie tiez casto tu uvadzaneho protipolu, robit vsetko v hlavnej slucke a na kazde oneskorenie a cakanie pouzit pause().
Pravda je niekde uprostred. Najlepsie voditko, ktore sa mi osvedcilo je zkontrolovat, ci sa system niekde zbytocne neflaka cakanim na nieco. Ak je tento cas vacsi ako 1-5us, treba vymysliet ako cinnost mcu presmerovat na nieco zmysluplne. Tiez hafo vnorenych preruseni nemusi byt to prave orechove. Kazdym volanim prerusenia sa system zase (aj ked velmi malicko, ale ak sa tie “malicka” zrataju a je ich hodne…) zdrzuje pracou na zasobniku. Celkom dobry system je spravit si nejaku rozumnu casovu zakladnu, napr. 1ms a v ramci nej napchat rutinky, ktore trvaju par instrukcii. Ako napriklad vyhodnotit tlacitko, nastavit nejake udalosti od casu (v tomto pripade s granularitou 1ms), presne zopnut, vypnut vystup. Tieto ulohy sa hravo zmestia do par desiatok az stovak us. Vsetko ostatne mozes robit v hlavnej slucke, alebo spustanim samostatnych prerusovacich uloh ako napriklad zapis udajov prijatych cez UART do EEPROM cez nejaky RX/TX buffer.
Pri tej 1ms rutine si ako prve zabezpec indikaciu, ci tato casova rutine nie je v sklze a meraj cas trvania 1ms rutiny a cas trvania hlavnej slucky. Vyhodnocuj maximalne casy. Na zaklade toho vies, kolko rezervy z procesora mas alebo ci nieco netreba prepisat tak, aby to trvalo kratsie.
Cas a sklz prerusenia vyhodnotis tak, ze po preruseni od casovaca nastavis nejaku internu premennu na TRUE. Po ukonceni uloh z prerusenia ju nastavis na FALSE. Hned na zaciatku po nastaveni premennej na TRUE, povol prerusenie od casovaca. Akonahle pride dalsie prerusenie od casovaca, najprv skontroluj hodnotu premennej. Ak je TRUE, nastav si priznak, ze je rutina v sklze (mozes aj pocitat kolko krat) a rutinu opusi. Ak je hodnota FALSE, nastav ju na TRUE a pokracuj dalej.
Takymto sposobom sa system nezruti od pretecenia zasobnika, lebo ten prvy test bude trvat urcite daleko menej ako 1ms .
Cas trvania rutiny urcis tak, ze si na konci prerusenia (ak medzitym nie je nastaveny priznak pretecenia) odpamatas cas v casovaci a to je vysledny cas trvania. To preto, ze rutina sa spustila, ked bola hodnota casovaca rovna nule (alebo OCRx ? v tejto chvili presne neviem, ale ak aj, tak chyba nebude vacsia ako jeden tik casovaca).
Pod 1ms si zase pocitaj vlasne hodiny napr v 16b premennej s krokom 1ms. Cas trvania hlavnej slucky zistis odpamatanim hodnoty na jej zaciatku a odpocitanim od hodnoty pri dalsom prechode zaciatkom. Vyhodnocuj a uchovavaj (staci v RAM, nemusi to byt hned EEPROM aj ked ani to nie je na zavadu hlavne pri vyp/zap zariadenia) maximalnu hodnotu.
Ak Ti nieco bude obcas v zaraideni blbnut a sklz a max. casy trvania budu v norme, mas istotu, ze system neblbne pre nedostatok vykonu. To je casto velmi dolezite. Obcas sa podari napisat sw, ktory sa pri urcitej konstelacii behu, komunikacii, vyhodnotenia a spracovania periferii sprava cudne, akurat sa velmi tazko tato situacia analyzuje, lebo sa neda nasimulovat. Informacia o casoch behu jednotlivych casti su potom neocenitelnou pomockou pre hladanie zahady.
MEranie casu ti tiez napovie, ake rutinky mozes nechat v hl. slucke, ci naopak ich z nej vlozit pod 1ms prerusenie. Ak nieco musis spravit 1x za 100ms, napriklad zap/vyp rele (rychlejsie to aj tak nema zmysel) a hl. slucka v najhorsom pripade trva 12ms, kludne rutinu mozes nechat v hl. slucke. Ak ale hl. slucka obcas trva 250ms, treba sa nad vecou lepsie zamysliet.