Bir bootloader nasıl yazılır ?

Geçen yazdığım .hex formatlarını araştırıyordum ve bir kaç format bulmuştum. şimdi bunların ne olduklarını yazacağım. ve hangisi bizim işimizi görüyor ona karar vereceğiz bulduğumuz formatlar şöyle idi.

1-INHX8M ( INTEL HEX FORMAT )
2-INHX8S ( INTEL SPLIT HEX FORMAT )
3-INHX32 ( INTEL HEX 32 FORMAT )

Diğer Formatlar var fakat bizim onlar ile bir işimiz yok. bizim hex uzantıları ile işimiz var.

INHX8M ( INTEL HEX FORMAT ) bu format. yazdığımız programın makina diline cevrilmesi için kullanılır. yani yazdığımız programı işlemci için anlaşılır hale getirir. (.HEX) Bunun formatı filan var bunlardan birazdan bahsedicem. ama ilk şunu diyeyim. INHX8M INTEL HEX FORMATI olmasına rağmen bunu michrochip biraz uyarlamış. Bu uyarlama tamamen değiştirmek değil. de formatın bazı özelliklerini kullanmak.

Peki INHX8S nedir ozaman ? buda yine 8 bitlik bir pic'e program yazdığımız zaman makina dilini icerir fakat INHX8M den farkı şudur. INHX8M tüm programı bir dosyada tutar iken. ( .HEX ) INHX8S ise bunları düşük ve yüksek olarak ( .HXL ve .HXH ) Diye iki adet makina dili oluşacaktır. Niye böyle bir şey yaptığı ve nerede kullanıldığı hakkında bir fikrim yok fakat bugüne kadar böyle bir uzantıyıda hiç görmedim bunun bizimle bir işi olmadığı kesin. zaten bununla ilgili pek bir bilgi de yok ortalıkta.


INHX32 ise INHX8M ile yapı olarak aynıdır tek farkı kayıt tipi ve adreslemeleridir. dosyada ( .hex ) uzantılıdır.
INHX32 ile INHX8M arasında sadece kayıt tiplerinde farklılık var.

İnternette cok fazla değişik bilgiler bulacaksınız. ve anlamanız zorlaşacak bunun için araştırmaların hepsini calışacağınız mikrodenetleyici üreticisinin adı ile araştırın. application notları cıkacaktır. oradan ne olduğu anlatılır.

Bizim Microchipin huyunu hiç sevmiyorum. çok sacma sapan bir sistemi var. Nerde ne var belli değil. bir developer destek kısmı var orası da yarım yamalak kalmış. her neyse.

Formatı Açıklamaya başlıyayım.

Screenshot_4.png


Görüldüğü üzere formatın kullandığı 4 adet kayıt tipi var şimdi bizim en çok karşılacağımıza bakalım.

00 - bu kayıt formu. verilen adresten itibaren BB değerinin boyutu kadar data bytesini yazmaya başlar.
01 - bu kayıt formu. hex dosyasının son satırındaki colonda geçer programın bittiğini yani dosyanın sonunu ifade eder.
ben 02 ve 04 modunu acıklamayacağım çünkü bende anlamadım. sadece 04 ün görevi şu. bizim adresleme kapasitemiz 00 kayıt modunda 16 bit
eğer 04 kayıt moduna geçersek 32 bit adresleme yapabilirz. yani hafızası 16 bit ile adreslenmeyecek kadar büyük hafızaya sahip bir mikro denetleyici ise. 04 kayıt modu geçilir.
ama bunun adreslerini 2 ye filan bölünüyor sonuc adrese data yazılıyor falan filan pek anlamadım orasını. her neyse.

Şimdi şu 00 kayıt modu ve 01 kayıt modlarını örnekleyerek bakalım.

00 kayıt moduna bakalım.

InkedScreenshot_7_LI.jpg


Şimdi ilk start karakteri verilmiş kolona. hemen devamında kac byte data uzunluğuna sahip bir kayıt olacağı belirtiliyor. hemen devamında kaydın başlanacağı adress gösteriliyor. daha sonrasında kayıt tipi 00 olarak berlirtiliyor yani gösterilen adresten itibaren dataları yaz diyor.

Ve 16 byte data yazılmaya başlanıyor. dataların devamına en son checksum değeri var. bu cheksum değeri yazıldığı kolunun cheksumu için geçerli bir değerdir.

Şimdi 7 numaralı işaretli yere baktığımız zaman EF80 görüyoruz. ama .hex dosyasının içinde ise tam tersi. işte buna " Little Endian (Küçük sonlu) " Deniyor. Bunu araştırabilirsiniz işlemciden işlemciye değişiyor. eğer iki işlemci aynı endianness sahip değilse bunlar birbirlerinden anlamaz. haberleşemezler. googlede kaynak var. ben pek üstünde durmadım. konumuzdan da uzaklaşmayalım.

Şimdi de 8 numaralı işaretli yere baktığımız zaman GOTO 0x006300 komutunu görüyoruz. yani 0x006300 adresine git deniliyor. şimdi bu makina dilide nasıl üretiliyor. random sallanmıyor tabi onu görelim. bunlara OPCODE yani ( OPERATION CODE ) deniliyor. bunlar işlemcinin komut setinde var. yani bunlar sabit , asm olarak program yazıyorsanız. hangi mikrodenetleyiciyi veya mikro işlemciyi kullanıyorsanız. datasheetinden komut setine bakıp öğrenmeniz lazım.

Şimdi GOTO komutunun acıklamasına bakalım :

Screenshot_8.png

Komutumuz 2 adet 16 bitlik kelimeden oluşuyor. normalde 18F serisinde 16 bitlik komut seti vardır. ama GOTO , CALL gibi komutlar 2 kelime ye ihtiyac duyar. şimdi GOTO nun yaptığı operasyona bakalım. k değerini alıyormuş ( k değeri bizim programı göndermek istediğimiz adres) , PC (program counter ) ' ye yüklüyormuş fakat yüklerken 20. bit ile 1. bit arasına yüklüyor değeri 0.bite bir şey yüklenmiyor 0.bit clear olarak kalıyor.

şimdi 2 adet 16 bitlik kelimeden oluşuyor komut demiştik. şimdi ilk kelimeye bakalım. ilk kelimede sabit olan bir değer var " EF " Değeri bu değer bizim GOTO komutunun opcode değeri daha sonrasında. gelen k lar ise programı göndereceğimiz adresin değeri yazılacak. şimdi adresin ilk 8 bitini buraya yazıyormuşuz.

gecelim 2.kelimeye burada yine sabit olan bir değerimiz var onunda değeri " F " bundan sonra gelen değerler ise programı göndereceğimiz adresin 8. biti ile 19.bit arasındaki değerini barındırıyor. şimdi buna göre program memory baktığımızda ve bu açıklamaya göre dizince değerleri sacma bir şey cıkıyor ortaya yani " 03180h " diye bir değer cıkıyor ortaya. bu burda böyle şimdi bunu PC countere yükleyince bakalım hangi adrese gidecek program.

Screenshot_9.png


Şimdi acıklamadaki gibi 19 bite düzdük değeri. daha sonra ise solda ok ile belirttim. bu değer program countere taşındıktan sonraki oluşan değer.
006300 PC( program counter ) 0x006300 adresini gösteriyor artık.


Kısacası .Hex formatından girdik. bir komut setinden komut seçtik. bu .hex uzantılı dosyada nasıl anlamlı hale geliyor işlemci tarafından bunu acıkladık. aslında bootloaderin mantığına girdik. neyin nereye nasıl koyulduğuna arayüzün artık .hex dosyasını nasıl parcalayıp mikro denetleyiciye göndereceğini öğrendik. bundan sonrası ise mikro denetleyici bu bilgileri aldıktan sonra kendi kendinin program memorysini nasıl yazacak ona geleceğiz.

01 Kayıt modu bildiğimiz END OF FİLE onuda göstereyim.

Screenshot_10.png


Bunun bir OPCODE si yok. (zaten kayıt edilecek data değeride 0 yani opcodesi olmasına imkan yok ) bu tamamen programın bittiğinin dosyanın sonuna gelindiğinin bir göstergesi. C ile dosya okuma işlemi yaptıysanız ordada mesela EOF (END OF FİLE ) biti vardır. dosya sonuna gelindiğini belirtir buda öyle bir şey...

Bir sürü gerek video gerek pdf inceleyerek bunları cıkardım. bir yanlış anlatımım veya eksik bir şey varsa Lütfen bilgilendirin. Eğer konu hakkında daha çok şey biliyorsanız. lütfen tecrübelerinizi aktarmayıda eksik etmeyin.

Örnek hex dosyasını Mikro Elektronikanın MikroC ile 18F4550 için yazdığı USB_HID bootloader yazılımından yola cıkarak anlattım.
 
Son düzenleme:
Yahu bu Genişletilmiş adreslleme modunun 100 tane anlatımını okudum ama hex dosyasında bir türlü eşleştiremiyorum. Anlatımlara göre yola cıkarsak öyle bir adres cıkıyor ki picin program hafızasında öyle bir adress yok. adresin gösterdiği kısım ise Read as 'o' yani yazılamayan bölüm. ama hex dosyası oraya bir şey yazıyor. anlamadım gitti. 1 değil bir kaç tane daha inceledim. 18F lerin coğunda hex dosyasının sonuna doğru gelindikce genişletilmiş adresleme modu cıkıyor. veya en baştada cıkabiliyor. ama en baştaki anlaşılır. yazacağı adress belli oluyor. hex dosyasının sonuna doğru yazılan kısım bir şey ifade etmiyor bende bir türlü mantığım yatmadı.

Screenshot_11.png


1-) adresin yüksek 16 bit kısmı
2-) adresin düşük 16 bit kısmı
buna göre 04 ten sonra gelen 4 digit yazılacak adresin yüksek 16 bitini gösteriyor. hemen bir alt satırda ise adresin düşük 16 bit kısmı verilmiş.

E şimdi buna göre datanın yazılacak adresin 0x00300001 olması lazım. bu arada bu inceledğim .hex PIC18F4585 için derlenmiş. Şimdi hafızaya
bakınca böyle bir adres yok. yani maximum adresinden daha fazla. kaldıki hafızanın hepsini kullanmıyoruz hafızanın nerdeyse yarısı sadece okunur olarak ayrılmış. ee bu hex ler calıştığna göre sorunsuz demek ki bu bir yere yazıyor bunu ama nereye yazıyor.
 
O "extended" adrese yazılan byte'lar muhtemelen PIC hafızasına gitmiyor. O byte'lar başka bir anlamda yorumlanıyordur. Mesela PIC'teki bir yapılandırma bloğuna yazılıyor olabilir. Veya programmer yazılımı oradaki verileri okuyup başka amaçla kullanıyordur.
 
O "extended" adrese yazılan byte'lar muhtemelen PIC hafızasına gitmiyor. O byte'lar başka bir anlamda yorumlanıyordur. Mesela PIC'teki bir yapılandırma bloğuna yazılıyor olabilir. Veya programmer yazılımı oradaki verileri okuyup başka amaçla kullanıyordur.

Galiba öyle bir şey abi bakalım bulacağız tam olarak ne olduğunu acayip sinir etti beni :mad:
 
Bazan de işlemci ile hiç alakası olmayan bilgiler eklenebiliyor hex file'a. Mesela build sırasında programın versiyon bilgisini ayrı bir adres alanına koyabilirsin, sonra da özel bir programla hex file'i sorgulatıp versiyonunu öğrenebilirsin. Bu, dosya ismine versiyonu dahil etmekten daha garanti, çünkü dosya ismi kolaylıkla değişir, ama hex'in içini değiştirmek kolay değil, checksum falan var :)
 
Bazan de işlemci ile hiç alakası olmayan bilgiler eklenebiliyor hex file'a. Mesela build sırasında programın versiyon bilgisini ayrı bir adres alanına koyabilirsin, sonra da özel bir programla hex file'i sorgulatıp versiyonunu öğrenebilirsin. Bu, dosya ismine versiyonu dahil etmekten daha garanti, çünkü dosya ismi kolaylıkla değişir, ama hex'in içini değiştirmek kolay değil, checksum falan var :)
Evet gerçekten mantıklı abi. yalnız ben mi bulamadım bilmiyorum da IDE leri üreten şirketlerin bunları ayrıntılı şekilde vermesi gerekiyor bence. çünkü çok fazla bilgi var etrafta. hepsi de yabancı kaynak. mesela ilk attığım. linklerden gitseydik çok kafa karıştıracak tı ki zaten benim karıştırdı da. neyse foruma da güzel bir konu oldu artık biri araştırdımı. türkçe kaynak bulabilecek. şu 04 modunun tanımlası da formatı değiştiriyor onu da yazayım da akıllar karışmasın.

Şimdi bir genişletilmiş linear adress kayıt modu verilmiş ise (04 yani) format şöyle ilerliyor.

: 02 0000 04 DDDD CC --> burada 02 0000 sabit bir anlamı yok. 04. ise genişletilmiş linear adres kaydı demek bundan hemen sonra gelen 16 bitlik DDDD ise datanın yazılacağı adresin yüksek 16 bitini temsil ediyor. CC ise cheksum değeri

Bu komutu gördünüzmü hemen altınada adres kaydı başlar.

: xx dddd 00 HH........ CC --> burada xx kaydedilecek data uzunluğu dddd ise genişletilmiş linear adres kaydının 16 bitlik düşük yani low kısmını oluşturur. 00 ise datayı bu adresten itibaren yazmaya başla demek. HH...... ise xx uzunluğu kadar DATA yı temsil eder. CC ise cheksum değeri.

" : " karakteri de diğer yorumlar da acıkladığımız gibi kayıt başlatma start karakteri.

Datashette Memory Organization kısmına bakınca aslında böyle bir adress olmadığını görüyoruz. ama işte PC(Program counter ) 21 bit olunca. en fazla gösterebileceği address 21 bit uzunluğunda oluyor. buda maximum 3FFFFF Adresine denk geliyor zaten CONFIG kısmındaki acıklamada da bunu belirtmiş. ( Ben okumamışım :) )
Screenshot_14.png


tabi bu CONFIG diye berlitilen Alan da sadece CONFIGLER yok. burada Cihazın ID si revizyon gibi bilgiler de var. zaten onların adresleride 24-1 . tabloda gösterilmiş.

Screenshot_15.png


Cihaz bilgileri için tahsis edilen alan 3FFFFEh - 3FFFFFh Arası. CONFIG adresslerinin yer aldığı kısım ise. (yine bizim meşhur simülatörden yararlanacağız :D )

Screenshot_16.png


Mesela simülatörde CONFIG1L var ama. datasheete yok. zaten simülatör de orayı 00 Boş diye geciyor. H ve L Diye kabul ediyor. ama işte Low kısım tanımalanmadığı için üretici tarafından oraya bir şey yazmıyoruz cünkü yazsak bile oraya yüklenecek bir değer bir iş yapamıyor. yapamaz da o yüzden manuel config ayarlamada burayı size elletmez.

Screenshot_17.png


Gördüğünüz gibi CONFIG1 kısmının LOW kısmı tamamen kapalı.



Güzel bir calışma oldu. artık neyin ne olduğunu daha iyi biliyor anlıyoruz. bundan sonra ise bir sıkıntı cıkmaz ise. Bir picin flash hafızasını nasıl yazacağımıza bakacağız. daha sonrada kısmetse bootloader yazacağız :D belki bootloader arayüzünü hazır buluruz. arayüzün göndereceği komutlara bakıp bootloader yazılımını yazarız. çünkü ben arayüz yazamıyorum :D
 
Bir de burada MPLAB ile gelen hexmate programına da değinmek lazım. HEX file işlerinin isviçre çakısıdır o :) HEX file'lar üzerinde birçok faydalı manipulasyon yapabiliyor. Uzun zamandır kullanmadım ama geçmişte faydasını görmüştüm.
 
Abi Onuda kullanalım. anlatalım , Kaç gündür araştırma yapıyorum. koca ülkede şu konulara değinen yok. anlamadığım şey ben çok basit mi takılıyorum yoksa cidden herkes herşeyi hazır mı kullanıyor ?

Bende 18F serisi için yazılmış bir ön yükleyici firmwaresini PIC e atıp program attırıdım arayüzden. ama içini dibini bilmedikten sonra ne işe yarıyacak. Ha işimizi görürmüyüz görürüz. ama hep dediğimiz gibi içini bilmedikten sonra sadece yazarız. çoğu kişide böyle yapıyor galiba.

Her neyse. Sen ne yaptın abi ? Geliştirme boardı ile bir şeyler yaptın mı hiç ? :)
 
Hiç elleyemedim, ekmek parası işleri çok yoğun :)
 
hexmate gibi bir programı mutlaka kullanman gerekecektir diye düşünüyorum. Mesela HEX dosyadaki tüm programın checksum'unu hesaplayıp HEX dosyaya ilave etmen lazım. Böylece boot kodu, yeni gelen firmware'i doğru programladı mı o checksum ile karar verecek.
 
hexmate gibi bir programı mutlaka kullanman gerekecektir diye düşünüyorum. Mesela HEX dosyadaki tüm programın checksum'unu hesaplayıp HEX dosyaya ilave etmen lazım. Böylece boot kodu, yeni gelen firmware'i doğru programladı mı o checksum ile karar verecek.

Hexmate ye de bakayım abi yarın. neymiş ne değilmiş ona göre buraya yazarız. yavaş yavaşta MPLAB üzerine geciricem zaten konuyu.
 
Hexmate ye de bakayım abi yarın. neymiş ne değilmiş ona göre buraya yazarız. yavaş yavaşta MPLAB üzerine geciricem zaten konuyu.

Bunları bence ayrı ayrı konular açıp ele alırsak çok daha faydalı olur. Hexmate kullanımı, MPLAB kullanımı gibi. Yoksa başkalarının aradıkları bilgileri bulmaları çok zor olur.
 

Forum istatistikleri

Konular
5,654
Mesajlar
97,281
Üyeler
2,438
Son üye
İbrahimSönmez

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top