mikrocontroller.net

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


Autor: tobiTob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tobiTob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ich total vergessen hab...

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


Gruß
Tobi

Autor: nop(); (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ansonsten kannst du mit Atmels appnote AVR109 anfangen.

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

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du nicht in deinen C-Code asm-Code einbinden???

Autor: tobiTob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tobiTob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Micha (steinadler)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:

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

Welchen Bug ?


Peter

Autor: tobiTob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tobiTob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: tobiTob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.