Hoşgeldiniz!

Kayıt olarak, topluluğumuzun diğer üyeleri ile görüşebilir, paylaşabilir ve özel mesaj gönderebileceksiniz.

Şimdi Kayıt Ol!

Mikrodenetleyiciye yüklediğimiz .hex file nedir ? (Öğrenelim)

FurkanKELESOGLU

Moderator
Yönetici
Katılım
13 Ağu 2019
Mesajlar
9
Beğeniler
6
#1
İlk önce .hex dosyası nedir bunu açıklayalım ;

Hepimiz gömülü sistem için program yazıyoruz bazılarımız low-level ( düşük seviye ) bazılarımız high-level( yüksek seviye ) li programlama dilleriyle. fakat bu yazdığımız programların hepsi en son Makine Diline geliyor. yani .hex file dosyasının içine. Yüksek seviye de yazılan program ilk önce assembly dili ile yorumlanıyor ve orataya asm bir program cıkıyor. daha sonrasında ise. hangi adrese ne yazılacak , hangi komutlar , hangi değerler yazılacak. Bunlar hex file dosyasının içine yazılıyor. bir Mikro Denetleyici içerisinde bir adet te mikro işlemci bulunmaktadır. ve bu mikro işlemcinin bir komut seti vardır. aslında ASM yazanlar . program yazdıkları mikro denetleyici veya mikro işlemcinin komut setini kullanarak program yazarlar. ve her komutun bir sayısal karşılığı vardır. işte .hex dosyasının ici neden hexadesimal sayılar ile dolu daha iyi anlayabiliriz umarım. yazı ilerledikçe daha kolay anlayacaksınız.

Şimdi .Hex dosya formatını gösterelim.

.Hex dosya formatı. İntel tarafından ortaya cıkarılmış ve formatı belirlenmiş bir dosya formatıdır. Diğer firmaların bknz.(Motorola) da kendine has dosya formatları bulunmaktadır. lakin İntelin .Hex formatı daha yaygın kullanılmaktadır günümüzde.

Hex dosya formatı şöyledir ;

2.png


1. (":") -> Alan Kayıt başlatılacağını belirten " : " karakteri ile başlar. her kaydın başında bu karakter bulunur ve satırın kayda başlayacağını bildirir.
2. (num bytes) -> Alan ise Kaydedilecek kaç byte data olduğunu bildirir. yani Data uzunluğunu belirtir. (1 Byte alana sahiptir)
3.(Address) -> Alan ise kaydedilecek dataların hangi adrese veya hangi adresten itibaren kaydedilmeye başlayacağını belirtir. ( 2 byte alana sahiptir)
4.(Record Type) -> Alan ise Kayıt formatını belirler. bu alanının alacağı değerler şunlardır. ( 1 byte alana sahiptir)
4.1 (Record Type 1 ) -> 1. kayıt tipi (00) dır ve bu kayıt tipi dataların gösterilen adrese kaydedileceğini belirtir.
4.2(Record Type 2) -> 2. kayıt tipii (01) dir ve bu kayıt tipi Kayıt dosyası sonuna gelindiğini belirtir. yani program sonu END OF RECORD FİLE
4.3(Record Type 3) -> 3.kayıt tipi (04) dir. ve bu kayıt tipi Genişletilmiş linear adresleme kayıt modu tipidir.

5.(Data) -> Alan ise. (num bytes) alanın değeri kadar Byte'den oluşan Dataları tutar. bir deyişle istenilen adrese yazılacak datalar. ( burasının alanınını numbytes kısmı belirler. )
6.(Cheksum) -> Alan ise her kayıt işareti (" : ") olan satırda bulunur ve o satırın cheksum değerini ifade eder. (1 Byte alana sahiptir)


Not: (Record Type) kayıt tipleri 3 den daha fazladır fakat ben en fazla karşılacağınız kayıt tiplerini anlatacağım diğerleri ise bunlardan cok ta farklı değil. Araştırıp öğrenebilirsiniz.

Şimdi PIC için yazılmış bir .hex file açalım ve file üzerinden anlatıma devam edelim. hem anlattıklarımızıda kanıtlamış ve örneklemiş olalım.

Aşağıdaki resimde gördüğünüz .hex file PIC18F452 için yazılmış bootloader kodunun .hex cıktısıdır.

Screenshot_1.png

Evet .hex file içeriğimizi ve oldukça karışık gözüküyor ve coğunuzada bir anlam ifade etmiyor. (Şuanlık) şimdi bunu anlamlı hale getirmek için. bunları bloklara ayıralım ve renklendirelim.

Screenshot_2.png
Şimdi zannediyorum ki daha anlamlı olmaya başladı. Yer yetmediği için tablonun işaret ettiği kısımlara o alanın isminin kısalatmasını verdim.

S : Start karakteri
N : Kaydedilecek data uzunluğu
Addres : kayıt edilecek adres. veya kayda başlanacak adres
Kayıt edilecek Datalar : N nin değeri kadar Data byte sini bulunduran data alanı.
C : Cheksum.

Şimdi ilk satıra bakalım fakat burada ilk kayıt tipine bakalım. kayıt tipi 04 yani Genişletilmiş Linear adresleme kayıt tipi. Şimdi bu kayıt tipini acıklayalım. 04. kayıt tipi ne zaman kullanılır ? 04 kayıt tipi 16 bit ile adresleme yapamadığımız zaman kullanılır. hafıza uzunluğu 16 bitten fazla olduğu zaman. 04. kayıt modu kullanılır. ve 32 bit adresleme moduna geçilir bunun kayıt formatı ise şöyledir.

Screenshot_3.png

Bu kayıt moduda her kayıt satırı gibi start karakteri ile başlar. 04 kayıt modunda kayıt uzunluğu her zaman sabittir ve 02 değerindedir.
hemen ardından adress kısmı ise her zaman sabittir ve 0000 değerini alır. 04 kayıt tipi belirtildikten sonra ise. Kayıt edilecek adresin Yüksek 16 bit kısmı gelir. ve bundan sonra 1 byte alanlık cheksum değeri gelir.

04. kayıt modu bir şeyi kaydetmez sadece addresleme tipini ve adresin yüksek 16 bit kısmını gösterir. Hemen alt satıra baktığımız zaman ise.

Screenshot_4.png

Bura da ilk kayıt tipine bakıyoruz. Buradaki kayıt tipi ise (00) yani asıl şimdi kayıt yapılacak. burayı başta anlattığım için kısaca gececeğim. ilk start karakterimizi verdik devamın 02 değeri girilmiş yani 2 byte data kaydedilecek. hemen ardından ise 0000 değeri girilmiş şimdi önemli nokta burası. bir üst satırda . adresin yüksek 16 bitini göstermiştik. şimdi ise düşük 16 bit kısmını gösteriyoruz. yani şimdi buna göre bu 2 byte datanın kaydedileceği adress : 0x00000000 Adresidir. Ayrıca 04. kayıt tipinde adresin yüksek 16 biti verildiğinde bir daha 04. kayıt modu geçilip yüksek 16 bit adres kısmı değiştirilmez ise diğer kayıtlarda yüksek 16 bit her daim geçerlidir. taki yeniden yüksek 16 bit değiştirilene kadar. mesela bir örnek verelim kabaca.

04 kayıt modunu verdik. ve adresin yüksek 16 bit kısmını 0010 diye girdik. hemen altınada şu satırları yazdık.
: | N | 0010 | 00 | N kadar data bytesi | Cheksum | şimdi bu kayıt verilince N kadar data bytesi şu adresten itibaren yazılmaya başlanacak demek oluyor Kayıt yapılacak addres = 0x00100010

Diyelim hemen altına bir kayıt (00) daha geçtik ve adresin düşük 16 bit kısmını değiştirelim .
: | N | 0230 | 00 | N kadar data bytesi | Cheksum | Şimdi ise kayıt yapılacka adress = 0x00100230 Oldu.

Eee peki adresin yüksek 16 biti ne zaman değişir. Buda tekrardan (04) kayıt modu girilir. ve yüksek 16 bit değiştirilir. ve onu takip
eden (00) kayıt tipleri yine yüksek 16 bit ile düşük 16 bit adres kısmına yazmaya devam eder.

Biraz daha devam edelim. zaten .hex dosyaımızın sonuna doğru adresin yüksek 16 bit kısmı değiştirilmiş. şimdi buraya da bakalım.

Screenshot_5.png

Yukarıda Gördüğünüz resimde hem (04) kayıt modu hemm de Cheksum değerinin nasıl hesaplandığını gösterdim ve anlattım. Buraya kadar (00) ve (04) kayıt tiplerini gördük şimdi de (01) kayıt moduna bakalım.

Screenshot_6.png


Buraya kadar herşey güzel. Fakat şunu belirteyim. ben Intel hex formatını anlatsamda. PIC üzerinden gittiğimiz için Michrochipin INTEL hex formatının biraz kendine uyarlamış şeklini anlatıyorum.

Intel hex formatından bir kaç tane daha kayıt modu vardır. fakat bunları Microchip kullanmaz. Zaten bu kayıt tiplerinden de cok farklı değiller bunları anladıysanız diğerlerinide anlarsınız. zaten diğerleride Data kayıtla ilgili değil yine adres kaydıyla ilgili. (04) kayıt tipi gibi.


Evet Artık bir bir .hex file nin formatını biliyor ve anlıyorsunuz. şimdi bu PIC için ve programınız için ne ifade ediyor ona bakacağız. Big-Endian (Büyük Sonlu) ve Little-Endian (Küçük Sonlu) Kavramlarına deyineceğiz..

Başta da belirttiğim gibi inceledeğim .hex file 18F452 için yazılmış bootloader programının .hex cıktısıdır. Şimdi Bu .hexi simülatöre yükleyip. Program memory ( Yani program hafızası ) ile .hex dosyasını karşılaştıralım. ve yine buradan da dallanacağımız başka konuya deyineceğiz :eek:

Şimdi İlk .heximizi simülatöre yüklemek ile başlayalım.

Screenshot_7.png

Burada .Hex dosyamızın içeriğinin aslında karışık ve anlamsız değil aslında anlamlı olduğunu görüyoruz. Peki bu ne işinize yarar ?
Mesela küçük bir örnek vereyim. internetten bir gömülü sistem projesi buldunuz. açık kaynak kodu verilmemiş fakat .hex dosyası verilmiş. Ve LCD ekran açılışta firma ismi v.b bir isim yazıyor ve siz bunu değiştirmek istiyorsunuz ( Genellikle böyle istekler geliyor )
Eğer hex dosyasına girip. takip yapıp LCD ekrana yazılacak karakterleri bulursanız kelime uzunluğuna bağlı kalmak şartıyla aynı boyutta farklı bir kelime ile değiştirebilirsiniz. Tabiki değişiklik yaptıktan sonra. satır sonundaki cheksumu sağlayacak şekilde de cheksum değerini değiştirmeniz lazım.

Tabi ki ben'de 18F serisi için simülatör olduğu için diassembly işlemini kendisi yapıyor. mesela siz bu bilgileri öğrendikten sonra dediğim gibi program üzerinde .hex file üzerinden değişiklik yapmak için bir diassembly yazabilirsiniz. neden olsa formatı öğrendiniz. ama bir şey var. bu simülatör bize o hexadesimalin ne anlama geldiğini söylüyor. peki bunu nerden biliyor bu ? Şimdi de buna bakalım.

Başta dediğim gibi pic ( ila pic olmak zorunda değil her hangi bir mikrodenetleyici olması yeterli ) in komut seti var. yani Anlayabileceği belli komutlar var. ve 18F serisinde yaklaşık 76 komut bulunmaktadır. bu hexadesimal değerler ise o komutların OPCODE (Operation Code) lerini ifade eder.

Mesela yukarıda ki resimde D010h ın BRA 16 komutuna denk geldiğini gördük. hemen 18F452 nin datasheetini açalım ve BRA komutuna bakalım. ve karşılaştıralım.

Screenshot_8.png


Burada aslında sabit dediğim yeri de kafama göre söylemiyorum. Onunda Datasheet te bir açıklaması tabiki mevcut onada bakalım. bize neyin ne olduğunu aslında datasheet te gösteriyor. BRA komutundan devam ederek bakalım. Tamam BRA bir komut ama ne komutu işlevi ne. veya hangi komut grubunda yer alıyor. ona bakalım.

Screenshot_9.png

BRA komutu CONTROL OPERATIONS ( Kontrol İşlemleri ) Grubunda yer alan bir Komutmuş. Şimdi hangi grupta yer aldığını biliyoruz. Hangi grupta yer aldığını bildiğimize göre şimdi o grubun. Komut Formatına bakalım...


 
Son düzenleme:

FurkanKELESOGLU

Moderator
Yönetici
Katılım
13 Ağu 2019
Mesajlar
9
Beğeniler
6
#2
Screenshot_10.png

Burada Görüyoruz ki her komut grubunun da bir formatı varmış. Buraya kadar Simülatörün .hex dosyasının nasıl parcaladığını o değerleri nasıl işlediğini ve hangi değerin hangi komut olduğuna nasıl karar verdiğini anladınız sanıyorum. Şimdi size başka bir şey göstermek istiyorum.

(04) komutunun biz genişletilmiş linear adresleme kayıt modu veya tipi olduğunu söylemiştik. şimdi bir .hex File dönelim. ve son satırdaki şu adrese bir bakalım. Aslında konu dağılıyor gibi gözükebilir ama ilerde kafanızı karıştıracka sorulara da cevap veriyorum. çünkü ben baya uğraşmıştım.

Screenshot_11.png


Evet Burada da aslında siz bu konuya bakıp. sonra kendiniz bir şeyler yapmak isterken. bu adress ne böyle bir şey yok diyebilirsiniz. Yukarı daki fotoğraf ta anlattığım. gibi program hafızasına baktığımız zaman böyle bir adres yok. Hatta öyle bir şeyki komple Memory Organization. Hafıza Organizasyon kısmında bile maximum adres bile böyle bir adres gösteremiyor. Bir bakalım dimi. Gerçi fotoğrafta ne olduğunu anlattık ama yinede bakalım. Öğrenelim kısmındayız. herşeyi olabildiğince anlatmamız lazım.

Screenshot_12.png

Görüldüğü üzere Hafıza organizasyonunda en fazla ulaşabileceğimiz adres 0 - 1FFFFFh arasında fakat zaten Read '0' denen yere bir şey yazamıyoruz. ayrılmış reverse edilmiş bölüm. ee zaten bizim program hafızamızda 7FFFh adresinde sonlanıyor. He şimdi gelelim Hafıza dışındaki adreslere.

Screenshot_15.png

Evet gördüğümüz gibi. 300000h-3FFFFFh Arası hafıza alanı dışında imiş. ve burada barınan şeyler configrasyon bitleriymiş. aslında hangi adreste hangi yapılandırma var onuda yine datasheet ten görebiliriz. hemen onada bir el atalım. :eek::rolleyes:

Screenshot_16.png

Bunun da açıklamasına yaptığımızda göre yavaş yavaş bitirebiliriz. En son Şu bizim simülatöre geçip Açıkladığımız BRA komutu nasıl calışıyor hiç olmazsa bir komutunda nasıl calıştığını gösterelim. neler oluyor bu MCU nun icinde ona bakalım. Sonrada bitirelim.

Bu ara program hafızası boş ise neden FFFF ile doldurulduğuu açıklıyayım. biliyorum kesin uzattıda uzattı diyorsunuzdur. ama bir yandan da kesin neden FFFF ile dolduruyordur dersiniz. ne anlamı varsa artık :D

Screenshot_17.png

Bu dediğimiz şeyide Gerçekten bir kanıtyalım. sallamasyon iş olmasın. PicKit2 Arayüzümüzü acalım. programlıyıcı bilgisayara bağlayalım. programlayıcıya 18F452 yi takalım. ve ERASE edelim.

Screenshot_18.png

Gördüğümüz gibi program hafızasının tümü FFFF ile dolduruldu. yani her adrese boş komut geçildi. şimdi Şu meşhur boot.hex File yükleyelim buna :eek::rolleyes: Birde öyle bakalım.

Screenshot_19.png

Gördüğümüz gibi boot.hex i 18F452 ye yazdırdık. program memory kısmından da gerçekten veriler dediğimiz gibimi yazılıyormuş görmüş olduk.

Geldik Son kısma. konuyla pek alakası yok dediğim gibi ama yine de göstermek istiyorum. belki birilerin kafasında LED yaktırmış oluruz.

Screenshot_20.png
 

FurkanKELESOGLU

Moderator
Yönetici
Katılım
13 Ağu 2019
Mesajlar
9
Beğeniler
6
#3
Şimdi Programı 1 komut kadar ilerletelim. ve bakalım bizi Program hafızasındaki hangi adrese götürecek.

Screenshot_22.png

Bir daha ki ( ÖĞRENİYORUZ ) konularında görüşmek üzere. Hoşçakalın.

Not : Anlatımda bir hata görürseniz. veya yanlış bir şey lütfen yorum yaparak beni uyarın. Eğer konu hakkın'da soru sormak istiyor iseniz. lütfen sorunuzla alakalı bir başlık ile burayı belirterek konu açınız. Anlayaşınız İçin teşşekür ederim.
 
Üst Alt