Yusuf Bülbül

An Engineer

ATSam3x8e Mikrodenetleyicisi için Bootloader Örneği

Atmel firmasının Atmega denetleyicilerinin aksine ATSam3x8e, adından da anlaşılacağı üzere Arm-Cortex-M3 mimarisine sahip ve kendi içerinde fabrika çıkışlı bootloader ile geliyor. Bu sayede bir Uart portu ile herhangi bir Arduino IDE’si üzerinden işlemciyi programlayabiliyorsunuz. Atmel ve MicroChip firmalarının beraber ürettikleri bu çip, AVR işlemciler için yazılmış kütüphane desteğinin sağlanmış olmasının yanında MicroChip firması tarafından ücretsiz dağıtılan ASF kütüphane desteğini de beraberinde getiriyor. Yani bu çipi hem Arduino kullanarak programlayabilirsiniz hem de onun için hazırlanmış diğer kütüphane desteğini kullanarak programlayabilirsiniz. Böylelikle çipi kullanılması oldukça kolaylaşıyor ve popilaritesi bir hayli artmış durumda.

Bu mikrodenetleyici için fabrika çıkışlı bir bootloader mevcut. Sorun şu ki, bu bootloader’ı değiştiremiyor ya da yerine bir başkasını yazamıyorsunuz. Bu yüzden bootloader’ın kullanım amacı oldukça belirgin ve esnetilemiyor.  Bu bootloader, işlemciyi Arduino üzerinden programlayabilmek için yazılmış. Çipi internet üzerinden programlamak gibi başka fanteziler denemek için kendi bootloader’ınızı bu bootloader’ın bir üst katmanına ve kullanıcı uygulamasını da onun bir üst katmanına yazmanız gerekiyor. Yanı sırasıyla | Default Bootloader -> Bootloader -> Uygulama Programı|şeklinde cihaz boot olacak. Bu yazımda bu programın nasıl yazılacağını ele alacağım. Fakat bu yazıyı okumadan önce bir önceki yazımı okumanızı tavsiye ederim.

Yazdığım bootloader, çipi internet üzerinden programlamlayabilmek için yazıldı. Program, uart0 üzerinden gönderilen veriyi flash1’e yazarak o adrese boot  oluyor. Esp çipi kullanarak bu program vasıtaysıyla ATSam3x8e yi internet üzerinden programlayabilirsiniz. Dosyaları ve programları buradan indirebilirsiniz.

Bu yazımda arm tabanlı bootloader’ın nasıl yazıldığını anlatmak istiyorum.  Bu linkten alıntı yapacağım. Öncelikle derlenmiş ve çalıştırılabilir bir binary dosyanın yapısından bahsetmemiz gerekiyor.  Derlenmiş bir dosyayi hex olarak görüntülediğinizde bu dosyanın ilk 4 byte’ı stack pointer’ın adresini sonraki 4 byte’ı ise işlemcinin çalıştıracağı ilk “instruction” adresini içerir. Daha sonraki bölüm ise işlemci içerisinde bulunan (interrupt) sayısı kadar büyüklüğü olan ve ismine (Interrupt Vector Table) dediğimiz bir tablo içerir. Bu tablonun çalışma mantığı ve yapısı, işlemcinin çalışma mantığını anlamak adına oldukça önemlidir.

 

Arm tabanlı mikrodenetleyiciler için kesme olayı şu şekilde oluşur. İlk olarak herhangi bir kesme modülünden(Peripheral) bir kesme sinyali geldiğinde bu sinyal ilk olarak NVIC(Nested Interrupt Vector Controller) olarak isimlendirdiğimiz birime gider. Bu birim ismindende anlaşılacağı üzere gelen kesme sinyallerini sağlıklı bir şekilde kontrol edebilmek ve sinyallerin birbirine karıştırılmaması için geliştirilmiş bir mantıksal birimdir. Bu birimin amacı gelen kesme sinyalinin hangi kod parçacığını çalıştıracağını işlemciye belirtmektir.  Bu sayede işlemci çalıştırdığı programı olduğu gibi bırakıp kesme için yazılmış fonksiyonu çalıştırır. Bu fonksiyona ISR (Interrupt Service Routin) deniyor.

Bu işlemi gerçekleştirmek için her bir kesme modülüne karşılık gelen bir adresin olduğu bir tablo vardır. Bu tabloya Interrupt Vector Table ya da NVIC Table deniyor. Bu tablo hangi kesme olayının servis rutinlerinin hangi adreslerde bulunduğu bilgisini içerir. Bu sayede NVIC birimi bu tabloya bakarak hangi servis rutinini çalıştırması gerektiğini işlemciye söyler. Bu tablo normal şartlarda sabit ve en düşük adreste bulunur yani 0x04 adresinde. Ama siz programınızı flash içinde farklı bir lokasyona yazmak isterseniz bu tablonun adresini de programın başlangıç adresine göre tekrar yapılandırmak gerekiyor.

 

 

Bir bootloader yazdığınızda flash’ı iki kısma ayırmış oluyorsunuz. İlk kısma yazdığınız bootloader yani asıl uygulamayı çağıran bir programı ikinci kısma ise kullanıcının yazdığı asıl uygulamayı yazıyorsunuz. Bootloader’ın görevi uygulama çalışmadan önce uygulamadan bağımsız olarak ona tanımlanmış bir kaç(Belli bir portu dinleyip gelen veriyi flasha yazmak gibi) işlevi yaptıktan sonra asıl uygulama adresine zıplamaktır.  Bu yüzden iki ayrı program ve iki ayrı adresleri işaret eden linker scriptler yazmanız gerekiyor. Linker Scriptlere bir önceki yazımda değinmiştim.

Bootloader programını derleyip mikro denetleyicinin flash’ına yazdıktan sonra bootloader diğer uygulamaya zıplarker bootloader’in şunları yapması gerekiyor;

1-) Bütün aktif ya da çalışıyor olan kesmeleri kapatmak

2-) Sistem saatini resetlemek yani sıfırlamak. Buna Systick deniyor.

3-) FaultHandler dediğimiz işlemcinin hata kesmelerini kapatmak.

4-) Stack Pointer adresini uygulama binary dosyasının ilk 4 byte’ı olarak set etmek. (Çok Önemli)

5-) Interrupt Vector Table adresini yeni uygulama adresine göre offsetlemek (Çok Önemli )

6-) Son olarak Program Counter(PC) kaydedicisine uygulama program binary dosyasındaki ikinci 4 Byte’lık adresi atamak. Bu işlemle ikinci programı başlatmış oluyoruz.  Burada tekrardan hatırmatmakta fayda var. Programın ilk “instruction adresi” binary dosyada ilk 2. 4 byte’lık alana yazılır. Bu yüzden programı çalıştırmak için bu adreste bulunan adrese gidiyoruz.

Bir bootloader yazmak için yazdığınız bootloader’lar bu işlemleri yapıyor olmalı. Böylelikle bootloader’ programın yapısını da anlatmış oldum. Herhangi bir sorunuz olursa cevaplamaya çalışırım. Şimdilik iyi çalışmalar.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir