SAME70 i2c / twihs, Single Step / Step Over Debugger Problem

OP #7412579
Lesenswert?

Hallo,

ich habe hier ein Custom Board mit einem ATMEL (Microchip) SAME70 Prozessor, bei dessen I2C / TWIHS Bus mit einer externen RTC und einem externen Sensor verbunden ist.

Als Debugger habe ich den ATMEL ICE Debugger, der mit SWD benutzt wird. Debugging funktioniert auch im Grunde, aber ich bin inzwischen der Meinung, dass Single Steps oder Step Over dafür sorgen, dass I2C Fehler verursachen. Entweder kommen Fehlercodes zurück oder das Programm bleibt in einer Dauerschleife hängen.

Als Beispiel habe ich eine RTC Test Funktion, abstrahiert sieht das ungefähr so aus:

1
err = rtc_probe();
2
date = my_new_date();
3
err = set_rtc_date_time(&date);
4
date = my_other_date();
5
err = get_rtc_date_time(&date);

rtc_probe() liest ein Register von der RTC aus, set und get setzt und liest Registerwerte mittels den i2c read und write Kommandos und erstellt es in mein date struct.

Angenommen, ich setze ein Breakpoint auf Zeile 1 und klicke nur durchgehend auf Continue. Der Wert von err ist durchgehend 0 und alles funktioniert. Sobald ich aber von Zeile 1 über Zeile 2 step over mache, dann kommt bei Zeile 5 z.B. err = 5 raus und. Ein Continue sorgt dann, dass wieder nur 0 raus kommt. Steppe ich mehrmals rüber als auch über 3 und 4 und mache dann Continue, dann entsteht eine Dauerschleife.

Ein Kollege meint, dass der Debugger vermutlich nicht mit den Timings vom gesamten Prozessor klar kommt bzw. der Prozessor das Debugging nicht mag. Kennt ihr solches Verhalten? Kann man da irgendetwas machen? Ich bin langsam am verzweifeln, weil ich weder richtig debuggen kann noch printf() nutzen kann.

Wäre über Tipps oder Ratschläge dankbar.

Moderator (Firma: Titel) Persönliche Seite #7412720
Lesenswert?

Burak S. schrieb:

Kennt ihr solches Verhalten?

Verwendest du eine I2C Engine/Hardware des Controllers?

Es gibt beim Debuggen immer wieder Überraschungen, wenn man Hardware im Einzelschritt "durchlaufen" will. Denn die Hardware der seriellen Schnitte (evtl. sogar mit DMA) hält ja am Breakponit nicht an, sondern läuft Vollgas weiter.

Kann man da irgendetwas machen?

  • erst dahinter einen Breakpoint setzen und die Ergebnisse der 3 Aufrufe in 3 Variablen speichern
  • sich den Transfer mit einem Logikanalyzer direkt auf dem I2C Bus ansehen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren