Boot Loader Yazmaya calışıyoruz.

Furkan KELEŞOĞLU

Kayıtlı Üye
Abi boot loaderi nasıl yazıcam diye düşünüyordum ilk başta onu hallettik şimdi IDE beni cıldırtmak üzere.

Screenshot_2.png


Bu dosya yok bulunamıyor diyor. anlamıyorum ki. yani öyle sacma bir şey ki daha Derleyicinin neresine tanıtayım ben bunu. Sinirden sirke küpüne döndüm.
 

Furkan KELEŞOĞLU

Kayıtlı Üye
MPLAB ile okadar uğraştım ki en sonunda kaldırdım tekrardan kurdum. bu kadar gerizekalı başka bir IDE olamaz.
Screenshot_3.png


eğer while içine bir şey yazmaz isem. main içinde dönüyor kod ve habire UART hattına text basıyor cıldırttı beni. dedim şu while içinde blink attırıyımda kendi debug'ımı kendim yapayım. çünkü IDE üstündeki Debugger while içine giriyor en son orda kitleniyor benim istediğimde bu zaten.
ama pice kodu yükleyince habire text basıyor.

Blink kodunu while içine ekleyince şimdi calıştı. demek while döngüsü acıp içine bir şey yazmayınca IDE hiç koda bunu eklemiyor.

Bana Kafayı yedirtti az daha bırakacaktım projeyi filan. çünkü saatlerdir library dosyası oluşturmaya calışıyorum. bu IDE nin library sistemide çok farklı library projesi acıyorsun ilkten orada .h ve .c dosyalarını yazıyorsun derleyince sana kendi uzantısında library veriyor. bunuda gelip projene ekliyorsun. ama ne yaptıysa firmanın verdiği example gibi olmuyor.

Ne göstermişsiler aynısını yaptım ama IDE hata üstüne hata vermeye devam etti bende en son tüm fonksiyonları herşeyi .h dosyalarına toplayıp program include ettim artık böyle devam edicem.
 

Furkan KELEŞOĞLU

Kayıtlı Üye
Hani bir kaç yorum önce belirtmiştim ya " IDE SANKİ BENİM O ADRESE BİR ŞEY YAZACAĞIMI ANLIYOR KENDİSİ GİDİP YAZIYOR " Diye.

Evet tam olarak öyle oluyormuş IDE kendisi .hex oluştururken o adrese veriyi yazıyormuş. bir kaç denemeden sonra baktım bizlik bir sorun yok. Kesin IDE bir şey yapıyor dedim. .hex file inceledim zaten belli böyle bir şey yaptığı.

Bende FLASH_HAFIZA_ADRES_KUR fonksiyonun aldığı adres parametresine volatile keyword'ü geçtim böylelikle bu sorundan kurtulduk. volatile ile derleyiceye " Elin kolun rahat dursun kafana göre iş yapma donanımsal değişecek bu sen elleme " demek istiyoruz :D

Screenshot_4.png


Ama beni şaşırtan başka bir şey var IDE de proje ayarındaki optimizasyon ayarı 0 yani optimizasyon yok. fakat yine IDE bazı şeylere müdahale ediyor. demek ki volatile keyword'ü optimizasyon olmasa bile kullanmak lazımmış. Bende optimizasyonu yüksek olanlarda kullanılır diye kafama yer etmiş.

Screenshot_5.png
 

taydin

Timur Aydın
Staff member
MPLAB ile okadar uğraştım ki en sonunda kaldırdım tekrardan kurdum. bu kadar gerizekalı başka bir IDE olamaz.
1627 eklentisine bak

eğer while içine bir şey yazmaz isem. main içinde dönüyor kod ve habire UART hattına text basıyor cıldırttı beni. dedim şu while içinde blink attırıyımda kendi debug'ımı kendim yapayım. çünkü IDE üstündeki Debugger while içine giriyor en son orda kitleniyor benim istediğimde bu zaten.
ama pice kodu yükleyince habire text basıyor.

Blink kodunu while içine ekleyince şimdi calıştı. demek while döngüsü acıp içine bir şey yazmayınca IDE hiç koda bunu eklemiyor.

Bana Kafayı yedirtti az daha bırakacaktım projeyi filan. çünkü saatlerdir library dosyası oluşturmaya calışıyorum. bu IDE nin library sistemide çok farklı library projesi acıyorsun ilkten orada .h ve .c dosyalarını yazıyorsun derleyince sana kendi uzantısında library veriyor. bunuda gelip projene ekliyorsun. ama ne yaptıysa firmanın verdiği example gibi olmuyor.

Ne göstermişsiler aynısını yaptım ama IDE hata üstüne hata vermeye devam etti bende en son tüm fonksiyonları herşeyi .h dosyalarına toplayıp program include ettim artık böyle devam edicem.
O nasıl şey yav! main'i tekrar tekrar döngü içinde mi çağırıyor? :oops:

Optimizasyonlar açık ise boş while döngüsünü kaldırması normal de, kapattıktan sonra hala kaldırıyorsa o tuhaf.
 

taydin

Timur Aydın
Staff member
Bende FLASH_HAFIZA_ADRES_KUR fonksiyonun aldığı adres parametresine volatile keyword'ü geçtim böylelikle bu sorundan kurtulduk. volatile ile derleyiceye " Elin kolun rahat dursun kafana göre iş yapma donanımsal değişecek bu sen elleme " demek istiyoruz :D

Ama beni şaşırtan başka bir şey var IDE de proje ayarındaki optimizasyon ayarı 0 yani optimizasyon yok. fakat yine IDE bazı şeylere müdahale ediyor. demek ki volatile keyword'ü optimizasyon olmasa bile kullanmak lazımmış. Bende optimizasyonu yüksek olanlarda kullanılır diye kafama yer etmiş.
Ya bu derleyici hakkaten çok boktan. fonksiyon parametresine volatilin bir fark yarattığını ilk defa görüyorum. O sadece belli bir hafıza bölgesi, aynı zaman hardware register gibi görev yapıyorsa, yani hardware tarafından kendiliğinden değişiyorsa anlamlı. Yoksa compiler'ı hizaya getirmek için değil :)

Alternatif bir derleyici araştırmak lazım hakkaten, bu MPLAB tam bir baş belası.
 

Furkan KELEŞOĞLU

Kayıtlı Üye
Ya bu derleyici hakkaten çok boktan. fonksiyon parametresine volatilin bir fark yarattığını ilk defa görüyorum. O sadece belli bir hafıza bölgesi, aynı zaman hardware register gibi görev yapıyorsa, yani hardware tarafından kendiliğinden değişiyorsa anlamlı. Yoksa compiler'ı hizaya getirmek için değil :)

Alternatif bir derleyici araştırmak lazım hakkaten, bu MPLAB tam bir baş belası.
Abi dün gece neler yaşadım bir allah bir ben biliyorum :D Bir ara durdum ve öğrendiklerimi sorgulamaya başladım :D hayat , evrenin oluşumu :DD paradokslara girdim çıktım resmen.

Ya ben MPLAB'ın dandik bir kaç şeyi biliyordum ama bu kadarıda yuh dedirtti artık. Ben mi bir şeyleri kaçırıyorum anlamıyorum ki. Mesela UART üzerinden text okumak istiyorum. scanf fonksiyonu gibi. bunun içinde UART içinde programı while ile kitlemek istiyorum. ama onuda kitlemiyor. her yere volatile gecicem en sonunda. :D

Hayır MPLABI cok profesyonel şekilde kullanan biri de bulamıyorum ki sorsam bunların sebebi nedir diye. yine iş başa düşüyor. ingilizce PDF okumaya calışıyoruz :D
 

taydin

Timur Aydın
Staff member
Eğer MPLAB'in bütün dangalaklıklarını öğrensen ve hepsi için birer çözüm bulsan bile, bir sonraki major release'de bir sürü yeni problem daha gelecektir. O yüzden ben senin yerinde olsam şunu yapardım:

Bu MPLAB derleyicisi komut satırından çalıştırılabiliyor mu? Çalıştırılıyorsa, bütün projeyi komut satırından, makefile'lar kullanarak derle. Sonra da programlayıcı ile programla ve test işlemleri için bir USB-UART arabirimi kullan. MPLAB'i de sadece gerektiğinde debugger amaçlı kullanırsın.

O MPLAB'in açtığı terminali falan bırak artık. Onun yerine PIC üzerinde bir UART portu ayır, oraya bir USB-UART arabirimi koy ve PC'den de bir terminal emülatörü ile kullan. Böylece herşey için standart yöntemler kullanmış olursun ve her yeni MPLAB sürümü ile gelecek olan yeni buglardan etkilenmezsin.
 

Furkan KELEŞOĞLU

Kayıtlı Üye
Abi Terminalden kastın UART terminal ise o MPLAB IDE sine ait değil. RealTerm Programı yani terminal programı. USB-UART arabirimi evet var şuan zaten projeyi o sayede yapıyorum gerçek zamanlı test ediyorum yani RealTerm üzerinden.

MPLAB derleyici komut satırından calıştırılıyormu bilmiyorum hiç denemedim. ancak calışıyor olabilir. komut satırınıda aşina değilim. Yani bu kısmı ben yapamayacağım galiba. makefile nasıl yazılır onuda bilmiyorum. çünkü makefile'da üreten MPLAB.

O yüzden eşşek gibi uğraşmaya devam edeceğim galiba.
 

taydin

Timur Aydın
Staff member
Bir kere uğraşıp öğrendikten sonra hep kullanabilsen tamam da, öyle olmayacak. Yeni sürümlerde yeni dangalaklıklar gelecek, ST nin IDE sine geçince pararel evrene geçmiş gibi olacaksın :) Aynı şekilde ARM kullanmaya başlayınca da onların saçmalıklarını öğreneceksin. Ama komut satırında ve makefile'larla çalışırsan, 30 yıldır stabil bir şekilde kullanılan, herşeyi anlaşılmış, ve çok iyi belgelenmiş bir sistematiğe geçmiş oluyorsun.

Tabi böyle yakışıklı bir IDE'de "bir tıkla" birşeyler yapmak hoşuna gidiyor ama, sorun çıkınca da bin tık yapsan bile nafile ...
 

Furkan KELEŞOĞLU

Kayıtlı Üye
Bir kere uğraşıp öğrendikten sonra hep kullanabilsen tamam da, öyle olmayacak. Yeni sürümlerde yeni dangalaklıklar gelecek, ST nin IDE sine geçince pararel evrene geçmiş gibi olacaksın :) Aynı şekilde ARM kullanmaya başlayınca da onların saçmalıklarını öğreneceksin. Ama komut satırında ve makefile'larla çalışırsan, 30 yıldır stabil bir şekilde kullanılan, herşeyi anlaşılmış, ve çok iyi belgelenmiş bir sistematiğe geçmiş oluyorsun.

Tabi böyle yakışıklı bir IDE'de "bir tıkla" birşeyler yapmak hoşuna gidiyor ama, sorun çıkınca da bin tık yapsan bile nafile ...
Abi tamamdır dediğin şeylerin üzerine düşeceğim. normalde bizim fatih .bat dosyası oluşturuyordu. .bat dosyadan file yolunu gösteriyorduk. komut satırından .bat calıştırdıkmı derliyordu varsada bir hata veriyordu. ama neydi tam hatırlamıyorum ki GNU librarylerimi bir şeyler vardı. ona bir sorayım. biraz o yönden beni öğretsin :D
 

taydin

Timur Aydın
Staff member
Abi tamamdır dediğin şeylerin üzerine düşeceğim. normalde bizim fatih .bat dosyası oluşturuyordu. .bat dosyadan file yolunu gösteriyorduk. komut satırından .bat calıştırdıkmı derliyordu varsada bir hata veriyordu. ama neydi tam hatırlamıyorum ki GNU librarylerimi bir şeyler vardı. ona bir sorayım. biraz o yönden beni öğretsin :D
Birkaç tane kaynak dosyası varsa bat gayet iyi iş görür. Herşeyi sıfırdan derletirsin olur biter. Ama yüzlerce kaynak dosya varsa ve derlemek de 10 dakika sürüyorsa, o zaman işte makefile'ın faydasını görmeye başlıyorsun.
 

ercanersoy

Kayıtlı Üye
Kullandığınız PIC18F45K20 mikrodenetleyicisindeki ana bellekte bulunan yığın (stack) alanı yetmiyor olabilir.

Mikrodenetleyicilerde derleyici, kodu derlerken yazılan koddan önce standart kütüphanesinde bulunan bir kod ekler. Bu kod belleği düzenleme gibi işleri görür. Yığın alanı, bu kodla ilgilidir.

Önerim, program kodunda fazla alt program kullanmayı gerekticek kod bulunmamasıdır. Gerekirse hiç çekinmeden goto deyimi kullanın. goto deyimini eskiden kalma diye bir çok kullanıcı kullanmaz. Ancak, goto deyimi her zaman alt program dallanmasından daha hızlıdır. Kullandığınız PIC18F45K20 mikrodenetleyicisi yetmiyorsa başka bir mikrodenetleyiciye de geçebilirsiniz.
 

Furkan KELEŞOĞLU

Kayıtlı Üye
Kullandığınız PIC18F45K20 mikrodenetleyicisindeki ana bellekte bulunan yığın (stack) alanı yetmiyor olabilir.

Mikrodenetleyicilerde derleyici, kodu derlerken yazılan koddan önce standart kütüphanesinde bulunan bir kod ekler. Bu kod belleği düzenleme gibi işleri görür. Yığın alanı, bu kodla ilgilidir.

Önerim, program kodunda fazla alt program kullanmayı gerekticek kod bulunmamasıdır. Gerekirse hiç çekinmeden goto deyimi kullanın. goto deyimini eskiden kalma diye bir çok kullanıcı kullanmaz. Ancak, goto deyimi her zaman alt program dallanmasından daha hızlıdır. Kullandığınız PIC18F45K20 mikrodenetleyicisi yetmiyorsa başka bir mikrodenetleyiciye de geçebilirsiniz.
Önecelikle kullandığım mikro denetleyici PIC1846K20 stack yığını <31:0> yanni 32 adete kadar iç içe dallanma yapababilir. eğer böyle bir şey olsa IDE bana yığın taşması oluştu diye eror veya warning verir bunu vermiyor zaten IDE ye gerek yok. gözle takip ederek en fazla ne kadar adres yığacağı belli.

Simülatörde bile bakıyorum en fazla dallanması 2 kere yani imkanı yok taşamaz böyle bir program ile. Eğer ben fonksiyonları kurup cağırmassam ana program öyle bir karışır ki , bir hatada alır başını gider. o yüzden dediklerinize katılmıyorum.

PIC18F46K20 nin hem program hemde ram hafızası yeterince iş görür. o yüzden başka bir cihaza geçmeme gerek kalmaz kaldıki flash işlerimleri üzerinde duruyoruz. hepsinin yazma okuma ve silme uzunluğu aynı değil yeniden başka bir cihaza gecmek tekrardan baştan başlamak gibi olacaktır.
 

taydin

Timur Aydın
Staff member
Sadece fonksiyon çağırmaları ve interrupt'lar için kullanılıyormuş bu hardware stack. Lokal değişkenler için derleyici tarafından özel olarak yönetilen bir software stack yapısı kullanılıyormuş. Şöyle bir potansiyel sorundan bahsediliyordu bir yerde: Eğer yüksek öncelikli ve düşük öncelikli iki interrupt açık ise, yüksek öncelikle olan düşük öncelikliyi kestiğinde stack'taki dönüş adresinin üzerine yazıyormuş :) Böyle bir durum varsa gereken tedbiri alın diyor.
 

Furkan KELEŞOĞLU

Kayıtlı Üye
Sadece fonksiyon çağırmaları ve interrupt'lar için kullanılıyormuş bu hardware stack. Lokal değişkenler için derleyici tarafından özel olarak yönetilen bir software stack yapısı kullanılıyormuş. Şöyle bir potansiyel sorundan bahsediliyordu bir yerde: Eğer yüksek öncelikli ve düşük öncelikli iki interrupt açık ise, yüksek öncelikle olan düşük öncelikliyi kestiğinde stack'taki dönüş adresinin üzerine yazıyormuş :) Böyle bir durum varsa gereken tedbiri alın diyor.

Şimdi Abi ana programda low level interrupt oluştu. CPU stack'e adresi yazdı. low level interrup fonksiyonuna tam girdi o ara high level interrupt gerçekleşti. burada ana programda kaldığı adresin üzerine low level interrupt bölgesinin adresini mi yazıyor ? eğer böyle ise hiç bir zaman ana programa geri dönemez ki.

Stack bir kere daha arttırıp yeni adres vermek ile var olan adresine üstüne yazmak bir nevi stack taşması demektir. program kaldığı yere dönemez ki. ne saçma bir iş bu. aklım almıyor.
 

taydin

Timur Aydın
Staff member
Aynen öyle :) Datasheet'inde yazıyor (sayfa 64)


If both low and high priority interrupts are enabled, the stack registers cannot be used reliably to return from low priority interrupts. If a high priority interrupt occurs while servicing a low priority interrupt, the stack register values stored by the low priority interrupt will be overwritten. In these cases, users must save the key registers by software during a low priority interrupt.
 

taydin

Timur Aydın
Staff member
Böyle çift stack yapısı daha önce hiç görmedim. Benim çalıştığım işlemcilerde ya sadece hardware stack vardı yada "stack pointer" ve normal RAM ile çalışan software stack. Bu PIC'lerde her ikisi birden var, ilginç ...
 

Furkan KELEŞOĞLU

Kayıtlı Üye
Abi ozaman ne yapacağız ki ? kendimiz bir algoritma ile bunu mu kontrol edeceğiz. Ben bunu baya bir araştırayım en iyisi. gerçi bende microchip forumda gördüm. başka bir yerde de #pragma direktifi verilmiş. ama ne alaka böyle bir şey varsa. bunu ben dediğim gibi daha ayrıntılı araştıracağım.
 

Furkan KELEŞOĞLU

Kayıtlı Üye
Bu Boot Loader konusunun yönü FLASH işlemlerine gitti %50 boot loadere hitap eder oldu ardına bu Kesme sorunu. şu FLASH işlemlerini bitirip kodu githuba yüklüycem burdan kaynakda göstereceğim. sonra şu interruptın sıkıntısı üzerinde duracağız. elimizin altında birde simülatör var oradanda ne olup bitiyor bakacağız.
 

Furkan KELEŞOĞLU

Kayıtlı Üye

Okadar fazla sorun çıktıki herşeyde en son lanet olsun dedim.
atol() fonksiyonunu kullandım cünkü en stabil bu fonksiyonla calıştı atol() kullanınca adresi desimal göndermek zorunda kaldım tabi.

stroul() fonksiyonu , gönderdiğim DATA yıda verdiğim adresin tam ortasına yazıyordu bayağı denedim sonunda atol() fonksiyonunu kullandım. baya bir deneme yaptığım için biraz karışık ana program biraz düzenleyip githuba yükleyeceğim. zaten bunda UART üzerinden terminal vasıtasıyla kullanıcı ile haberleştiği için biraz karışık. asıl bootloader kısmında baya kücülecek.

Şimdiden sonra bootloaderin arayüzünü yapmak kaldı. oralarda sorun cıkacağını sanmıyorum. gömülü sistem daha sıkıntı :D
 
Son düzenleme:
Top