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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.