C18 Linker (*.lkr uzantılı dosyalar) Kullanımı

Başlatan fatihvelid, 28 Haziran 2007, 16:08:50

fatihvelid

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 ?
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

CoşkuN

Bellekte 500 elemanli dizi tanımlıyorsun.Bir de bu dizi integerlardan oluşuyorsa sığmaması normal gibi.Linkerden düzeltilebilir mi durum bilmiyorum.

fatihvelid

Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

fatihvelid

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?
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

fatihvelid

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
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

satilla

hocam öğrenebildinizmi linker kullanımını?

Tagli

#6
Soruna diğer başlıkta cevap vermiştim. Daha doğrusu fatihvelid cevap vermiş.
Gökçe Tağlıoğlu

satilla

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

Tagli

Ben de zamanında aynı yerde takılmış, ve çözüm arayışı içinde bu başlığı 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.
Gökçe Tağlıoğlu

satilla

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???

Tagli

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.
Gökçe Tağlıoğlu