Měření času v debug - jak dlouho trvají bloky kódu?

Zdravím,

neví někdo o způsobu jak lze měřit čas toho, jak dlouho trvají bloky kódu při debuggu? Je mi jedno jestli v Keil nebo v Attolic True studio. Díky moc.

:arrow_right: administrator: přejmenováno z "měření času v debug"

V Keilu “execution profiler” keil.com/uvision/db_anl_profiler.asp

Hm, to lze jen při simulaci. A tu se mi nikdy nepovedlo rozběhat. pořád na mě skče tahle chyba:

*** error 65: access violation at 0x0000000C : no ‘read’ permission
*** error 65: access violation at 0x00000000 : no ‘execute/read’ permission

V HW debugu to nejde…myslím

Není nad to používat svá měření. Dobu provádění funkcí měřím tak, že funkci volám x-krát ve smyčce ve které blikám LEDkou - počet volání došolichám zkusmo tak, aby LED blikala přesně v sekundových intervalech. Nebo počítám bliknutí za 10 sekund. Sice pracnější metody, ale nenáročné na další vybavení a přitom docela přesné. :slight_smile: A kupodivu když si některé funkce počítám z časování instrukcí, tak se trefuji dost přesně.

Proč to dělat (ledky a podobný věci) když v simulátoru to jde…
To jen v případě že nění možné zjistit v reálný aplikaci kolik času v jaký funkci cpu v průměru stráví bych sáhnul (a taky sahám) k těmto metodám.
Vytížení cpu jsem dokázal měřit i na 8051 (posílal mi to po zběrnici), takže u armu to je možný taky a snadněji.

Např. když někdo nepoužívá simulátor nebo nějaká vývojová prostředí ale jen přeloží s gcc a utilitkou vypálí do čipu. :slight_smile:

Jo to pak “no way” :slight_smile:

Ledky budou asi jediná cesta. Jedná se o měření délky AD konverze… Vůbec mi nedošlo, že tohle simulátor nezvládne. Až teď sem si to uvědomil

Experiment jsem provedl tak, že nastavím ledku a pustím konverzi. V okamžiku kdy skončí zhasnu ledku a pustím ji znovu. Tohle mám v nekonečné smyčce. Takže perioda kmitů je přibližně doba dvou konverzí…Cca to sedí, ale měřil sem to multimetrem a ten mi tvrdí že frekvence je 0,522MHz což znamená že jedna konverze trvá 1/1044000 což je nesmysl protože max rychlost je 1.12 us. Hold co by člověk nechtěl od mulťáku za litr.

Už jsem se lekl že okem odhadneš 1 us, když to jde na LED. :smiley:

a v AVR studiu je mozne merat cas vykonavania jednotlivych instrukcii? Pripadne existuje nieco kde by to bolo mozne? Pozeral som ten keil aj attolic no v oboch bolo pisane ze su len pre arm-y pripadne este 8051 a ja by som potreboval nieco podobne na atmegy/xmegy. Dakujem

Zkus se informovat na IAR, ten AVR umi.

Pre AVR toto funguje velmi dobre

youtube.com/watch?v=nPQl3e08vgg

amctools.com/vmlab.htm

vie sucasne simulovat niekolko MCU typu AVR v PC.

Meranie slucky tak ako bolo popisane nevidím ako úplne šťastné a to z toho dôvodu, že pokiaľ by rutina trvala stále rovnako, potom by stačilo spočítať inštrukcie a vedelo by sa presne koľko rutina trvá. Čas prevodu aj tak určuje užívateľ nastaveniami časovania.

Vzhľadom k tomu, že do procesov často vstupujú rôzne prerušenia, ktorých prejavy sa ťažko odhadujú, za lepšie riešenie ako merať frekvenciu (napríklad merákom, ktorý prevádza frekvenciu na napätie a až to meria už vôbec nie), za lepšie riešenie považujem nasledovné.

Pri behu mcu je použitý nejaký čítač pre presné časovanie procesov.
Časovač treba nastaviť tak, aby v pracovnom čítači (8b/16b) bol rozdiel daný jedným bitom dostatočne jemný.

Na začiatku rutiny si program odpamätá stav tohto pracovného čítača. Na konci rutiny od aktuálnej hodnoty pracovného čítača odpočíta stav na začiatku. Rozdiel určuje čas s presnosťou na LSB pracovného čítača. Z takto získanej hodnoty sa dá ľahko vyhodnotiť priemerná hodnota. Stačí plávajúci priemer, alebo jednoduchý filter typu:

STARA_PRIEM_HODNOTA = (NOVA_HODNOTA + STARA_PRIEM_HODNOTA) / 2;

Toto hyhodnotenie sa podobá na to meranie frekvencie

Ale asi výpovednejšie bude sledovať maximálnu hodnotu behu rutiny.

if (MAX_HODNOTA < NOVA_HODNOTA) MAX_HODNOTA = NOVA_HODNOTA;

tieto hodnoty treba načítať cez UART. Vyhodnotenie síce pridá nejaký ten kód (a čas) navyše, ale tento je prísne determenistický a dá sa ľahko od nameraného výsledku odpočítať.

Ja zvycajne na meranie dlzky nejakeho cyklu pouzivam osciloskop s tym ze na zaciatku nastavim nejaky vystup do log.1 a na konci ho hodim do log.0 a takto viem kolko mi trva cely cyklus. Takto som prisiel napriklad na to ze ak som v Bascome napisal program ktory v nekonecnej slucke prepinal stav jedneho pinu na porte tak toto iste napisane v Ccku bolo priblizne 1,7 nasobne rychlejsie. Rad by som ale skusil aj nejaky simulator