Debugger aktivieren in Eclipse (Sloeber)

Hey,
ich habe nun Sloeber (Arduino Eclipse IDE) aufgesetzt.
Es scheint auch prinzipiell zu funktionieren. Nur leider schaffe ich es nicht den Debugger zu aktivieren.

Ich habe versucht unter Run-->external tool configurations-->programm eine neue Launch application hinzuzufügen.
Als Location wähle ich mein vorher Compiliertes Ergebnis (*.elf) und das working directory setze ich einfach auf meinen Workspace.

Stimmt das so nicht?

Mir ist kein Debugger für 8-Bit Arduinos bekannt, Es gibt zwar das debugWire Interface, aber dann sollte jeder Benutzer wissen, was er dem Controller damit antut.

Vielleicht bist Du mit einem Emulator besser bedient als mit einem Debugger?

hm das ist schade,
aber sowas habe ich auch gestern gelesen.

Ich habe mir die freeRtos lib installiert, leider ist das Debuggen von komplizierteren Problemen hier schwierig.
Was ich aktuell mache ist, mir Fehlermeldung über die Serielle Schnittstelle zu senden, kein schöner Codestil aber besser als nix.

Problem ist nur wenn irgendwelche Interupts auftreten, die wird man auf diese Weise nicht aufspüren können und ich glaube auch kein Emulator bekommt das hin, oder liege ich da falsch?
Diese Interupts treten immer auf wenn sich irgendwelche Tasks aufhängen, da wärs halt schön zu wissen welcher Interupt genau aufgetreten ist.

Wenn ich dich richtig verstanden habe geht das aber vermutlich mit dem Arduino nicht oder?

Warum gibt es eigentlich keinen Debugger im Arduino, muss ja irgendwie Hardware limitiert sein oder?

Arduino, muss ja irgendwie Hardware limitiert sein

Du hast es erkannt. :wink:

Ist ein Controller, kein Computer.
Ein Uno hat 20 I/O Pins, mehrere Hardware-Timer/Counter, Hardware-Unterstützung für I2C, SPI, UART,
und nur 2kB RAM.

Probleme beim Debuggen:

  • Es gibt keine weiteren Cores für den parallelen Betrieb eines Debuggers.
  • Breakpoints müssen ins Flash geschrieben werden - das dauert und reduziert die Lebensdauer.
  • Interrupts werden sequentiell abgearbeitet, können sich (normalerweise) nicht gegenseitig unterbrechen.
  • Unterbrechungen (Debugger Ausgaben...) stören den real time Ablauf, sind absolut tabu in Interruptroutinen.

Deshalb solltest Du Dir für das Debuggen von Interruptroutinen was anderes einfallen lassen. Sind genügend freie Pins vorhanden, kann man dort Statusanzeigen ausgeben, ohne den Ablauf stark zu verzögern. Dafür z.B. einen Mega verwenden, der hat jede Menge I/O Pins. Für die zeitliche Analyse können diese Signale mit einem Logik-Analysator überwacht werden.

Was meinst Du mit Tasks? Es gibt keine Umschaltung zwischen Tasks bzw. Prozessen, alles läuft sequentiell ab, bzw. mit kooperativem Multitasking. Für kooperatives Multitasking hat Combie ein paar Makros ausgegraben (bei Knuth), mit denen quasi-parallele Abläufe sehr übersichtlich nachgebildet werden können. Siehe meine Implementierung in ALib0.

Hey,
das mit dem fehlenden Debugger ist echt sehr ärgerlich :frowning:
Alles nur über die serielle Schnittstelle auszulesen ist auch keine alternative :open_mouth:

Auf der Arbeit verwenden wir einen STM Prozessor (klar, der war teurer^^) aber der hat soweit ich weiß auch nur einen Kern und kann trotzdem debuggen, irgendwie komisch?!

Ich verwende auf dem Arduino ein RTOS (free RTOS um genau zu sein). Klar die können nur seriell abgearbeitet werden, aber das Betriebssystem teilt die Task so ein, dass die der Reihe nach mal Pause haben.

So wirkt es zumindest nach außen wie eine parallele Aufgabenverteilung :wink:

Ein Beispiel für einen Task: ich prüfe in Regelmäßigen Abständen ob neue Daten im RX Puffer oder TX Puffer liegen.

void write_tx_buffer( void * params)
{
uint8_t tx_single_packet_length = 0;

for (;:wink:
{
//prüfen ob der Empfangspuffer überhaupt korrekt definiert wurde
if (usb_write_buffer_queue != NULL)
{
//prüfen ob überhaupt Nachrichten auf das senden warten
UBaseType_t messages_waiting = uxQueueMessagesWaiting(
usb_write_buffer_queue);

if (messages_waiting > 0)
{
//ja wir haben Post

BaseType_t read_queue_success = xQueueReceive(
usb_write_buffer_queue, (void *) &single_tx_packet,
(TickType_t ) 5);

if (read_queue_success == pdTRUE)
{
//das lesen des Items war erfolgreich

tx_single_packet_length = single_tx_packet.packet_length;

//wir können maxmimal 64 Byte übertragen
if (tx_single_packet_length > 64)
{
tx_single_packet_length = 64;
}

//jetzt kopieren wir unsere Daten in ein Byte Array
memcpy(tx_byte_array, &single_tx_packet,
tx_single_packet_length);

//jetzt noch die Daten senden
Serial.write(tx_byte_array, tx_single_packet_length);

}
}
}
vTaskDelay(100);
}
}

Dieser Task läuft alle 100ms 1 mal und prüft ob neue Daten in der TX Queue liegen, falls ja werden die in den TX Puffer gepackt.
Leider habe ich gerade das Problem, dass keine Daten ankommen. Jetzt muss ich morgen hinter jede Zeile ein Serial.println setzen um zu schauen wo es hängt :frowning:
Nicht sehr elegant

PS: seht ihr vllt auf die schnelle den Fehler? :smiley:

Kannst Du Deinen Code noch in Code-Tags einschließen (</> klicken)?

Das vTaskDelay() erinnert mich wieder einmal an die Task Makros, Zu den übrigen Funktionen kann ich nichts sagen, würde die aber für potentielle Übeltäter halten - sofern sichergestellt ist, daß tatsächlich was angekommen sein sollte. Zumindest würde ich an jedes "if" ein "else" anhängen, das eine entsprechende Fehlermeldung ausgibt.

Sollte die Tx Queue nicht eigentlich die Rx Queue sein?

hat zwar nix mehr mit dem eigentlichen Thema zu tun, aber falls es wen interessiert

habe heute nach einiger Tüftelei das Problem gefunden:

offenbar läuft mein SRAM über :open_mouth: So ein Betriebssystem ist wohl zu groß für den Arduino :frowning:

Der SRAM von 2kb reicht offenbar nicht aus :frowning:

Ich verwende auf dem Arduino ein RTOS

Tja...

Dann wirst du wohl auf "Kooperativ" umstellen dürfen.

Zu den übrigen Funktionen kann ich nichts sagen,

Ich auch nicht.

offenbar läuft mein SRAM über :open_mouth: So ein Betriebssystem ist wohl zu groß für den Arduino :frowning:
Der SRAM von 2kb reicht offenbar nicht aus

Das "Original - Betriebssystem" von arduino besteht (unwesentlich vereinfacht :wink: ) aus

void main() {init(); setup(); while(1) loop(); }

Ist Puristen schon zu groß: Übersetze mal einen leeren Sketch: wofür sind die 450 byte Flash (Uno/Nano und IDE 1.6.7) und 9 Byte globale Variable gut?

Bei RAM - Problemen passiert gar nichts, (also genaugenommen irgendetwas), kannst dich nicht mal auf ein Reset verlassen.