Forum: Mikrocontroller und Digitale Elektronik Funktionsadresse ermitteln + mit Map-File vergleichen


von Ben (Gast)


Lesenswert?

Hallo,

zur Fehlerausgabe habe ich mir eine "assert"-Funktion geschrieben, die 
im Fehlerfall aufgerufen wird. Dieser Funktion wird die Funktionsadresse 
und weitere Parameter übergeben, welche diese Informationen dann über 
die RS232 verschickt.

Hier ein Codeausschnitt, der sich auf das wesentliche beschränkt:
1
void assert(uint16_t u16_adress)
2
{
3
   uart0_putlong((Uint32) u16_adress);
4
}
5
6
void test1(void)
7
{
8
   ...
9
   //Fehler
10
   assert((uint16_t) test1);
11
}

Hier ein Ausschnitt aus einem Map-File:
1
 .text          0x000005dc      0xeec ./fat.o
2
                0x0000086c                fat_loadSector
3
                0x000013ba                fat_loadFileDataFromDir
4
                0x00000648                fat_loadRowOfSector
5
                0x000006b0                fat_loadFatData
6
                0x000005dc                fat_clustToSec

Die Ausgabe erfolgt, aber die Funktions-Adresse passt nicht mit den 
Angaben der Map-File (*.map) überein.
Seht ihr, was ich falsch mache?

(Ich verwende ATmega128, Eclipse, Win7.)

Gruß
Ben

von Klaus W. (mfgkw)


Lesenswert?

Ich sehe in deinem Mapfile überhaupt kein test1, abgesehen davon weiß 
niemand deine assert-Ausgabe.

Zudem geht die Angabe in den Mapfiles davon aus, daß alles ab Adresse 0 
liegt - keine Ahnung, ob das bei dir so ist. Wenn nicht, muß man 
natürlich noch die jeweilige Startadresse addieren.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Um die Adresse der Callers zu bekommen geht sowas:
1
#include <stdlib.h>
2
3
unsigned long caller;
4
5
__attribute__((noreturn,noinline))
6
void abort (void)
7
{
8
    caller = 2L * (unsigned) __builtin_return_address (0);
9
    // panic-code
10
    __builtin_unreachable();
11
}
 
Allerdings würd ich alles, was nach dem assert() kommt, in Assembler 
implementieren, um noch halbwegs sinnvolle Ausgaben machen zu können -- 
man weiß ja nicht, weshalb das assert zugeschlagen hat.  Wenn's ein 
Stacküberlauf ist oder wildgewordene Zeiger, etc. ist es nicht mehr 
sinnvoll, mit C weiterzumachen.

Das Beispiel ober liefert übrigens die Adresse, von der aus abort 
aufgerufen wurde.  Gibt es im Programm zB 100 Aufrufe von abort, kann 
damit das entsprechende abort zugeordnet werden.

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.