Forum: Mikrocontroller und Digitale Elektronik Programm verschießt Eichhörnchen wenn mit eigenem Bootloader geladen


von Emmeran (Gast)


Lesenswert?

Hi Leute,

ich hab einen Bootloader für den Atmega 328p (in meinem Fall Arduino) 
geschrieben, der sich nach dem Reset per Internet über einen W5100 
Ethernet Controller eine neue Firmware von einer gegebenen Adresse 
runterlädt und ausführt.

Soweit funktioniert das auch ganz gut, aber das hochgeladene Programm 
zeigt sehr merkwürdiges Verhalten. Als Beispiel habe ich hier eine 
Testfunktion, die die verfügbaren Bytes im W5100 zählt:

uint8_t W5100Class::read(uint16_t _addr)
{
  setSS();
  SPI_transfer(0x0F);
  SPI_transfer(_addr >> 8);
  SPI_transfer(_addr & 0xFF);
  uint8_t _data = SPI_transfer(0);
  resetSS();
  return _data;
}

So gibt die Funktion wenn ich sie aufrufe 1024 zurück, anstatt 0 wie 
nötig.
Selbst wenn ich diese krasse Änderung vornehme, klappt es noch nicht:

uint8_t W5100Class::read(uint16_t _addr)
{
  setSS();
  SPI_transfer(0x0F);
  SPI_transfer(_addr >> 8);
  SPI_transfer(_addr & 0xFF);
  uint8_t _data = SPI_transfer(0);
  resetSS();
  return 0;
}


Wenn ich nun diese völlig unlogischen Änderungen vornehme, gibt sie die 
richtige Zahl (offensichtlich nicht mehr die Zahl der verfügbaren Bytes 
aber wenigstens die Zahl die dasteht... 0) zurück:

uint8_t W5100Class::read(uint16_t _addr)
{
  setSS();
  SPI_transfer(0x0F);
  SPI_transfer(0x426 >> 8);
  SPI_transfer(0x427 & 0xFF);
  uint8_t _data = SPI_transfer(0);
  resetSS();
  return 0;
}

Gibt es irgendwelche Optimierungen vom Kompiler, Fuses vom uC oder sonst 
irgendetwas dass ich hier nicht sehe?

PS:
Das Programm mit dem offiziellen Arduino bootloader geflashed 
funktioniert ohne Probleme.

von Klaus (Gast)


Lesenswert?

Eichhörnchen? oO

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Emmeran schrieb:
> Soweit funktioniert das auch ganz gut, aber das hochgeladene Programm
> zeigt sehr merkwürdiges Verhalten.

Hast Du mal einen richtigen Reset (bzw. Poweroff) nach dem Flash per 
Bootloader gemacht? Der Bootloader macht das wahrscheinlich selbst nicht 
nach dem Flashen, oder?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Sieht ein bisschen so aus, als sei dort etwas mit dem Stack verheddert. 
Vielleicht wird er am Anfang des Programmes nicht richtig (neu) 
initialisiert? Und schau mal in den generierten Assemblercode, ob das 
Speichern der 0 in den Stack, und das auslesen selbiger, in der 
aufrufenden Funktion sinnvoll zusammenpasst.

von Emmeran (Gast)


Lesenswert?

Hey, danke schonmal für eure Antworten.

Ich hab nach mehreren Tagen verzweifelten Rumprobierens heute zum Spass 
mal alle Compilerflag-Varianten durchprobiert und habe dabei 
festgestellt, dass mein Bootloader, wenn ich ihn ohne 
-fno-split-wide-types kompiliere irgendwas macht, ausser dem was er 
tun sollte. (Versendet seinen Stack per Netzwerk etc.) Wollte da nicht 
weiter nachsuchen, was genau passiert,  aber nachdem ich nun statt mit 
dem Arduino IDE zu kompilieren mir Makefile geschrieben hab, dass den 
Sketch auch mit -fno-split-wide-types kompiliert, funktioniert alles 
genau wie es soll.

Die Verwirrung ist perfekt. Ich kenn mich leider mit Assembler und dem 
Optimizer zu wenig aus um zu erkennen, was denn dann letztendlich der 
eigentliche Grund für das merkwürdige Verhalten war, aber ich habe mal 
kurz gegooglet und bin dabei auf einen Bug in avr-gcc gestoßen, der für 
meine 20 neuen grauen Haare verantwortlich sein könnte:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46779

Vielleicht macht das ja für einen von euch Sinn und ihr könnte mir grob 
sagen, was eigentlich passiert ist.

Danke nochmals,

Emmeran

PS:
Wer den Bootloader gerne verwenden möchte, ich werde morgen nochmal 
alles zusammenschreiben und dann im Arduino Playground unter
http://arduino.cc/playground/EthernetBootloader

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.