Ako zdebugovat interupt v C ?

Petr Labaj labaj na volny.cz
Sobota Září 9 00:27:52 CEST 2023


Používám to podobně.
Mám udělaná makra, která strčím na začátek a konec obsluhy IRQ (případně 
jinam).
Ta makra v debug verzi na začátku nahodí daný pin, na konci shodí. V 
release verzi se makra neuplatní.
Takže to můžu sledovat osciloskopem.

Ale protože jsem posedlý efektivitou programu a rychlostí zpracování, 
tak mám ten pin (resp. piny) zvolený tak, že funguje také jako vstup čítače.
Čítač si čítá pravidelné tiky, a tento pin funguje jako jejich hradlování.
Takže výsledkem je přesně změřené procento času, které procesor strávil 
v dané oblasti, ohraničené makry.

Defaultně to mám na začátku a konci každé IRQ rutiny (to je jeden čítač, 
společný pro všechny IRQ) a v "obsluze" stavu IDLE (druhý čítač).
Takže vím kolik výkonu seberou přerušení a kolik z toho zbytku aktivní 
běh programu. Tedy jaké mám kde rezervy.

PL

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

Dne 8.9.2023 v 22:19 Vláďa Anděl napsal(a):
> Pro různé testování, kam program občas zabloudí, kolega používá 
> testovací ledku, která blikne při průchodu tou či onou větví programu. 
> Když mu kreslím tišťák s nějakým MCU, nesmím na ní zapomenout. Já 
> zase, protože se mi na stole válí osciloskop, se obejdu i bez té ledky 
> a těch testovacích výstupů si tam nadělám i víc. Zvlášť vhodné i k 
> sledování, jestli se provádění programu (a s jakou rezervou) vejde do 
> časového okna, pokud je program spouštěný časovačem. I tohle dokáže 
> nadělat chyby, které se jinak blbě hledají.
>
> Anděl
>
> Dne 08.09.2023 v 15:23 Petr Labaj napsal(a):
>> Omlouvám se, že jsem to nestudoval celé.
>> Ale pokud se občas vypisuje něco co nemá, tak bych udělal:
>> - v té přerušovací rutině, která má vypisovat DP,  bych otestoval, 
>> jestli posílám na port opravdu kód pro DP
>> - pokud ne, tak bych vzal ze stacku adresu, na které bylo vyvoláno 
>> přerušení, a napsal bych ji do nějakého pomocného bufferu
>>
>> Pak bych to po chvíli zastavil v debugeru (poté, co se několikrát 
>> zobrazil ten špatný segment) a zkontroloval ten seznam adres, kde se 
>> program nacházel v době přerušení.
>> Pokud by to byly stále stejné oblasti, zaměřil bych se na hledání tam.
>> Je to jednoduchý pokus na pár řádků a pár minut.
>>
>> PL
>>
>> *******************
>>
>> Dne 8.9.2023 v 15:14 Jan Waclawek napsal(a):
>>> [preposielam]
>>>
>>>
>>> Ahoj,
>>>
>>> pouzivaju sa dva buffre MUX_RawData a RawData. Raw_Data sluzi na 
>>> nastavenie
>>> bitovych masiek cislic a znakov. MUX-RawData je samotny buffer, z 
>>> ktoreho
>>> bezi multiplexovanie dat na porty, kopiruju sa jednotlive bity.
>>> Umyselne pisem porty, lebo ovladanie anod a zobrazenie znakov a 
>>> cislic nie
>>> je konzistentne na piny portov, ale su rozhadzane, tak aby bol pekny
>>> plosny spoj. Chyba sa prejavi tak, ze na prazdnej segmentovke, na 
>>> ktorej ma
>>> svietit "DP" svieti "Seg_A".  Akoby sa vykonala rotacia z 8 bitu do 
>>> 1 bitu.
>>> Neprejavuje sa to vzdy, ale z casu na cas sa to objavi a rusi to 
>>> esteticky
>>> dojem. Este ma napadlo, ci to nie je typicka chyba read-modify-write
>>> bitovych instrukcii PIC16, ktorymi ten displej ovladam. Chybu sa mi
>>> podarilo nasimulovat, ale pokazde pri inom zobrazovanom 3-cifernom 
>>> cisle.
>>> Chyba nie je staticka ale dynamicka. Ten kod, co som sem dal, 
>>> funguje na
>>> 99,9%, takze to nie je tak, ze to nefunguje vobec. Jedina tazkost pri
>>> ozivovani bola synchronizacia pri kopirovani RawData do MUX_RawData. A
>>> mozno je to aj tym 20 rocnym mcu, ktory uz pomaly dosluhuje. Ale 
>>> prist na
>>> to, co tomu je, ma dost motivuje, ale zial matam v tme.
>>>
>>> A.
>>>
>>> Skus prosim este popisat, co presne chces zobrazovat (t.j aky je obsah
>>>
>>> jednotlivych relevantnych premennych), a co tam vidis zobrazene 
>>> (t.j. ze
>>> ako sa chyba prejavuje).
>>>
>>> wek



Další informace o konferenci Hw-list