Hallo, ich habe mal einen Bootloader in ASM geschrieben, der ist auch soweit fertig und funktionier 1A. Nun möchte ich diesen, weil er mich nie im Stich gelassen hat, in C portieren. Wie läuft das in C ab? Ich meine das FUSE Bit das er im Bereich des Bootloader starten soll ist klar zu setzen. Nur wo schreib ich meinen Code hin also das er auch im BOOT Segment ladet? Ich muß außerdem den UART Aktivieren, gibt es für den BL einen extra Abschnitt wo man das einfügen kann. Würde mich freuen wenn mir jemand das Prinzip erläutern könnte, ich habe zwar ne Weile gebraucht es in ASM umzusetzen, doch in C sollte es auch klappen wenn man die Grundlage weiß was wo hin muß. MfG Tobi
Was ich total vergessen hab... Chip ist ein ATmega 16 und programmiert wird der in AVRGCC im AVR Studio... Gruß Tobi
Ich kann nur davon abraten. Nach laengeren erfolglosen Compilerversuchen hab ich meinen Bootloader nun in ASM geschrieben. Der Compiler hat in den meisten Faellen zuviel Platz verbloedet. Wenn nur 1000 ASM intruktionen da sein duerfen wird's eng fuer Compiler.
Ansonsten kannst du mit Atmels appnote AVR109 anfangen. Im GCC-Forum könntest du bei weniger Gesamtdurchfluss auf mehr AVR-GCC-Kompetenz treffen.
Ok, das wäre auch eine Möglichkeit das ganze so zu lassen wie es ist. Also in ASM, nur dann kommt die andere Frage, wie bindet man das ein, weil das eigendlich Programm ja in C geschrieben ist, also das MAIN. Es ist mir weder der eine noch der andere Weg klar, da nützt es wohl auch nichts wenn der eigendliche Quelltext vom Bootloader in einem reinen ASM Programm läuft wie Schmidt's Katze... :-( Gruß Tobi
Ok danke für Eure Antworten, ich glaube das ASM in C einbinden wäre mein idialer Weg, so kann da nix schief gehen. Nur wie macht man das nun... :-( puhhschnief In erster Linie muß ich nun erstmal wissen wo ich meinen Code auf die Bootloader Start Adresse lege. Dann kann ich da schonmal die eigendliche Entscheidung festlegen, also ob er ins MAIN soll oder im BOOT bleiben soll. Dann muß man die Interrupts noch umlegen da ich die eigendlichen Daten die programmiert werden sollen über den UART empfange. Ob das alles so funktioniert... Gruß Tobi
Wie man asm-code einbindet, müsste in deiner c-compiler-beschreibung zu finden sein. Die Adresse vielleicht mit .ORG?
tobiTob wrote: > ich habe mal einen Bootloader in ASM geschrieben, der ist auch soweit > fertig und funktionier 1A. > > Nun möchte ich diesen, weil er mich nie im Stich gelassen hat, in C > portieren. Das ist doch ein Widerspruch, Du willst etwas ändern, WEIL es 1A funktioniert ! Den einzigen Effekt, den Du mit C erreichst ist, daß Du mehr Code brauchst. Peter
Peter Dannegger wrote: > Den einzigen Effekt, den Du mit C erreichst ist, daß Du mehr Code > brauchst. Oder dass er doch einfach den Bug repariert bekommt, weil er alles neu schreibt...
Jörg Wunsch wrote: > Oder dass er doch einfach den Bug repariert bekommt, weil er alles > neu schreibt... Welchen Bug ? Peter
Ok, nun ich wollte eigendlich bei einer Sprache beleiben und es deshalb in C machen. Ich bin jetzt soweit das nach dem RESET meine Bottloader Routine wirklich angesprungen wird, was mir nun noch fehlt ist das umstellen der Interrupt. Im Main ist es... ISR(USART0_RX_vect) { bufin[pos_in] = UDR0; pos_in++; pos_in = pos_in & 0x1F; } Der muß nun in den Bootloader Bereich nur wie macht man das nun? Also im Prinzip könnte ich nun die Interrupts "umbiegen" in den Bootbereich, doch wie heist dann die ISR Routine? Also die Zuweisung das nun beim Int. XYZ der aus dem Bootbereich genommen werden soll. Ich denke dann hätte ich meine Grundlagen um mich entscheiden zu können was ich vom eigendlichen bootloader in ASM oder in C einbinde. Gruß Tobi...
Du betrachtest einfach den bootloader komplett als eine eigenständige application und schiebst dessen .text-Segment auf die Bootloader- Adresse. Damit verschiebt sich alles einschließlich der Interruptvektoren.
Dem kann ich nicht folgen... sorry... Also ich weiß das man wie folgt die Vectoren verschieben kann, ldi wrH, (1<<IVCE) ;Enable change of interrupt vectors out MCUCR,wrH ldi wrH, (1<<IVSEL) ;Move interrupts to boot flash section out MCUCR,wrH sei ;INTERRUPTS freigeben Nun das ist in C ähnlich, das bekomme ich schon hin. Die frage sit nun wie heißen die Vectoren in C damit auf wirklich die in BOOTLOADER_SECTION angeflogen werden. ein nochmaliger..... ISR(USART0_RX_vect) { bufin[pos_in] = UDR0; pos_in++; pos_in = pos_in & 0x1F; } führt zur Fehlermeldung das der redefiniert sei, irgendwie logisch ;-) wie sagt man dem compiler das er das Ding im BOOT SEGMENT suchen soll ??? Gruß Tobi...
Ok, nun habe ich 3 Stunden damit verbracht um herauszubekommen wie es ablaufen muß. Wie deklariert man sich einen eigenen Vector? /* Timer/Counter2 Overflow */ #define TIMER2_OVF_vect _VECTOR(10) #define SIG_OVERFLOW2 _VECTOR(10) Ich habe die VECTOREN von MAIN nach BOOT-Section gelegt, nun will ich hier die einzelnen VECTOREN auch ansprechen... Das eigendliche Ziel dürfte dann BOOTSTART in meinem Fall 0x7000 + 10 sein. Wie bewege ich den Compiler dazu das er mich versteht... tischkantebeiß Das denkt sich auch alles wie ich es in ASM verstanden habe aber wie macht man es in C... :( Gruß nochmals der Tobi...
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.