Funktionsadresse ermitteln + mit Map-File vergleichen

Gast #2912360
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
#2912387
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.
Persönliche Seite #2912451
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.