Cortex M3 te çağrılan fonksiyonun adresi alınabilir mi ?

Başlatan AsHeS, 25 Temmuz 2014, 10:28:46

AsHeS

Alıntı yapılan: z - 26 Temmuz 2014, 01:15:31
Ama sen ilgili fonksiyonun giris noktasini ariyorsun.

Yani

void func()
{
.....
.....
.....
---> exception noktasi
----
----
}

Exception noktasini yakalayabilirsin. Ama func adresini tespit etmek cok zor.



mesaj birleştirme:: 26 Temmuz 2014, 01:16:44

Ama debug rutininden ben zaten bu satirin hangi fonksiyon icinde oldugunu biliyorum kendim anlarim dersen olur tabiki.
.map dosyasının dizilimini incelediğimizde ardı ardına dizilmiş fonksiyonların alanlarını görebiliyoruz. Örneğin ;
.text.LCD_DisplayChar
                0x08001f64       0x44 ..\obj\driver.o
                0x08001f64                LCD_DisplayChar
.text.LCD_DisplayString
                0x08001fa8       0x60 ..\obj\driver.o
                0x08001fa8                LCD_DisplayString

Eğer exception noktası 0x08001f75 ise LCD_DisplayChar fonksiyonunun içerisidir diye yorumlanabilir. Amacım debugger kullanmadan bu işleri hallettmek.

void HardFault_Handler()
{
     asm("TST    LR, #4");//
     asm("ITE EQ");
     asm("MRSEQ R0, MSP");
     asm("MRSNE R0, PSP");
     asm("B __cpp(mon_dump_stack)");


}

mon_dump_stack(uint32_t stack[])
{
....//Okuma işlemleri
};


Bu şekilde alınabilir gibi duruyor ?

AsHeS

Alıntı yapılan: gerbay - 26 Temmuz 2014, 01:45:24
aynen öyle hocam, stack[6]  da tam olarak olaya sebep olan instruction larin adresi var..
.map dosyasını da inceledik mi ilgili adresi iki fonksiyon adresi arasına kıstırırız böylelikle düştüğümüz yeri bulabiliriz denemelere geçeyim hemen.

mesaj birleştirme:: 26 Temmuz 2014, 01:58:11

GCC (CooCox IDE) ile kod düşülen yerin adresini alan kod aşağıda ki şekilde

void mon_dump_stack(unsigned long int stack[])
{
	unsigned long int fault_pc_addr;

	fault_pc_addr = stack[6];
	return;
}
void   HardFault_Handler(void){
    asm("TST    LR, #4");//
    asm("ITE EQ");
    asm("MRSEQ R0, MSP");
    asm("MRSNE R0, PSP");
    asm("BL mon_dump_stack");
	while(1)
	{};
}


mon_dump_stack te zorla UART donanımına birşeyler söylettirerek adresi alır ve .map dosyası ile inceleyebilirim.

@z , @gerbay ve @X-Fi hocam yardımlarınız için teşekkür ederim.

X-Fi

Ds5 professional ve realview mdk için aşağıdaki şekilde düzenlemek gerekti denedim çalışıyor.

unsigned long PC_Fault;

void HardFault_Handler_C(unsigned long * HardFault_Args) 
{ 
    PC_Fault=HardFault_Args[6];
    while(1)
    {
    }
}

__asm void HardFault_Handler(void) 
{
		TST LR, #4
		ITE EQ
		MRSEQ R0, MSP
		MRSNE R0, PSP
		B __cpp(HardFault_Handler_C)
}


Birde .map dosyasında girilen adresi bulan ve fonksiyon ismini yazdıran bir C# penceresi yapan olurda paylaşırsa seviniriz.

Herkeze iyi çalışmalar.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)