- Katılım
- 24 Şubat 2018
- Mesajlar
- 25,191
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
Veya işlemi tek hamlede yapmak için
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
Kod:
#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
Kod:
#define APP_RUNTIME_OFFSET 0x00030000
void boot_application(void)
{
((void (*)(void))(*(uint32_t*)APP_RUNTIME_OFFSET))();
}