- Katılım
- 13 Ağu 2019
- Mesajlar
- 9
- Beğeniler
- 6
İ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 ;
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.
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.
Ş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.
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.
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.
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.
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
Şimdi İlk .heximizi simülatöre yüklemek ile başlayalım.
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.
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.
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...
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 ;

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.

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.

Ş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.

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.

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.

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.

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
Şimdi İlk .heximizi simülatöre yüklemek ile başlayalım.

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.

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.

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: