C de sabit bir adresteki fonksiyon nasıl çağrılır

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,557
Boot loader ile uğraşırken karşılaşılan durumlardan birisi, boot loader'in asıl programa kontrolü devretmesidir. Asıl programın giriş noktası da sabit bir adresin içerisinde saklıdır. Gerçek bir sistemden örnek verelim:

Boot loader, hardware resetten sonra 0x00000004 adresinde bulunan reset vektörüne bakıyor ve o adresten 0x0000061D değerini okuyor. Sonra da 0x0000061D deki fonksiyonu çağırıyor ve oradan boot loader artık çalışmaya başlamış oluyor. Boot loader işini bitirdikten sonra, asıl çalışacak programın reset vektörü olan 0x00030004 adresine bakıyor ve oradan 0x000310B5 değerini okuyor. Sonra da 0x000310B5 adresindeki fonksiyonu çağırıyor ve böylece asıl program çalışmaya başlıyor. Peki C de bu işlem nasıl yapılabilir? Önce bir fonksiyon pointer tanımlarız. Sonra bu pointere fonksiyonun adresini atarız ve pointer ile de fonksiyonu çağırırız

C:
#define APP_RUNTIME_OFFSET 0x00030000

void boot_application(void)
{
    void (*entry)(void) = (void (*)(void))(*(uint32_t*)APP_RUNTIME_OFFSET);
    entry();
}

Veya işlemi tek hamlede yapmak için

C:
#define APP_RUNTIME_OFFSET 0x00030000

void boot_application(void)
{
    ((void (*)(void))(*(uint32_t*)APP_RUNTIME_OFFSET))();
}
 
Görüldüğü gibi bu işlemi C de yapınca anlaşılması kolay olmayan arap saçı gibi bir kod ortaya çıkıyor. O yüzden bu işlemi assembly'de yapmak okunabilirlik açısından daha mantıklı

C:
void boot_application(void)
{
    __asm volatile
    (
        "mov.w   r3, #196608\n"
        "ldr     r3, [r3]\n"
        "blx     r3\n"
        );
    }
}

Buradaki işlem çok daha anlaşılır ve programlama dilinin kurallarının getirdiği ilave karmaşıklık yok. R3 registerine 0x30000 değerini yüklüyoruz, sonra o adreste bulunan 32 bit değeri gene R3 registerine okuyoruz. Sonra da R3 registerindeki adrese alt rutin çağrısı yapıyoruz.
 
Aslında bu işi assembly'de yapmanın birçok farklı yolu var. Benim kullandığım yol, C derleyicisinin üretmiş olduğu kodun aynısı:

Screenshot_20220814_185932.png
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,659
Mesajlar
97,343
Ü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