Forum: Mikrocontroller und Digitale Elektronik Bootloader Location richtig wählen?


von timebeast (Gast)


Lesenswert?

So, hab gerad nen Bootloader für nen mega8 geschrieben in AVR Studio 
unter C mit ASM Anteilen, underbar.
Problem, er schreibt mir das natürlich wie nen ganz normales Programm 
ganz noch oben im Flash, also ab Adresse 0x0000.

Wie krieg ich ihn dazu das er mir das "Programm" in die Bootloader 
Sektion schaufelt? (ISP PonyProg)

Gruß

Ralf


P.S.: Das Datenblatt hat zwar nen sehr schönes Beispiel,...aber warum er 
diesen Code plötzlich aus PonyProg heraus in die Bootloader Sektion 
schreiben soll ist mir Schleierhaft...

von 2921 (Gast)


Lesenswert?

In ASM waere das dann .ORG 0x3800 oder so.

von timebeast (Gast)


Lesenswert?

jupp, genau, da mir das allerdings nichts bringt habe ich extra dazu 
geschrieben das ich in C programmiert habe...

von CR (Gast)


Lesenswert?

Was benutzt Du denn für einen Compiler? Ich gehe mal von gcc aus, da 
lässt sich die Adresse der Text-Sektion mit einer Linker-Option angeben:

-Wl,--section-start=.text=<Speicheradresse in Byte>

Somit lassen sich auch beliebige andere Sektionen verschieben.

von 2921 (Gast)


Lesenswert?

Die Startadresse steht irgendwo im Linker command file.

von timebeast (Gast)


Lesenswert?

Puh, ja ne, krieg´s nicht hin.

Also nochmal ich benutze AVR-Studio von Atmel. Ich habe Win-Avr 
installiert, seitdem kann ich auch in C programmieren.
(ja, er benutzt nun das aktuelle avr-gcc, ich will damit nur zum 
ausdruck bringen das ich von Linux nichts, aber auch rein gar nichts 
halte. Sprich, irgendwelche Linker Files oder Linker Command Files oder 
sowas, faß ich nicht an. Besser, ich will sie nicht anfassen, und sicher 
nicht weil ich Angst davor hätte, sondern weil dieses ganze Makefile 
selber geschreibe viel zu Fehleranfällig und unübersichtlich ist. 
Ausserdem hab ich mehere Leute hier im Studium die auch mit AVR Dude 
rummachen und dann tagelang damit beschäftigt sind Makefiles zu 
programmieren anstatt die Programmieraufgabe zu lösen)

Also, in AVR Studio, wenn ich nun unter Project Options gucke, kann ich 
dort wohl unter [Linker Options], steht noch kein Eintrag, etwas 
hinzufügen.

Wenn ich "-Wl,--section-start=.text=<0x3800>" hinzufüge sagt er mir "nop 
such file or directory"
Bei "-Wl,--section-start=.text=0x3800"kommt, address 0x3a0a of 
megalord.elf section .text is not within region text.

Muß ich vielleicht noch was ändern, vielleicht eine .text (was wieder 
ASM wäre) als C-Derivat irgendwo einfügen?

Gruß und Danke schonmal bis hier hin
Ralf

P.S.: Ich meine ich habe dieses komische Linker command file gesucht, 
aber halt schon nach 30sek aufgehört, das muß auch aus AVR Studio heraus 
direkt irgendwie gehen.

von timebeast (Gast)


Lesenswert?

Puh, keine AVR-Studio Nutzer, alles nur eingefleischte Makefile 
Programmierer hier?

Hm,... :-(

von Doktor Gnadenlos (Gast)


Lesenswert?

Hallo,
Du musst das Makefile öffnen und folgenden Eintrag tätigen bzw. ergänzen 
:

## Linker flags
LDFLAGS = $(COMMON) -Ttext=0x3800

Also, die Anweisung "-Ttext=0x1E000" setzt praktisch die Startmarke. 
Aber nicht vergessen, Du musst noch das BOOTRST-Flag programmieren und 
evt. die Bits BOOTSZ0 und BOOTSZ1 programmieren.

von Peter D. (peda)


Lesenswert?

timebeast wrote:
> Puh, keine AVR-Studio Nutzer, alles nur eingefleischte Makefile
> Programmierer hier?

Nö, aber statt C mit tonnenweise Inline-Assembler zu benutzen, nehme ich 
einfach gleich Assembler und da tuts dann ne simple .org-Anweisung.

Für unter 256 Words Bootloadercode lohnt sich kein C.

Außerdem ist Code in Assembler so schön universell, man muß nicht für 
jeden AVR-Typ extra am Make-File rumeditieren.
Nur das entsprechende Include mit den Register-Definitionen eintragen, 
fertisch.


Peter

von David M. (md2k7)


Lesenswert?

Hallo,

unter Project -> Configuration Options und dann Memory Settings lassen 
sich im AVR-Studio ebenfalls Speichersegmente fürs automatisch 
generierte Makefile einstellen, dort dann einfach die Adresse der .text 
Section einstellen.

von Gast (Gast)


Lesenswert?

wozu überhaupt c wenn du nicht lernen willst
damit umzugehen ??

Gast

von timebeast (Gast)


Lesenswert?

Hallo Leute,
vorweg möchte ich mich erstmal bei:
 - allen "eingefleischten Makefile Programmierern", hi hi
 - allen AVR DUDE Nutzern
 - allen Linux Nutzern
entschuldigen!!!
Es gibt einen Punkt da sollte man einfach die Finger von der Tastatur 
nehmen und irgendwas anderes machen. Ich zum Beispiel hab gestern 
einfach mal wieder mein Quartalssäufer dasein ausgelebt :-). Also, keine 
"Beleidigungen" mehr, war ja auch völlig daneben von mir, sorry.

@Peter:
Oh ja Assembler, ich liebe Assembler, 80% meiner Programme sind in ASM. 
Das Problem in diesem Fall ist halt das ich ein fremdes Projekt 
bearbeite. Kennst Du wahrscheinlich auch, "Megaload". Ich fand die GUI 
auf PC Seite so nett. Und der Bootloader funktionierte augenscheinlich 
auch recht gut, bis mir aufgefallen ist, das man ihn "triggern" (also 
irgend ein Zeichen über RS232 senden) muß, bevor er das normale Programm 
abspult. Naja, und dieser Bootloader ist halt in C geschrieben...

@David Madl:
Ja, super, genau so eine Antwort hatte ich mir erhofft, danke, werde ich 
gleich mal ausprobieren, danke!

@Gast:
Was hat C Programmierung mit Makefile Erstellung zu tun? Ich meine, 
also, äh, normalerweise programmiere ich auf PC Seite mit 
Eclipse->GCC->Qt Bibliothek. Und das auch soweit recht sicher. 
Alternativ programmiere ich in den Laboren auf Visual Studio. Aber 
Makefile? Wenn ich eine Programmieraufgabe lösen will, fang ich doch 
nicht an die Programmierung von Visual Studio nachzuvollziehen? Ich 
meine, könnte ich das, ja, dauert halt nur, will ich das, nein. Wozu 
gibt es Programme die einem diese, nicht persöhnlich oder so nehmen, ist 
völlig wertfrei gemeint, Blindleistung abnehmen. Und ich denke das hat 
aber auch gar nichts mit meinen C Kenntnissen zu tun, oder das ich mich 
nicht damit auseinander setzten will. Daher auch das Beispiel mit Linux. 
Ich wollte nen Brief schreiben, so mit nur orginal Software, also Linux 
Debian auf die Kiste installiert, er erkennt meine Festplatte nicht,... 
einen Monat später hatte ich die Raid Karte meiner Festplatten am 
laufen, Treiber neu kompeliert. Ich kenne nun fast jede Bibliothek von 
Debian mit Vornamen (zumindest kommt es mir so vor), der Brief ist bis 
heute nicht fertig. Wirklich, und genau so passiert, mir! Seitdem gilt 
bei mir, Blindleistung um jeden Preis vermeiden!! Und dazu gehört 
definitiv irgendwelche kryptischen .txt Dateien zu fixen. Das gilt 
natürlich nur für meine Person, und, ja, ich bin auch nen Stückweit 
faul, he he, kein Zweifel.

Schöne Grüße
Ralf

von Peter D. (peda)


Lesenswert?

timebeast wrote:

> Oh ja Assembler, ich liebe Assembler, 80% meiner Programme sind in ASM.

Die Applikationen schreibe ich schon in C, also da, wo es auch Sinn 
macht.
Assembler würde ich nur bis max 2kB Flash einsetzen.


> Das Problem in diesem Fall ist halt das ich ein fremdes Projekt
> bearbeite. Kennst Du wahrscheinlich auch, "Megaload".

Ich hab da mal reingeguckt.
Die ATtinys und den ATmega48 scheint er leider garnicht zu unterstützen.
Und da steht zwar was von automatischer Baudratenerkennung, bloß im Code 
kann ich die nirgends finden?


> Ich fand die GUI
> auf PC Seite so nett.

Naja, ein Bootloader hat ja nur eine einzige Aufgabe, da finde ich eine 
extra GUI ziemlich überflüssig, eher sogar als unnötig umständlich.
Man übergibt den Filename als Argument, fertisch.

Ich hab ja das Protokoll für meinen Bootloader veröffentlicht, könnte 
gut sein, daß bald jemand ne Maus-Schubser-GUI dazu fertig hat.
Ich bin mit Windows-Programmen ja nicht so fit.


> Und der Bootloader funktionierte augenscheinlich
> auch recht gut, bis mir aufgefallen ist, das man ihn "triggern" (also
> irgend ein Zeichen über RS232 senden) muß, bevor er das normale Programm
> abspult.

In der Source ist aber ein Timeout angegeben, wenn er nichts empfängt, 
dan startet er die Applikation. Ich weiß aber nicht, wie lange das 
dauert (ist ne Delayschleife).

Mir war allerdings nur ein einziges Zeichen zu unsicher, daher habe ich 
eine Bytesequenz definiert, um in dem Bootloader zu kommen.

Wäre ja irgendwie blöd, wenn auch die Applikation die UART benutzt und 
zufällig das Zeichen empfängt und sich dann selbst zerstört.


Peter

von R. Q. (timebeast)


Lesenswert?

Hallo Peter,
jupp stimmt, die automatische Baudraten Bestimmung ist rausgeflogen. 
Dieses rumgesuche von 30sek hat wohl mehreren Leuten sauer aufgestoßen.

>Naja, ein Bootloader hat ja nur eine einzige Aufgabe, da finde ich eine
>extra GUI ziemlich überflüssig, eher sogar als unnötig umständlich.
Naja, um genau zu sein hat Dein Programm ja auch eine GUI, zwar eine 
sehr rudimentäre aber auf einer Konsole einen Text bzw. Befehl 
einzutippen ist halt auch eine art GUI.

>Naja, ein Bootloader hat ja nur eine einzige Aufgabe
Äh, naja, wahrscheinlich klingt das jetzt besser wisserisch, aber so 
gesehen hat der ganze Processor nur eine einzige Aufgabe. Ich meine, man 
kann mit dem Bootloader ja nicht nur den Flash beschreiben, man kann 
auch Bootloader Lock Bits setzten, man kann das EEProm beschreiben, 
testen ob der uC noch in ordnung ist, man kann sogar den Bootloader mit 
dem Bootloader neu flashen. Ich finde das sind schon eine Menge Sachen 
mehr als nur eine einzige Aufgabe.

>In der Source ist aber ein Timeout angegeben
Hast Du noch eine alte Version des Megaload, war das darmals schonmal 
drin? Das es jetzt drin ist ist klar, hab ich ja nun selber 
reingeschrieben.

>Mir war allerdings nur ein einziges Zeichen zu unsicher
Naja, ich meine, wie wahrscheinlich ist es bitte das ausgerechnet beim 
Einschalten ein ">" über die RS232 Schnittstelle gesendet wird. Es ist 
ja nun nicht so das der Bootloader die ganze Zeit im Hintergrund 
mitläuft, er wird halt im Reset Fall einmal angesprungen. Wieviele ">" 
Zeichen Du dann im Programmcode über RS232 sendest ist doch egal.

>Wäre ja irgendwie blöd, wenn auch die Applikation die UART benutzt und
>zufällig das Zeichen empfängt und sich dann selbst zerstört.
Hä, was, wie soll das denn gehen??? Oder guckt Dein Programm 
permanent... nein, wenn die Applikation ausgeführt wird ist der 
Bootloader lang aus dem rennen, sorry, keine Selbstzerstörung in Sicht.

Probleme hab ich aber trotzdem noch, also um genau zu sein hat sich halt 
an meinem Problem noch nichts geändert.
Der Tipp von David Madl war schon sehr gut, aber das waren halt nur 50%. 
Ich habe mir jetzt also in AVR Studio ein Speichersegment erstellt. 
Memory Type=Flash, Name=.bootloader,Adress=0xe00, wunderbar. Aber das 
muß ich ja nun noch irgendwie meinem Programm mitteilen das es dieses 
Speichersegment nutzt. Tja, nur wie? In C!
Einfach an den Anfang des Programms ".bootloader" schreiben geht nicht, 
Fehler.

Jemand einen Vorschlag. Also einen Vorschlag wie man das in AVR-STUDIO 
in C hinbekommt?

Grüße
Ralf

von Jörg X. (Gast)


Lesenswert?

Du musst allen Sachen (Funktionen, Konstanten..) die in diese 'Section' 
gehören, ein __attribute__((section(".bootloader"))) verpassen (Prototyp 
genügt):
1
//...
2
int write_flash(unsigned char* src, unsigned char* dest) __attribute__((section(".bootloader")));
3
4
//um das abzukuerzen bietet sich ein Makro an:
5
#define BOOT __attribute__((section(".bootloader")))
6
int write_flash(unsigned char* src, unsigned char* dest) BOOT;
und rtfm ;)
Besonders die Doku zu <avr/boot.h> in der avr-libc, da gibt's auch schon 
ein Macro BOOTLOADER_SECTION...
(Doku findest du offline und ...PFAD_ZU_WINAVR 
\doc\avr-libc\avr-libc-user-manual\...
hth. Jörg

ps.: kann man wirklich in einem Projekt/Programm AVR-Studio-Assembler 
und AVR-GCC-C-Code kombinieren?
Ich dachte, da muss man auf AVR-GAS (d.h. GNU-Assembler - mächtiger, 
aber ein klein bischen anders) ausweichen...

von R. Q. (timebeast)


Lesenswert?

Moin Jörg X,
puh, viel geschreibe, aber oky, werd´s so machen.
Ich hab das Manual gelesen, bzw. die Hilfe von AVR-Studio, da wird aber 
"nur" die boot.h erklärt, auf die ich, da ich einen fremden Code fixen 
muß, nicht zugreifen kann, bzw. will, da ich soviel wie möglich vom 
original Code behalten will.
In dieser Hilfe stehen ja auch super intressante Sachen, wie man 
allerdings ganze Programmteile in eine bestimmte Section verfrachtet 
leider nicht :-(
Aber dafür gibt es ja zum Glück leute wie Dich :-)

Im übrigen, Inline Assambler ist gar nicht so schwer und geht wunderbar. 
Wie es genau funktioniert wird hervorragend hier im GCC-Tutorial 
erklärt.

Gruß
Ralf

von R. Q. (timebeast)


Lesenswert?

ha, genau, und das avr-libc-user-manual gibt über dieses Problem im 
übrigen auch keine Auskunft. Man sollte halt davon ausgehen das es 
unter:
 - Memory Areas and Using malloc()
 - Memory Sections
 - Data in Program Space
zu finden ist. Ist es aber nicht.

Im übrigen hab ich das gerade ausprobiert, und es klappt nicht :-(

Er schreibt mir den gesamten Code immer noch ganz an den Anfang des 
Flash, also ab Adresse 0x000.

Gruß
Ralf

von R. Q. (timebeast)


Lesenswert?

nein, sorry, mein Fehler macht er wohl jetzt doch, ich hab nur noch 
nicht alle Funktionen erwischt, wie´s aussieht ;-)

von R. Q. (timebeast)


Lesenswert?

nein, das war´s trotzdem noch nicht, ich krieg´s nicht hin, unglaublich, 
in sämtlichen Dokus steht ausnahmslos nichts darüber...

Immerhin, mit dem Boot macro läd er wohl nun einen gewissen Teil nach 
unten im Speicher... aber 50% stehen immer noch oben, nerv. Müssen 
vielleicht auch die Defines in irgendeiner Weise "verschoben" werden?

Leider sehe ich auch keine Möglichkeit herauszufinden welchen Teil er 
nun nach unten schreibt bzw. interessanter, welchen Teil er nicht nach 
unten schreibt...


Gruß
Ralf

von Jörg X. (Gast)


Lesenswert?

Hast du eigentlich mal versucht die ganze section ".text"(d.h. ALLES was 
normalerweise in den flash gehört) in den Bootloaderbereich zu 
verschieben ?

> Leider sehe ich auch keine Möglichkeit herauszufinden welchen Teil er
> nun nach unten schreibt bzw. interessanter, welchen Teil er nicht nach
> unten schreibt...
Lass dir mal ein .lss-File erzeugen (unter "Project"->"Configuration 
Options"->Haken bei "create List-File"). Da kannst du dir den erzeugten 
Asm-Code anschauen - inkl. der Addressen(Vorsicht! Die Flashadressen 
sind AFAIK in _Byte_-Adressen angegeben, und nicht wie im 'Studio üblich 
in Wordadressen).

Und hier in der Codesammlung gibt's bestimmt einen Bootloader in C, bei 
dem du 'abkucken' kannst ;)

hth. Jörg

von R. Q. (timebeast)


Lesenswert?

>Hast du eigentlich mal versucht die ganze section ".text"(d.h. ALLES was
>normalerweise in den flash gehört) in den Bootloaderbereich zu
>verschieben ?

Permanent, das ist doch genau das Problem, das ich nicht weiß wie!
einfach ".text" an den Anfang des Programms zu schreiben geht nicht.

>Und hier in der Codesammlung gibt's bestimmt einen Bootloader in C, bei
>dem du 'abkucken' kannst ;)

ja, naja, nicht wirklich, ich meine, mit AVR Dude wäre es wohl nicht das 
Problem, da man dort halt wie oben schon beschrieben im Makefile einfach 
die nötigen Angaben machen kann (so was in der Art: += 
-Wl,--section-start=.text=$(BOOTLOADERSTARTADR)) Meine Frage ist und 
bleibt halt wie das aus AVR Studio heraus geht. Ich finde halt die 
automatische Makefile Erstellung arbeitserleichternt, und, wenn einmal 
verstanden, wesendlich Fehler unanfälliger (angefangen mit 
Schreibfehlern).

Gruß
Ralf

von Jörg X. (Gast)


Angehängte Dateien:

Lesenswert?

Einfach so ".text" in den Bootloaderbereich schieben wie im Anhang.
MERKE: Der gesamte Programmcode, der KEIN extra 
__attribute__((section...)) hat, landet automatisch in ".text".

hth. Jörg

von R. Q. (timebeast)


Lesenswert?

Ich fass es nicht, das hat geklappt!!!! Du hast in Deutschland gerade 
jemanden sehr sehr glücklich gemacht :-)

Für meinen ATmega 8 ist die Speicheradresse halt 0xe00, damit klappt es 
aber, jippi, ich wußte das kann nicht soooo schwer sein, wenn man nur 
weiß wie´s geht, ein Hoch auf Jörg!

Leider hab ich nun auch die Gewissheit das der bisherige Code noch 
Fehler aufweist, aber im Grundsatz geht es schonmal, vor allem kann ich 
nun endlich mit dem eigendlichen Problem, der Programmierung, beginnen.

Vielen vielen Dank nochmals

Gruß
Ralf

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.