Forum: Mikrocontroller und Digitale Elektronik Bootloader von ASM nach C portieren?


von tobiTob (Gast)


Lesenswert?

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

von tobiTob (Gast)


Lesenswert?

Was ich total vergessen hab...

Chip ist ein ATmega 16 und programmiert wird der in AVRGCC im AVR 
Studio...


Gruß
Tobi

von nop(); (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ansonsten kannst du mit Atmels appnote AVR109 anfangen.

Im GCC-Forum könntest du bei weniger Gesamtdurchfluss auf mehr
AVR-GCC-Kompetenz treffen.

von Der M. (steinadler)


Lesenswert?

Kannst du nicht in deinen C-Code asm-Code einbinden???

von tobiTob (Gast)


Lesenswert?

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

von tobiTob (Gast)


Lesenswert?

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

von Der M. (steinadler)


Lesenswert?

Wie man asm-code einbindet, müsste in deiner c-compiler-beschreibung zu 
finden sein.
Die Adresse vielleicht mit .ORG?

von Peter D. (peda)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Jörg Wunsch wrote:

> Oder dass er doch einfach den Bug repariert bekommt, weil er alles
> neu schreibt...

Welchen Bug ?


Peter

von tobiTob (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von tobiTob (Gast)


Lesenswert?

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

von tobiTob (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.