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
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.
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
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...
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...