Keil de main satirina kadar olan kodlari traslamak

Başlatan bunalmis, 19 Aralık 2010, 14:36:31

z

Hic bir library kullanmayacak sekilde kod yaziyorum. Fakat buna ragmen Keil, startup kodlarindaki reset vektorunden baslayip main koduma kadar olan araliga bir ton kod getiriyor.

Kerdesim ben kendi kodlarimi kendim yazacagim, sen sadece stack, program, ram alaninin neresi oldugunu bil gerisine karisma diyemezmiyiz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Keil Reset vector unden sonra main rutinine girmeden once scatterload ve rtlib_init rutinleri isletiyor.

Bunlarin ne ise yaradigini bilen varmi?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CoşkuN

Bunalmis hocam hiç bir kütüphane kullanmadan kod yazmaya çalışmanız işlemciyi tam anlamıyla anlayabilmek için yaptığınız bir tercih mi yoksa projeniz mi böyle birşey gerektiriyor acaba?

z

#3
Evet asıl sebep işlemci üstünde tam ve tek hakimiyet arzum fakat başka nedenler de var.

Bir kaç on mikrosaniyelik ana döngülerimde kaldırıp atacağım her bir byte büyük kar.

Yazılımda bug üretirsem  kolay yada zor bir şekilde kendim temizlerim ama baska birisinin pisliği varsa, o birisini pisliğini temizlesin diye beklemek hoş değil.

Güvenlik....

----------------------------------------------------------------

Reset vektörü ile main fonksiyonu arasındaki kod parçalarının yaptığı işlerden birisi de tanımlanan global alanı temizlemek ve verilmişse global değişkenlere ilk değer atamak.

Bir diğeri de; main bir fonksiyon. Bu fonksiyonu çağırmak ve  fonksiyondan geri dönüldüğünde return değeri ile ilgili işlemleri yapmak.

Fakat bu konuyu detaylı bilmek istiyorum.

Çünkü bayağı bir kod var arada.





Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#4
Alıntı yapılan: FxDev - 19 Aralık 2010, 17:10:52
Aslında ben de bunu merak ediyorum. Bazı uygulamalarda çok kolaylık sağlıyor bu startup kodları fakat yine de nasıl yapılıyor bilmek lazım.

Simdi farkettim. Sorum startup kodu ile ilgili değil. Startup kodunda reset labelinden baslayip main fonksiyonuna kadar olan kisimdaki kodlarla ilgili.

Startup dosyasi cok karmasik bir sey değil. Tabiki islemcinin reset ve interrup mekanizmasini bilmek gerekiyor.

Startup dosyasinda Stack ve global degiskenlerin yer alacagi alanlar tanimlaniyor.

Vektor alaninlarina vektor adresleri tanimlaniyor ve hic olmazsa bu vector adreslerine sonsuz donguler koyarak kor interrupt rutinleri yerlestiriliyor.

C satirlarina tasimak istemediginiz  tum initialize islemlerini startup koduna gomebilirsin.

Soruma donersek;

Ornegin benim ugrastigim islemcinin startup kodunda (source kodunda) reset rutininde

        EXPORT  Reset_Handler
Reset_Handler
        ;
        ; Call the C library enty point that handles startup.  This will copy
        ; the .data section initializers from flash to SRAM and zero fill the
        ; .bss section.
        ;
        IMPORT  __main
        B       __main


Fakat derlenip disasm edildiginde Reset vektoru ile B  __main arasinda curcuna kodlar var ve bunlar islemcinin initialize islemleri ile ilgili kodlar değil. Tamamen Keil'in yerlestirdigi C library initialize ve global degisken tanimi ile ilgili kodlar.

Ben bu kodlari merak ediyorum ve bir sekilde C source kodlarinin oldugunu dusunuyorum.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

#5
@bunalmis hocam;

Bildiğim kadarıyla bu bahsettiğiniz kodlar sizin de bahsettiğiniz gibi C kütüphanesi ile alakalı kodlar. Yani programı yazarken kullandığınız C fonksiyonlarına aitler. Hatta şöyle bile diyebiliriz. Derleyici kütüphanelerden aldığı ağır fonksiyonları (Ön tanımlama gerektiren stack, heap, global değişkenler, C fonksiyonları için gereken bellek bölgeleri, interrupt gerektiren fonksiyonlar için atamalar, v.s.) main den yukarı. Sizin yazdıklarınızı ve macro fonksiyonları mainden aşağı koyuyor olması lazım. Hani kodu yazarken kütüphaneleri önce tanımlıyorsunuz ya ;) derleyicide öyle yapıyor. Ayrıca C de mainden önce bir dizi init fonksiyonları vardır. Direkt main fonksiyonuna körü körüne dalmaz yani.

Bunlara en iyi örnek C deki memory fonksiyonlarıdır. stdio, stdlib, malloc(), realloc(), calloc(), ve free() gibi. Thread v.s. gerektiren fonksiyonları saymıyorum bile.  Ayrıca C dili eğer Exception Handling kullanılıyorsa apayrı bir Structured Exception Handling mekanizmasını bizden gizli olarak koda ekleyebiliyor.

C iyidir güzeldir ama ASM işte bu yüzden daha güzeldir. Sizden gizli hiçbirşey olmaz. Tüm ipler sizdedir :)

Bknz;ARM C library deyimine dikkat bu arada.
http://www.keil.com/support/man/docs/armlib/armlib_chdegjfd.htm

Mikro C library;
http://www.keil.com/support/man/docs/armlib/armlib_BAJHFADD.htm

Buda sizin en çok aradığınız türde birşey olsa gerek. Hatta sorularınızın cevabı ;) "The standalone C library functions" linkini ihmal etmeyin.
http://www.keil.com/support/man/docs/armlib/armlib_Chdiibfd.htm
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

Verdigin link cok isime yaradi.

Aynen soyle diyor.

" Building an application without the C library

Creating an application that has a main() function causes the C library initialization functions to be included as part of __rt_lib_init.

If your application does not have a main() function, the C library is not initialized and the following features are not available in your application:

low-level stdio functions that have the prefix _sys_

signal-handling functions, signal() and raise() in signal.h

other functions, such as atexit() and alloca(). "

Bu durumda demekki  nasil traslanir diye sormakla yanlis bir sey sormuyormusum.

Hemen bir deneme yaptim ve main fonksiyonu olmayan basit bir C kodu yazdim. Sonuc super.

Baslatilmasini istedigim C fonksiyonum MyCodes adinda ve deneme icin icine asagisaki iki C satirini ekledim.

void MyCodes()
{
volatile int i;
            for (i=0;i<100;i++);
            while(1);       
}


Startup.s dosyasinda Reset vektorunde istedigim gibi asm kodlarimi yazdim C kodlarima ziplamak icin


IMPORT   MyCodes
B   MyCodes

Satirlarini ekledim ve derledim. Sonuc tam istedigim gibi.

Bu bize ne kazandirdi.

ASM den kopmak istemeyenler icin C anlasilirligini kullanarak bir nevi gorsel ASM kod yazimina imkan tanimasi ve herseyin cirilciplak olmasi.
Ha C icinde asm esnekligi varmi yok. Fakat A=12 demek de ayri bir keyifli.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

"... a healthy dose of paranoia leads to better systems." Jack Ganssle