MEGA2560 Bootloader modifizieren (AVR-GCC)

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
Finger
Administrator
Beiträge: 7485
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Finger »

Moin Jungs,

ich brüte gerade über dem Bopotloader vom Arduino MEGA2560, der findet sich im Source lokal bei mir unter C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\stk500v2 (bin mit Windows 7 unterwegs). Den Vogel will ich umbauen, dazu muss ich ihn aber compilieren können, was mich so langsam in die Drogerie treibt um Haartönung zu kaufen :oops:
Erstmal also avr-gcc-9.2.0-x64-mingw gesaugt und gängig gemacht.

1. Versuch

make all liefert mir:

"-f" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
make: *** [Makefile:428: sizebefore] Error 255

OK, die folgenden Zeilen also auskommentiert

Code: Alles auswählen

sizebefore:
	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
	2>/dev/null; echo; fi

sizeafter:
	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
	2>/dev/null; echo; fi
2. Versuch

"Make all" liefert:

Code: Alles auswählen

Compiling: stk500boot.c
avr-gcc -c -mmcu=atmega2560 -I. -gdwarf-2 -DF_CPU=16000000UL  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fno-jump-tables -Wall -Wstri
ct-prototypes -Wa,-adhlns=stk500boot.lst  -std=gnu99 -MD -MP -MF .dep/stk500boot.o.d stk500boot.c -o stk500boot.o
stk500boot.c:2119:1: fatal error: opening dependency file .dep/stk500boot.o.d: No such file or directory
 2119 | }
      | ^
compilation terminated.
make: *** [Makefile:540: stk500boot.o] Error 1
Jetzt hörts so langsam auf, was zun Henker sagt mir das? Kann mich da mal jemand aufschlauen? Ich hab den ganzen Gammle zur Sicherheit hier mal drangehängt....
bootloader.zip
(47.17 KiB) 20-mal heruntergeladen
Benutzeravatar
Sven
Beiträge: 4423
Registriert: Fr 28. Jun 2013, 12:52
Wohnort: Sechsundzwanzigdreisechzehn

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Sven »

Hier hatte jemand das gleiche Problem: https://forum.arduino.cc/index.php?topic=619849.0
Angeblich wurde es gelöst, hab mir die Lösung aber jetzt nicht en detail angesehen.

Hier ebenfalls jemand. https://www.avrfreaks.net/forum/creatin ... ot-working
Der hat wohl irgendeine alte Software anstatt des avr-gcc verwendet.
andreas6
Beiträge: 4165
Registriert: So 11. Aug 2013, 15:09

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von andreas6 »

An "Program Files" scheitert vieles. Verschiebe den Kram mal in einen separaten Ordner, dessen Pfad keine Leerzeichen enthält.

MfG. Andreas
Benutzeravatar
Finger
Administrator
Beiträge: 7485
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Finger »

Ich hab jetzt mal alles in Verzeichnisse geringer Tiefe mit einfachen Verzeichnissnamen ohne Leer- oder Sonderzeichen gepackt. Gleiches Ergebnis.
Was bedeutet denn

Code: Alles auswählen

 fatal error: opening dependency file .dep/stk500boot.o.d: No such file or directory
Versucht er, ein Verzeichniss Names ".dep" anzulegen? Mit dem Punkt würde das natürlich schief gehen. Oder erzeugt er sich die Dependencys nicht selbst?
Kann einer von euch mal versuchen, das zu kompilieren?
Benutzeravatar
Sven
Beiträge: 4423
Registriert: Fr 28. Jun 2013, 12:52
Wohnort: Sechsundzwanzigdreisechzehn

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Sven »

Mal eben mit WSL Ubuntu getestet. gcc-avr und avr-libc Pakete installiert und dann make mega2560
Läuft in weniger als 5 Sekunden durch und spuckt mir ein Makefile aus.

Es sieht mir so aus, als ob das Make Binary versucht Dinge aufzurufen, die ihm fehlen, z.B. "test" ganz oben, was Finger schon auskommentiert hat.
In irgendwelchen Foren werden windige DLLs verteilt, die man in Verzeichnisse kopieren soll, die bei mir gar nicht existieren ;)

Edit: Nach nochmaligem Hinsehen sieht es so aus, als ob unter Windows schlichtweg die Tools fehlen um alle Befehle im Makefile auszuführen.
Irgendwie muss man sich das mit MinGW in Windows reinfummeln können.
Benutzeravatar
Hightech
Beiträge: 11495
Registriert: So 11. Aug 2013, 18:37

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Hightech »

Code: Alles auswählen

 C:\Program Files (x86)
Könnte ein Problem geben, ebenso wie das Verzeichniss .deb
Hier: stk500boot.c:2119:1: fatal error: opening dependency file .dep/stk500boot.o.d: No such file or directory
Benutzeravatar
Sven
Beiträge: 4423
Registriert: Fr 28. Jun 2013, 12:52
Wohnort: Sechsundzwanzigdreisechzehn

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Sven »

Kalt, ganz kalt ;)

Das Problem liegt hier begraben: Das Makefile setzt die Existenz gewisser Werkzeuge (wie z.B. mv und test) voraus, die in Windows nicht vorhanden sind. Wohl aber sind die im MinGW Minimal System enthalten.
Scheinbar sind die beim alten WinAVR noch mit dabei, nicht aber bei der neueren avr-gcc Toolchain, die man z.B. bei Microchip runterladen kann.

Ich habe das Original Makefile genommen ohne irgendwelche Änderungen. (Also das was Finger auskommentiert hat war bei mir enthalten usw.)

Ich habe folgendes gemacht: MinGW runtgerladen und installiert nach C:\MinGW. Dabei habe ich mir folgende Pakete ausgewählt: mingw32-base-bin und msys-base-bin.
Wahrscheinlich hätte auch nur msys gereicht (gibts auch standalone).

Die Toolchain habe ich nach C:\Users\Sven\avrtools entpackt. (Heißt der Compiler ist zu finden unter C:\Users\Sven\avrtools\bin")

Kompilieren geht dann wie folgt. Eingabeaufforderung öffnen:

Code: Alles auswählen

set PATH=%PATH%;C:\MinGW\msys\1.0\bin;C:\Users\Sven\avrtools\bin\
make mega2560
Die erste Zeile bewirkt, erstens dass die Windows CLI weiß, wo es make.exe findet und zweitens dass make die AVR Toolchain finden kann.
Benutzeravatar
Finger
Administrator
Beiträge: 7485
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Finger »

Moin Jungs,

ich hab das jetzt in der Mache, es lässt sich kompilieren und alles *schwärm* Jetzt hab ich aber ein sehr seltsames Problem....... Folgender Codeschnipsel ist dem originolen Bootloader entliehen und soll einen Textstring auf UART3 mit 115200BPS raushauen. Zunächst getestet in der Aruino-IDE (dort läuft es tadellos)

Code: Alles auswählen

  #define UART3_BAUD_RATE_LOW      UBRR3L
  #define UART3_STATUS_REG       UCSR3A
  #define UART3_CONTROL_REG      UCSR3B
  #define UART3_ENABLE_TRANSMITTER   TXEN3
  #define UART3_ENABLE_RECEIVER    RXEN3
  #define UART3_TRANSMIT_COMPLETE    TXC3
  #define UART3_RECEIVE_COMPLETE   RXC3
  #define UART3_DATA_REG       UDR3
  #define UART3_DOUBLE_SPEED     U2X3

  #define BAUDRATE 115200


#define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*8.0)-1.0+0.5)



void send3char(char c)
{
  UART3_DATA_REG  = c;                                          // prepare transmission
  while (!(UART3_STATUS_REG & (1 << TXC3)));  // wait until byte sent
  UART3_STATUS_REG |= (1 << TXC3);            // delete TXCflag
}

void  PrintString(char *textString)
{
char  theChar;
int   ii;

  theChar   = 1;
  ii      = 0;
  while (theChar != 0)
  {
    theChar = textString[ii];
    if (theChar != 0)
    {
      send3char(theChar);
    }
    ii++;
  }
}


void setup ()
 {
  UART3_STATUS_REG   |=  (1 << UART3_DOUBLE_SPEED);
  UART3_BAUD_RATE_LOW  = UART_BAUD_SELECT(BAUDRATE,F_CPU); 
  UART3_CONTROL_REG  = (1 << UART3_ENABLE_RECEIVER) | (1 << UART3_ENABLE_TRANSMITTER);
  asm volatile ("nop");     // wait until port has changed
 }
 
  void loop ()
  {
    while (1) 
     {
       wdt_reset();
       send3char('H');
       send3char('a');
       send3char('l');
       send3char('l');
       send3char('0');
       send3char(' ');

      PrintString ("Welt ");
       
     }

  }

Das haut mir auf UART3 "Hallo Welt" in Dauerschleife raus. Läuft. Verlege ich das aber in den Bootloader (gleicher Codeschnipsel an den Anfang eingefügt) bekomme ich "Hallo §§§§§§" in Dauerschleife. Die Funktion send3char () geht, die Funktion printString () dort nicht. Auch nicht mit einem übergebenen String im Ram.

Ich stehe auf dem Schlauch. Komplett. Irgendwelche Ideen oder Ansätze?
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Name vergessen »

Klingt, als würde der String von gcc irgendwohin gemappt, wo der Bootloader nicht drankommt (und stattdessen was Anderes sieht, vermutlich 0 oder 255). Dank Compiler-Optimierungen weiß der Code aber die Länge und deshalb werden nicht null oder unendlich viele Zeichen geschrieben, sondern exakt so viele wie der String inklusive Endnull lang wäre, weil die Anzahl der Schleifendurchläufe hardcodiert und die Vergleiche ersatzlos gestrichen werden.

Man könnte also versuchen, den String ins Codesegment zu kriegen oder schauen, warum das Datensegment anderswo gemappt wird. Letzteres wird sicher eine Fummelei mit Optionen, aber ist dann natürlich dauerhafter und zukunftssicherer. Bootloader müssen ein anderes Segment haben als der Programmcode, weil Letzterer sich je nach Einstellungen so fühlen soll, als sei er ohne Bootloader im ROM, damit man ihn unabhängig vom Bootloader compilieren kann. Daher verschieben sich die Segmente, das muß der Compiler gesagt bekommen und natürlich weiß die Arduino-IDE das, der gcc aber nicht.

Der zum Compilieren verwendete String läßt (ließ, als ich das zuletzt benutzt habe) sich aber anzeigen, da kann man also ggfs. einfach die relevanten Optionen draus übernehmen, denn auch die Arduino-IDE benutzt IIRC avr-gcc.
Benutzeravatar
Finger
Administrator
Beiträge: 7485
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Finger »

Das stimmte tatsächlich, die Referenzierung auf den String ist schief gegangen. Mein Executable war zu groß für die 4kB Flash, die dem Bootloader auf der Kiste maximal zur Verfügung standen. Dem Compiler war das egal, meinem Programmer (Asix Forte) auch, der hat das einfach abgeschnitten :roll: Ein Wunder, das der Rest funktionierte. Dummerweise kann ich den Speicherbereich nicht wirklich vergrößern, ich muss also mächtig knausern..... 4k sind nicht viel....
Benutzeravatar
Zabex
Beiträge: 633
Registriert: Di 2. Jul 2013, 08:45
Wohnort: Aldenhoven
Kontaktdaten:

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Zabex »

Ich kenne das eigentliche Problem nicht, welches du durch rumschrauben am Bootloader beheben willst.
Kennst Du Optiboot (siehe HIER) ?
Der hat mir sehr geholfen, lästige Startup-Wartezeiten und damit einhergehende Watchdogprobleme zu beheben.

Vielleicht ist das ja auch was für dich...

Einfach mit ISP draufspielen und gut.

Gruß,
Zabex
Benutzeravatar
Finger
Administrator
Beiträge: 7485
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: MEGA2560 Bootloader modifizieren (AVR-GCC)

Beitrag von Finger »

Ich kann entweder hier einer SPS das STK500-Protokoll beibringen, oder ein vorhandenes Protokoll nutzen und muss dafür den Bootloader ändern... In diesem Fall hab ich beschlossen am Bootloader was zu machen :ugeek:
Antworten