Kebap odullu - Iki proje dosyasi gelistirmek

Başlatan z, 15 Haziran 2014, 15:18:39

z

Aslinda bu sorunu farkli bir baslikta baska bir sekilde sormustum ve sonuclanmadi.

Hafife aldigim bu konu basima dert oldu.

Asagidaki gibi basit bir proje olusturdugumuzu varsayin.


int a;

void main()
{
     a=0;
     while(1)  User();
}

void User()  // Bu fonksiyon 0x0800.1000 adresinde yer alacak.
{
      
}


Gorulecegi uzere kuru kuru donen hic  bir is yapmayan bir proje. Bunu derleyip hexini cipimize atalim ve Projeden cikalim.

Bir proje daha yapalim.

Bunda main vs olmasin.

0x800.1000 adresine yerlesecek sekilde

void User()
{
     a=a+1;  // Bu a ilk projedeki a dir.
}


Bu projeyi de derleyelim ve cipe yukleyelim.
Yukleme esnasinda ilk projenin startup, main vs fonksiyonlari farkli flash sayfasinda oldugu icin onlari sildirmiyoruz. Fakat Flashin 0x0800.1000 adresi her iki proje tarafindan ortak kullanildigi icin buna ait sayfa siliniyor ve yeni proje yukleniyor. Haliyle user() fonksiyonu artik 2. projeden gelmis oluyor.

Simdi Keilde karsimizda sadece bu son proje var. Debug menuye gecip a=a+1 satirina breakpoint koyalim ve debug edelim.

Bununla ilgili proje dosyasi yayinlayabilirmisiniz?

-----------------

Ben nerede takildigimi soyleyeyim.

1. projede user fonksiyonunun diledigim adrese yerlesmesi icin ilkel yontem kullaniyorum. Bunun icin main satiri sonuna ise yaramayan cop veri (0xFF) dolduruyorum ve kac tane olacagina hesap makinesi ile hesaplayip karar veriyorum. Keilde bu cop veri doldurma isini derleyiciye hesaplatmayi beceremedim. space 0x100 gibi deger koyarsam sorun yok derleniyor fakat

Burasi   SPACE 0x1000 - (Burasi - 0x0800000) gibi bir satirla isi derleyiciye yaptirmak istersem burada sabit veri olmasi gerektigi hatasini aliyorum. (Em::Blocks da bu sorun olmamisti)

Cop veriyle ugrasmadan (dogrusu da budur) Scatter dosyada ayri bir segment tanimlarsam bu kez de main satiri dogru adresdeki (0x0800.1000) fonksiyonunu cagiriyor ama 0x0800.1000 adresinde makine kodlari gorunmuyor buna karsilik bu adreslerde mix modda C kodlarina dair aciklama satirlari gorunuyor. C kodlarina ait makine komutlarinin burada oldugu belirtilmis fakat ortada makine kodu yok.

2. projede ise Rom baslangic adresini 0x0800.0000 yerine x0800.1000 tanimlarsam neyse de kodu biraz daha ileri adreslere koymaya kalkarsam yalan soyluyorsun bu adres vektorlerden cok uzak gibi bir hata mesaji aliyorum.

Henuz kirilmis Keil ile calismadim. Bu dediklerimi hep 32K limitli versiyonda denedim ve sorunun Keil yazarlar tarafindan 3 kagit yapip 32K sinirini asmaya calisanlara yonelik cikartildigini dusunuyorum.

Deneyip yardimci olabilecek varmi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Icarus

#1
Deneyemem DS5 kullanıyorum. Fakat Scatter file kolaylıkla yapılabilir.
Şöyle:
Scattter loading olay şöyle oluyor;
2 Tane temel hafıza bölgesi var.
* Yüklenme ve çalıştırılma adresinin aynı olduğu, Scatter Loader'in kodlarını etc.. içeren Root Section'lar.
* Yükleneme ve çalıştırılma adresi isternirse farklı yapılabilecek olan diğer hafıza bölümleri.

Öncelikle yüklenme ve çalıştırılma adresi aynı olan bir section tanımla. Burada Scatter loading dosyalarını, IVT'i ve main.o'u koy
Section büyüklüğünü 0x10000 yap. Böylece içinde ne olursa olsun hep bu kod hafızada ve image'de hep 0x10000 byte yer kaplayacaktır.
Sonra geri kalan her şeyi başka bir section'a istediğin gibi koy. Eğer "FIXED" yaparsan image'deki ve hafızadaki "duruş" aynı olur. Ama yapılmak zorunda değil.

Tabii bunların hepsini aynı Region'da tanımlamazsan image büyüklüğü yüzlerce mb olabilir.

z

#2
Nihayet basardim. Warningi yok edemesem de ise yariyor.

Scatter dosyasi

LR_IROM1 0x08001000 0x00001000  
{
   ER_IROM1 0x08001000 0x00001000  
     {  
      *.o(Sektor1)
       .ANY (+RO)
     }
}

LR_IROM2 0x08002000 0x00001000  
{
   ER_IROM2 0x08002000 0x00001000  
     {  
      *.o(Sektor2)
       .ANY (+RO)
     }
}


Basit deneme programi

                AREA    Sektor1, CODE, READONLY

Deneme1          PROC

                 B       .
                 
                 ENDP

                AREA    Sektor2, CODE, READONLY

Deneme2          PROC

                 B       .
                 
                 ENDP


                 ALIGN

                END


Rebuild target 'Target 1'
assembling MAIN.S...
linking...
DENE.axf: Warning: L6305W: Image does not have an entry point. (Not specified or not set due to multiple choices.)
Program Size: Code=8 RO-data=0 RW-data=0 ZI-data=0 
"DENE.axf" - 0 Error(s), 1 Warning(s).

Deneme1 fonskiyonu 0x8001000 adresinde

Deneme2 fonskiyonu 0x8002000 adresinde

0x800000 da da Cipe gomulu bir baska proje var.

Debug ederken dogrudan gomulu kodlar hex kod seviyesinde yurutuluyor. Deneme1 yada Deneme2 cagrilirsa sorun yok.

Kendime kebap ismarlayacagim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Icarus

Şuan değil fakat bu dosya daha sonra sorun çıkartacaktır. Çünkü region'lar fixed olmadığı için mutlaka Scatter load kodlarına ihtiyaç duyar.

z

Ne demek istedigini anlamadim. Regionlar ileride ortusurse diyorsan zaten derleme asamasinda hata verecektir. Onu dert etmiyorum.

Bu arada bu gune kadar bu warningi dert edip yok etmeye calisirken ENTRY komutu kullaniyordum. Bu da daha bahsettigim hatalara neden oluyordu.

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

ErsinErce


yamak

Alıntı yapılan: Icarus - 15 Haziran 2014, 16:09:35
Deneyemem DS5 kullanıyorum. Fakat Scatter file kolaylıkla yapılabilir.
Şöyle:
Scattter loading olay şöyle oluyor;
2 Tane temel hafıza bölgesi var.
* Yüklenme ve çalıştırılma adresinin aynı olduğu, Scatter Loader'in kodlarını etc.. içeren Root Section'lar.
* Yükleneme ve çalıştırılma adresi isternirse farklı yapılabilecek olan diğer hafıza bölümleri.

Öncelikle yüklenme ve çalıştırılma adresi aynı olan bir section tanımla. Burada Scatter loading dosyalarını, IVT'i ve main.o'u koy
Section büyüklüğünü 0x10000 yap. Böylece içinde ne olursa olsun hep bu kod hafızada ve image'de hep 0x10000 byte yer kaplayacaktır.
Sonra geri kalan her şeyi başka bir section'a istediğin gibi koy. Eğer "FIXED" yaparsan image'deki ve hafızadaki "duruş" aynı olur. Ama yapılmak zorunda değil.

Tabii bunların hepsini aynı Region'da tanımlamazsan image büyüklüğü yüzlerce mb olabilir.
Hocam DS-5 i hangi chip'lere yazılım geliştirmek için kullanıyosunuz Cortex-A serisi mi M serisi mi?

Icarus

Alıntı yapılan: z - 15 Haziran 2014, 21:53:54
Ne demek istedigini anlamadim. Regionlar ileride ortusurse diyorsan zaten derleme asamasinda hata verecektir. Onu dert etmiyorum.

Bu arada bu gune kadar bu warningi dert edip yok etmeye calisirken ENTRY komutu kullaniyordum. Bu da daha bahsettigim hatalara neden oluyordu.
http://infocenter.arm.com/help/topic/com.arm.doc.dui0206g/DUI0206.pdf
Alıntı yapılan: yamak - 16 Haziran 2014, 11:00:39
Hocam DS-5 i hangi chip'lere yazılım geliştirmek için kullanıyosunuz Cortex-A serisi mi M serisi mi?
Secure A5