Merhaba Arkadaşlar,
Linkerin kullanımı nasıl oluyor. Linker kullanımını bilmediğim için bazı programları yazarken içinden çıkamadığım sorunlar yaşıyorum. *.lkr uzantılı dosyaları düzenlerken neye dikkat ederek düzenlemeliyiz.
En son aşağıdaki hatayla karşılaştım. Bellekte [100][5] 'lık bir dizi tanımlıyorum. Ama section'a sığmıyor hatası veriyor. Sectionda nasıl yer açabiliriz ? Nelere dikkat etmemiz gerekiyor .
Alıntı Yap
MPLINK 4.06, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section '.idata_GLCD.o' can not fit the section. Section '.idata_GLCD.o' length=0x000001ef
Errors : 1
Bu konuda kim yardımcı olabilir ?
Bellekte 500 elemanli dizi tanımlıyorsun.Bir de bu dizi integerlardan oluşuyorsa sığmaması normal gibi.Linkerden düzeltilebilir mi durum bilmiyorum.
Bu veriyi sığdırmanın bir yolu olmalı
Bu veri rahatlıkla sığabilir. Nerdeyse 4 Kb RAM'ı 128KB flash belleği var. *.lkr dosyasından konfigrasyonu yapılmalıdır.
Ama konfigrasyonu nasıl yapacağız bilmiyorum. Bilen varsa yardımcı olabilir mi?
rom BYTE Verdana[100][5] şeklinde tanıtıldığında kabul ediyor. Ama section konfigrasyonlarını yapıp istediğim bölgeye kaydedebilsem daha iyi olacak
hocam öğrenebildinizmi linker kullanımını?
Soruna diğer başlıkta (https://www.picproje.org/index.php/topic,33297.msg233339/topicseen.html#msg233339) cevap vermiştim. Daha doğrusu fatihvelid cevap vermiş.
iş nedeniyle okula biraz ara vermiştim şimdi konuyu tartışacak ve sürdürecek zamana sahibim
araştırdıgıma göre 256 byte veri alanına izin veriyor c18 lkr dosyası
ben bunu 1024 yapmak istiorum bunun için bir örnek verebilirmisiniz peki?
lkr dosyasına baktıgımda pek birşey anlamadım doğrusu
Ben de zamanında aynı yerde takılmış, ve çözüm arayışı içinde bu başlığı (https://www.picproje.org/index.php/topic,31137.0.html) açmıştım.
Öncelikle, linker script'i değiştirerek kullanacağın için bu dosyayı C:\Program Files\Microchip\mplabc18\v3.37.01\bin\LKR adresinden alıp kendi proje klasörüne kopyalaman gerekiyor. MPLAB'de de, projene bu yeni taşıdığın dosyayı eklemelisin. Böylece linker, program files'daki varsayılan dosyayı değil, senin gösterdiğin dosyayı kullanacaktır.
Benim sığdırmaya çalıştığım veri float q[8][8][4] şeklinde bir diziydi. 1024 byte yer kapladığı için 4 bank kullanması gerekiyordu.
Tamamını göstermeye gerek yok, 18f2550_g.lkr dosyasında değiştirdiğim yerin orijinal hali böyle idi:
DATABANK NAME=gpr4 START=0x400 END=0x4FF
DATABANK NAME=gpr5 START=0x500 END=0x5FF
DATABANK NAME=gpr6 START=0x600 END=0x6FF
DATABANK NAME=gpr7 START=0x700 END=0x7FF
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
Ben buradaki gpr4, 5, 6, 7 alanlarını birleştirerek tek bir isim verdim. Dosyanın değiştirilmiş şekli de böyle:
DATABANK NAME=genis START=0x400 END=0x7FF PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
Yani eski 4 banklık alanı silip yerine genis adı altında tek bir bank tanımladım. Burada yeni oluşturulan bölüme PROTECTED ibaresini ekleyerek, linker'a "Burası benim alanım, ben özellikle belirtmedikçe buraya hiçbir veri koyma." demiş olduk.
genis adı verdiğim bu kısmı C18'de alan adı olarak kullanabilmek için dosyanın en sonuna bir de şu eklemeyi yaptım:
SECTION NAME=q_data RAM=genis
Bunu kaydedince linker script ile işimiz bitiyor. Ama C18'de kod yazarken, yerleşim yapacağımız alanı göstermek gerekiyor. O da şu şekilde:
#pragma udata q_data
float q[SIZE][SIZE][4];
Burada q_data yazmasaydım linker kafasına göre bir alana yerleştirmeye çalışacaktı q verisini. Galiba bunun bir de varsayılan adı vardı ama aklımda değil.
burda anlamadığım şu
#pragma udata q_data
float q[SIZE][SIZE][4];
buradaki q hiç bir yerde tanımlanmamış yani buna göre her değişkeni ramde bu 4 banklık alana kaydedecek
böylece gereksiz yere ram alanı kullanmış olacak???
Alıntı yapılan: sinansinan09buradaki q hiç bir yerde tanımlanmamış
q tam olarak o satırlarda tanımlanıyor zaten. Yazdığım koddan kopyala yapıştır yaparken
SIZE'ları değiştirmeyi unutmuşum. Onlar kodda 8 olarak tanımlanmıştı.
O 4 banklık alanda sadece q dizisi var. Başka hiçbir değişken o bölgeye kaydedilmiyor. Ama mesela q 1024 bytelık olmasaydı (biraz daha küçük olsaydı) ve ben lkr dosyasında o alana
PROTECTED demeseydim, linker o alana başka değişkenler de koyabilirdi. Hatta ben kendim de koyabilirdim,
PROTECTED olsa bile.
Örnek olması açısından, programdaki diğer değişkenler de şu şekilde başka bir alanda tanımlandı.
#pragma udata variables
float alpha; //Learning Rate
float gamma; //Discount Factor
float epsilon; //Exploration Rate
unsigned int xPer, yPer; //Motor high pulse periods (x 100us)
unsigned int xCur, yCur; //Current values for period counters
volatile int encCounter;
volatile unsigned char encOld;
Buradaki
variables alan isminin linker script'te bir karşılığı yok. Linker bunu kafasına göre bir bank'a koyuyor. Dediğim gibi, eğer q dizisi q_data alanının tamamını kaplamasaydı ve alan da
PROTECTED olmasaydı, sığmaları durumunda bu değişkenleri de oraya koyabilirdi.