Forum: Compiler & IDEs AVR Laufzeit einzelne Funktion


von floh boing (Gast)


Lesenswert?

Gibt es ein Werkzeug zur Simulation/Laufzeitanalyse einzelner Funktionen 
aus einem Debug-Build?

Disassemblen per https://onlinedisassembler.com/ oder

> avr-objdump.exe -s -m avr25 -D firmware.elf > firmware.asm

klappt schonmal, aber da ich den Befehlssatz nicht aus dem ff kenne, 
suche ich eine schnellere und komfortablere Möglichkeit.

Muss ich einen Simulator bemühen oder gibt es einen Disassembler mit 
Analyse?
Oder ein Simulator, der Funktionsaufrufe kann, z.B.

> sim firmware.elf -f func(123)
456 cycles

AVR Studio ist bei mir gerade nicht installiert.

Cutter mit Ghidra kennt den avr25 Befehlssatz nicht.

von Oliver S. (oliverso)


Lesenswert?

floh boing schrieb:
> aus einem Debug-Build?

ist die Laufzeitanalyse selten sinvoll, wenn hinterher ein release-build 
arbeitet.

floh boing schrieb:
> Muss ich einen Simulator bemühen

Entweder das, oder die original-Hardware mit ein paar Portausgaben 
ergänzen, und Oszi oder Logikanalysator dranhängen.

floh boing schrieb:
> AVR Studio ist bei mir gerade nicht installiert.

Das ist natürlich ein nicht veränderbarer Zustand. Kann man halt nichts 
machen...

Es gibt aber noch andere Simulatoren, google ist dein Freund.
avr-gdb hat üblicherweise auch einen an Bord.

Oliver

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

floh boing schrieb:
> Disassemblen per https://onlinedisassembler.com/ oder
>
>> avr-objdump.exe -s -m avr25 -D firmware.elf > firmware.asm
>
> klappt schonmal, aber da ich den Befehlssatz nicht aus dem ff kenne,
> suche ich eine schnellere und komfortablere Möglichkeit.

Du kannst auch direkt den Assembler-Code, den der Compiler erzeugt hat, 
ansehen - sogar mit Kommentaren mit den entpsrechenden Teilen des 
C-Code. Das ist deutlich sinnvoller, als erst ein Binary zu machen und 
das dann wieder zu disassemblieren. Ausführungszeiten zeigt er da meines 
Wissens trotzdem nicht an, aber der Code ist übersichtlicher.

von floh boing (Gast)


Lesenswert?

okay danke.

von David M. (milo-d)


Lesenswert?

floh boing schrieb:
> okay danke.

Ich arbeite zurzeit an einer Library für statische und dynamische 
Analyse von AVR binaries.

Funktionsanalyse wird zurzeit leider noch nicht unterstützt, aber die 
braucht man bei deiner Aufgabenstellung nicht unbedingt.
1
int main(const int argc, const char **argv) {
2
3
    vmcu_report_t *report = vmcu_analyze_ihex("file.hex");
4
    vmcu_system_t *sys    = vmcu_system_ctor(report);
5
6
    const uint16_t fn_start = 0x0234;
7
    const uint16_t fn_end   = 0x0292;
8
9
    while(vmcu_system_get_pc(sys) != fn_start) // simuliere bis fn_start
10
        vmcu_system_step(sys);
11
12
    const uint64_t cycle_start = sys->cycles;
13
14
    while(vmcu_system_get_pc(sys) != fn_end)   // simuliere bis fn_end
15
        vmcu_system_step(sys);
16
17
    printf("Cycles: %ld\n", sys->cycles - cycle_start);
18
19
    vmcu_report_dtor(report);
20
    vmcu_system_dtor(sys);
21
22
    return EXIT_SUCCESS;
23
}

Achtung: Der Code wurde noch nicht kompiliert, kann also noch Fehler 
enthalten.

Du müsstest, da zurzeit ja noch keine Funktionen erkannt werden, die 
Start-und Endaddresse der Funktion selber bestimmen (fn_start, fn_end im 
Beispiel oben)

https://github.com/Milo-D/libvmcu-Virtual-MCU-Library

von Joachim B. (jar)


Lesenswert?

Oliver S. schrieb:
> Entweder das, oder die original-Hardware mit ein paar Portausgaben
> ergänzen, und Oszi oder Logikanalysator dranhängen.

genau so, so kann man IRQ und Laufzeiten mit erkennen, z.B.

Eintritt in die IRQ, Port setzen und Austritt IRQ Port rücksetzen, dann 
weiss man wie lange sich der µc in der IRQ aufhält und ob nicht zu viele 
IRQ kommen, z.B Timer IRQ.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.