Forum: Mikrocontroller und Digitale Elektronik Funktionsadresse


von Frank Z. (frankza)


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

von The D. (thedaz)


Lesenswert?

Frank Z. schrieb:
> CheckUsiStart = 0xd9e/2;

CheckUsiStart = (void*)0xd9e/2;

beseitigt die warning

von Georg G. (df2au)


Lesenswert?

Frank Z. schrieb:
> 1. Warum muss ich die Adress durch zwei teilen?

Weil bei AVR der Programmspeicher meist in Worten gezählt wird. Das geht 
leider etwas durcheinander.

von Wolfgang (Gast)


Lesenswert?

Frank Z. schrieb:
> 1. Warum muss ich die Adress durch zwei teilen?

Damit der µC richig versteht, an welcher Stelle in seinem Flash der 
Programmeinsprungpunkt ist ;-)

von Frank Z. (frankza)


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

von Thomas E. (picalic)


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.

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.