Forum: Mikrocontroller und Digitale Elektronik CodeVisionAVR Bootloader


von Mark (Gast)


Lesenswert?

Hallo,

Ich beschäftige mich gerade mit dem Thema Bootloader.
mit Hilfe des Forum hier habe ich es bereits folgendes geschafft.



Nach dem Reset springt der Controller in den Bootloader,
dies wird mir angezeigt durch 2maliges blinken einer LED.

Danach Springt er mit folgendem Befehl "void (*start)( void ) = 
0x0000;"in das Anwenderprogramm.
Dies wird mir wiederrum durch eine 2te LED angezeigt.

Mein nächster Schritt wäre wieder vom Anwenderprogramm in den Bootloader 
zu springen.

Hierfür würde ich folgenden Befehl verwenden.
void (*bootloader)( void ) = 0x3800;

Diese Befehle habe ich aus dem Beitrag:
http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung


Nun zu meinem Problem:
Sobald ich eine andere Adresse als 0x0000 eingebe. (in meinem Fall die 
0x3800) meldet der Compiler folgenden Fehler:

Error: a value of type 'int' can't be used to initialize an entity of 
type 'void (*)()'


Noch allgemeine Infos:
Verwende einen ATmega32
und Programmiere mit CodeVisionAVR

Recht herzlichen Dank für alle hilfreichen Hinweiße. Danke

Mfg
Mark

von Thomas E. (thomase)


Lesenswert?

Mark schrieb:
> Error: a value of type 'int' can't be used to initialize an entity of
> type 'void (*)()'

Du mußt deinem Compiler sagen, daß das ein Pointer ist.

void (*pApplicationSection) (void) = (void*)0x3800;

Ist bei AVR-Studio mit GCC jedenfalls so. Da gibt es zwar keine 
Fehlermeldung, sondern nur ein Warning, aber aus dem gleichen Grund. Und 
das sollte jeder andere C-Compiler auch anmeckern.

Ist davon abhängig, wie "scharf" der Compiler eingestellt ist.

Bei 0 ist ihm das egal. Weil 0 ist eben auch NULL. Aber andere Werte 
sind Integerzahlen und keine Pointer und müssen explizit gecastet 
werden.

mfg.

von Mark (Gast)


Lesenswert?

Danke, das klang sehr verständlich.
allerdings sagt mir mein CodeVision Compiler bei:


   void (*bootloader)(void) = (void*) 0x3800;

Error: a value of type 'void *' can't be used to initialize an entity of 
type 'void (*)()'

)-:

von Thomas E. (thomase)


Lesenswert?

Mark schrieb:
> Error: a value of type 'void *' can't be used to initialize an entity of
>
> type 'void (*)()'

Nervensäge.

Dann geb' ihm das als Type:

void (*bootloader)(void) = (void (*)()) 0x3800;

Beim AVR-GCC compiliert das fehlerfrei.

Wahrscheinlich ist das mit (void*) noch ein bisschen schlampig.

mfg.

von Mark (Gast)


Lesenswert?

darauf hätte ich nun aber auch selber kommen sollen. Danke

Controller springt jetzt zwischen Bootloader und Anwendung hin und her.
Wie schön (-:

mfg
Mark

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.