Romun belirli bolgelerine kod yerlestirmek

Başlatan z, 11 Mayıs 2014, 22:21:00

z

Romdaki adreslerini kendim belirleyecegim alanlara kod yerlestirmem gerekiyor.

C'de  deneme yaptim. Gercekten de fonksiyonlara erisilmek istenen main satirinda istedigim adresdeki fonksiyonlar cagriliyor.
Fakat fonksiyonlarin yerlesecegi adrese baktigimda buralara kod yerlesmedigini goruyorum.

ASM kod denemesinde ise ilgili adrese yerlesecek komutlar kahverengi renkte aciklama satiri olarak yazilmis. Fakat gercek kodlar yazilmamis.

Bu durumun 32K sinirli versiyon kullanmamdan kaynaklandigini dusunuyorum.

Bu tip calisma yapan varmi?

Asagidaki kodlari Keil (Full) de deneyip sonucu bildirecek varsa sevinirim. (Linker sayfasinda scatter dosyasi acmayi ve icine asagidaki scatter satirlarini eklemeyi unutmayin)

volatile int a;

int My1(int);
int My2(int);

#pragma arm section code

void SystemInit()
{
    a=1;                
}


int main()
{
    return(My2(My1(1))+1);     
}

#pragma arm section code="My1"

int My1(int a)
{
    a++;      
    return(a);
}

#pragma arm section code="My2"

int My2(int a)
{
    a++;
    return(My1(a));
}



; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00001000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  
  ER_IROM2 0x08001000 0x00001000  {  ; load address = execution address
   *.o (My1)
;   .ANY (+RO)
  }

  ER_IROM3 0x08002000 0x00001000  {  ; load address = execution address
   *.o (My2)
;   .ANY (+RO)
  }

  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Icarus

Scatter File yanlış, muhtemelen pragmalar'da yanlış.
Scatter file'da direk sembol ismi verebilirsiniz.

z

Mevcut haliyle derleniyor uyari dahi vermiyor. Yanlislik nerede?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Icarus

sf'de sadece overlap olursa hata verir. onun dışında bir kontrol yok. her zaman derlenir

z

Istersen scatter uzerinde bir seylerle oynamayi dene yanlis bir sey yap. Aninda uyariyi yiyorsun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

AsHeS

@z hocam aşağıda ki linkte benim kendimce aradığım stil yazıyor fakat sıkıntım adresi ben elle vereceğim için derleyici oraya dallanıp benim adresimi ezebilir mi ?

int sqr(int n1) __attribute__((section(".ARM.__at_0x20000")));

int sqr(int n1)
{
    return n1*n1;
}

http://www.keil.com/support/man/docs/ARMLINK/armlink_BABHIIEF.htm
http://www.keil.com/support/man/docs/ARMLINK/armlink_BABDJCAA.htm

z

Bemim adresimi ezermi derken;

Bu adrese ben kodumu yerlşeştireceğim ama diğer taraftan derlenen diğer kodlar bu adresin üstüne yerleşirmi diyorsan sistem bu kadar basit bir hata yapmaz sanmıyorum.

Senin çözüm iyiymiş de bama bunun ASM çözümü lazım.

Sorunumu tekrar yazacak olursam;

Scatter dosyasında rom adreslerini belirliyorum. Mesela 1. bölge 2. bölge şeklinde

Ardından programımda 1. Bölgeye  2. bölgedeki fonksiyonu çağıran basit bir kod yazıyorum.
2. Bölgeye de basit bir fonksiyon yazıyorum.

Derleme yapıp çipe yüklediğimde 1. Bölgedeki program 2. bölgedeki fonksiyonu çağıran kodu içeriyor. Adresi de doğru. Adımlattığımda 2. bölgeye gidiyor fakat fonksiyonuma ait kodlar yok. Fakat kodlara ait açıklamalar yerinde.

Keil'in 32K sınırı aşılmış versiyonu ile deneme yapacak yardımsever de çıkmadı.

Yaralı parmak burada sidik sizde.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Erol YILMAZ


z

Bir ara kırmıştım daha sonra neden kırılmamış bir versiyona döndüm hatırlamıyorum.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com