Funktionsadresse

OP #4554176
Lesenswert?
• ▲
▼
Hallo zusammen,

ich bin immer noch an einem Bootloader für einen Attiny45 dran. Hierfür 
möchte ich auf eine Funktion aus dem Bootloader aus den geladenen 
Programm drauf zugreifen.

In der Bootloader.lss Datei sehe ich ja die Funktion inkl. der Adresse:

...
0xd9e <CheckUsiStart>
....

In dem zu ladenen Program deklariere ich die Funktion wie folg:
unsigned char (*CheckUsiStart) ( void );

Jetzt habe ich mal zwei Fragen:

1. Warum muss ich die Adress durch zwei teilen?
2. Wie bekommen ich das Warning weg? "warning: assignment makes pointer 
from integer without a cast"

Hier die Zuweisung der Adresse:
CheckUsiStart = 0xd9e/2;

Funktionieren tut das Ganze.

Vielen Dank vorab

Gruß

Frank
OP #4554372
Lesenswert?
• ▲
▼
Hi The Daz, hi Georg G.,

vielen Dank. Mit einer weiteren Klammer ist es tatsächlich weg.

CheckUsiStart = (void*)(0xd9e/2);

Ist auch logisch. Saß wohl gestern auf der Leitung.

Adresse: Ist tatsächlich so. Deim Aufruf der Adresse wird diese mit 2 
multipliziert. Habe mit der Info den folgenden Link gefunden:

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung#Z-Pointer_leicht_verst.C3.A4ndlich


Gruß

Frank
#4554475
Lesenswert?
• ▲
▼
Nur so eine Bemerkung am Rande:
Der Aufruf einer Funktion im Bootloader oder auch jedem anderen 
Programmcode, der von der eigentlichen Applikation unabhängig compiliert 
wird, ist etwas problematisch. Wenn Du mal den Bootloader irgendwie 
modifizierst, stimmt die Adresse nicht mehr und die Applikation läuft 
nicht mehr oder muss auch angepasst werden.
Da solltest Du evtl. mal über einen anderen Aufruf-Mechanismus 
nachdenken, z.B. eine Sprungtabelle an einer bestimmten Adresse, 
Software Interrupt oder eine einzige, fest definierten Einsprungadresse 
mit der Übergabe einer Funktionsnummer.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren