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...
jupp, genau, da mir das allerdings nichts bringt habe ich extra dazu geschrieben das ich in C programmiert habe...
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.
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.
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.
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
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.
wozu überhaupt c wenn du nicht lernen willst damit umzugehen ?? Gast
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
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
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
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...
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
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
nein, sorry, mein Fehler macht er wohl jetzt doch, ich hab nur noch nicht alle Funktionen erwischt, wie´s aussieht ;-)
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
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
>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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.