Bootloader kullanımı hakkında kafama takılan bir kaç soru ?

Başlatan sigmoid, 26 Kasım 2010, 23:31:32

sigmoid

Hitech C 9.60 PL2  ve PIC16F877A kullanıyorum. Projenin teslim süresi kısaldığı için zaman kazamak adına izninizle fazla araştırma yapamadan bir kaç soru sormak istiyorum. Daha önce bootloader kullanmadım. Yapmış olduğum ufak araştırmada genellikle hazır bootloader hexlerini kullanan çoğunlukta.  yazdığım devrenin hex dosyasını müşteriye vermek istemiyorum. Aklıma ilk başta hex dosyasını c# ile yazacağım programın içine gömmek geldi. .Net'in kolay decompiler edilmesinden dolayı yazdığım programı ikiye böleyim diyorum. bootloader ve lcd fonksiyonları gibi daha sonradan değiştirme ihtiyacım olmayan kodları pic içinde sabit bir yere yazayım. Güncellemelerde lcd ve diğer sabit fonksiyonlar olmayacağı için c# ta yazdığım exeyi decompiler eden biri kodumun tamamına ulaşamasın.

İlk sorum bootloader ile code protectli bir pic'e veri yazılırmı?

İkinci sorum bootloaderı derlerken hiteche bu ürettiğin kodları xxxx adresinden sonraya nasıl yaz denir ? ve normal projemi yazarken de hitechin bootloader olan yere herhangi bir şey yazmasını engellemek için xxxx adreslerine bir şey yazma nasıl diyebilirim?

son olarakta lcd ve bazı fonksiyonları bootloader koduyla beraber yazıp, sürekli sabit olarak belleğin bir yerinde kalmasını istiyorum. Güncellemelerde lcd fonksiyonlarını güncellemeyeceğim. o nedenle yazdığım programda xxx adresindeki lcd fonksiyonunu çağır diye nasıl tanımlayabilirim.

Bilmem derdimi anlatabildim mi? Asıl niyetim yazdığım pic programının müşterinin eline geçmemesidir.

Teşekkürler

Tagli

PIC kod koruması etkin bile olsa kendi içinden program hafızasına erişebilir. Bu izni veren ayrı bir konfigurasyon biti (daha doğrusu bitleri) var. Bunları uygun şekilde ayarlamalısın. Bootloader kullanırken programı seri yolla PIC'e söylersin, o kendi yazar. Bu sebeple sorun olmaz.

Malesef diğer soruların beni aşıyor. Ama bildiğim kadarıyla bootloader'lar hafızanın sonuna yerleşecek şekilde yazılıyorlar.  Hafızanın başında sadece bootloader'a gitmek için bir iki satır kod oluyor. Sanırım kodun başında bootloader kullandığını derleyiciye bildiriyorsun, o da programı ona göre derliyor.

Programın bir kısmının normal yüklenip diğer kısmının bootloader ile atılmasının mümkün olduğunu sanmıyorum. İmkansız değil tabi ama bunun için bootloader'ı kendin yazmış olmalısın. Gerçi çok da zor olmasa gerek. Zor olan şey derleyicinin senin yazdığın bootloader'a göre derleme yapmasını sağlamak. Kendi bootlader'ını yazarken hex kodunu 0'dan değil de birkaç satır aşağıdan başlayacak şekilde PIC'e yüklemesini sağlayabilirsin ama bir ihtimal bu birkaç satırlık kayma programı çalışmaz hale getirebilir. Programda tablo kullanılmışsa veya program 2048 word'lük alanı aşmışsa işin içine PCLATH ayarları girer ve derleyicinin oluşturduğu kodun birkaç satır kayması sorun çıkarabilir.

Bootloader'ın parçası olan kodu (LCD kodu) çağırma işi için ise malesef aklıma bir fikir gelmiyor. Programını assembly ile yazıyor olsan bu sorun rahatlıkla çözülürdü.
Gökçe Tağlıoğlu

X-Fi

16F için hi-tech rom adresi atama işlemleri aşşağıdaki gibidir.

const unsigned char dizi[8]= @ 1FFF {"merhaba"};

ve

void boot () @ 1FFF
{
}


buda linker üzerinden rom hafızayı bölme işlemi yapar program default bölgesine opcode oluşturmaz.

--rom=default,-FE06-FFF8
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

iyildirim


X-Fi

hayır hocam 18F ve üzeri çok farklı birazda karışık psect komutları devreye giriyor asm kod eklemeden yapılamıyor.

örneğin 18F için;

#asm 
   psect  boot,global,reloc=2,class=MEDIUMCONST,delta=1 
   global _temp
_temp:

dw    0x000C  
dw    0x0E3F  
dw    0x1616  
.
.
.

#endasm


veri yazabiliyoruz rom adrese.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

iyildirim

Teşekkürler.
Asm bilgim sıfır. Hazır birşeyler bulmak gerekecek sanırım.

sigmoid

@tagli, @X-fi teşekkür cavaplarınız için teşekkür ederim.

Bootloaderı kendim yazmayı hedefliyorum elimde örnek olarak hitechin samples klasöründeki bootloader ve AN1310 uygulama notunun kodları var. Onları inceliyorum.


void boot () @ 1FFF{} şeklinde tanımladığım kodu yazdığım programda nasıl çağıracağım. Konuyu biraz daha açabilirmisin. dizi içinde 1FFF adresini vermişsin. Bu adres o fonksiyonun yerleşeceği başlangıc adresi değil mi? İki ayrı fonksiyonda aynı adreste olursa sorun çıkarmaz mı?

X-Fi

ben örnek olarak gösterdim çağırma bölümü değişmiyor boot(); şeklinde yine çağırabilirsiniz.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

sigmoid

anladığımı yazayım.
1FFF adresinden başlayan bir bootloader programı yazıyorum ve pice yüklüyorum.

ana uygulamamda da main kodu içinde boot(); şeklinde çağırıyorum. bootun adresini bilmesi içinde kodun bir yerde sadece içi boş void boot () @ 1FFF{}  şeklinde bir fonksiyon tanımlıyorum ve derlerkende --rom=default,-FE06-FFF8 şeklinde benzer bir parametre ekleyerek derleyicinin buraya herhangi bir şey yüklemesini engelliyorum.

Doğru anlamış mıyım?

X-Fi

Evet hocam doğru bu şekilde yapabilirsiniz takılırsanız yardımcı olmaya çalışırım. Hi-tech versiyonunuzu 9.60pl4 ile değiştirin bu versiyon daha etkilidir.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Tagli

Peki bootloader'ın bir parçası olan LCD kodu, daha sonradan bootloader aracılığı ile yüklenecek ana program tarafından nasıl çağrılacak? Bence asıl sorun bu olacaktır.
Gökçe Tağlıoğlu

X-Fi

aynı şekilde taglı hocam programda boş bir void lcd() 0xXXXX {} tanıtıp X olan adrese lcd nin bootloader tarafındaki adresi girilip oradan koşturulacak.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

sigmoid

o zaman aynı mantıkla bootloader kodu içine lcd fonksiyonlarımıda gömebilirim.


çok sağol.