Şimdi Ara

C Dilindeki Extern Depolama Sınıfı hakkında bir soru

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
8
Cevap
0
Favori
392
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhabalar. Pic programlama çalışıyorum bu aralar ve aklıma bir soru takıldı. Hangi kaynağa bakarsam bakayım, global değişkenler ve fonksyonlar extern depolama sınıfındadırlar, program çalıştığı sürece hafızada kalırlar ve ana depolama biriminde depolanırlar cümleleri ile karşılaşıyorum.
    Global bir değişkenden bahsediyorsak bu yazılanların hepsi doğrudur, bir itirazım yok. Fakat konu fonksyonlara gelince birkaç çelişki seziyorum. Birincisi fonksyon ana depolama biriminde(ana depolama birimi=ram bellek) depolanmaz. Fonksyon bloğunun içeridği C diline ait her bir komutun bir assembly karşılığı vardır. Her bir assembly komutun ise makina dilinde binary karşılığı vardır. Ve bu binary kodlar, ana depolama biriminde depolanmazlar. Program hafızasında depolanırlar(mesela eprom bellekte). Burada bir çelişki var. Hadi bahsedilenin fonksyonun kendisi değilde parametreleri olduğunu varsayarsak, fonksyon parametreleri auto (veya tercihen register) depolama sınıfında kaydedilir. Asla extern bir depolama sınıfında olamazlar.
    ikinci bir ihtimal olarak, fonksyonun döndürdüğü değerden bahsediyor olabilirler. O zaman bu açıklamalar kabul edilebilir. Evet fonksyonun döndürdüğü değer, extern depolama sınıfındadır ve ana depolama biriminde depolanır.
    Pic konusunda profesyonel arkadaşlar duruma bi el atarsa sevinirim =)



    < Bu mesaj bu kişi tarafından değiştirildi ilkerDeveci -- 28 Eylül 2019; 3:45:26 >







  • İşlemciler fonksiyon kavramını bilmez onlar sadece sıralı kod parçalarını(instruction) çalıştırır. Derlenmiş instruction binary karşılıkları da işlemcide herhangi bir yerde tutulmaz dijital devrenin tasarımı o binary komutları işlemek için yapılmıştır zaten.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Kısıtlı bilginizle mantık yürütmeyin, bu işler mantık yürüterek çözülmez, BİLGİ sahibi olacaksın.
    K&R kitabından ilgili kısmı kopyalıyorum, storage class sandığın şey değil:

    An object, sometimes called a variable, is a location in storage, and its interpretation
    depends on two main attributes: its storage class and its type . The storage class determines the
    lifetime of the storage associated with the identified object


    daha devamı var, al kitabı istersen parasıyla istersen korsan, oku öğren.
    Bu kitap bulabileceğiniz en ince ve okuması rahat programlama kitabıdır, şunu bile ihmal ediyorsunuz.
  • ilginize teşekkürler. Yabancı dilim zayıf. Baska alternatif onerebilirmisiniz ?

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Sorunuza temel seviyede yaygın kullanılan çoğu kişinin en azından adını duyduğu 16F628A pic microcontroler ile cevap vermeye çalışayım.

    Aşağıdaki resimde PIC serisi işlemcilerin 3 kısma ayrılmış hafıza birimleri ve kapasiteleri hakkında bilgi vermektedir.


    C Dilindeki Extern Depolama Sınıfı hakkında bir soru

    Flash Program (ROM): Yazdığımız kodların saklandığı kısım.
    RAM Data (RAM): Programda kullanılan değişkenlerin tutulduğu alan
    EEprom Data (EEprom): enerji kesildiğinde tutmak istediğimiz verileri saklayabileceğimiz alan. (Ör: En son ses seviyesi, ayarlanan sıcaklık.. vb.) İstediğimiz değerleri eeproma kendimiz yazarız ve ihtiyaç duyduğumuzda (örneğin ilk açılışta) tekrar okuyup kullanmaya devam ederiz.


    16F628A da değişkenleri saklayabileceğimiz 224 byte RAM imiz var. Bunlar cpu mimarisinde bulunan 4 bank yapısınında aşağıdaki resimde gösterilen adres bloklarına yerleştirilmiştir.

    C Dilindeki Extern Depolama Sınıfı hakkında bir soru


    Bank 0 da 80+16 (20h..7Fh)
    Bank 1 de 80 (A0h..EFh)
    Bank 2 de 48 (120H..15Fh)

    Toplam 224 byte

    Yukarıda parantez içerisinde RAM alanlarının adres başlangıç ve bitiş değerleri gösterilmiştir. Bu adreslerin ram kullanımı konusunu örnek bir program üzerinden açıklayalım.


    #include "main.h"

    int global_8; // 1 byte
    int16 global_16; // 2 byte

    //-----------------------------------------------------------------------------
    void test(int16 x) // 2 byte
    {
    int t1[60]; // 60 byte
    int t2[10]; // 10 byte
    }

    //-----------------------------------------------------------------------------
    int16 cikar(int cikar_a, int cikar_b) // 1+1 = 2 byte
    {
    int cikar_dizi[40]; // 40 byte
    int16 cikar_x; // 2 byte

    cikar_x = cikar_a - cikar_b;
    return(cikar_x);
    }

    //-----------------------------------------------------------------------------
    int16 topla(int topla_a, int topla_b) // 1+1 = 2 byte
    {
    int topla_dizi[80]; // 80 byte
    int16 topla_x; // 2 byte

    topla_x = topla_a + topla_b;
    return(topla_x);
    }
    //-----------------------------------------------------------------------------
    void main()
    {
    int g[80]; // 80 byte
    int16 main_x; // 2 byte


    main_x = topla(1,3);
    main_x = cikar(5,3);
    test(63);
    g[2]=83;

    }




    Derleyicimiz programımızda kullandığımız local, global, fonksiyon giriş değişkelerini ramde aşağıdaki gibi yerleştirdi.



    020 global_8
    021-022 global_16
    023-072 MAIN.g
    073-074 MAIN.main_x

    Bu kısma dikkat 75 ve 76 nolu ram hücreleri 3 farklı amaç için ortak kullanılmış. Örnek programımızdaki topla ve cikar fonksiyonlarının giriş değişkenleri olan (1 byte uzunlukta) a lar 75, b ler 76 ram adresini ortak kullanıyorlar. test fonksiyon giriş değişkeni olan x değişkeni(2 byte uzunlukta) buda 75 ve 76 nolu adresi kullanmakta.

    075 cikar.cikar_a
    075 topla.topla_a
    075-076 test.x
    076 topla.topla_b
    076 cikar.cikar_b

    077 @SCRATCH
    078 @SCRATCH
    078 _RETURN_
    079 @SCRATCH
    07A @SCRATCH

    Buradada topla ve cikar fonksiyonlarının dönüş değerleri (2 byte uzunlukta) aynı ram 07B 07C hücrelerini kullanıyorlar.

    07B-07C topla.topla_x
    07B-07C cikar.cikar_x

    09B-09C @READ_PROGRAM_MEMORY8.P1

    Buradada diziler ile yukarıda açıkladığım durumu farklı bir şekilde göstermek istedim. test, topla ve cikar fonksiyonlarının içerisinde local olarak kullandığımız diziler var. Bunlarda 0A0 dan başlayan aynı ram adresini kullanıyorlar.

    0A0-0C7 cikar.cikar_dizi -- 40 elemanlı dizi
    0A0-0DB test.t1 -- test.t1 60 elemanlı bir dizi
    0A0-0EF topla.topla_dizi -- 80 belemanlı dizi
    0DC-0E5 test.t2 -- test.t2 10 elemanlı bir dizi. t1 in bittiş adresi 0DB adresinden sonra gelen 0DC adresinden başlıyor.


    Mesajdaki 2. resimde kırmızı ile işaretlediğim ram adresler bloklarına derleyicimizin programımızdaki değişkenleri hangi sırada yerleştirdiğini görmüş olduk.

    Örnek programımızda değişkenlerin byte olarak kapladığı alanları topladığımızda 284 byte yapıyor, ama işlemcimizin ram miktarı yukarıda bahsedildiği gibi 224byte :)

    Değişkenimiz local de olsa, global veya fonksiyon giriş-çıkış da olsa ramde bir yer işgal eder. Global değişkenlerin adresleri başka değişkenlere tahsis edilmez, local değişkenlerin kullanıldığı fonksiyon sonlandırıldığında onlardan boşalan ram alanı ihtiyaç duyulan diğer local değişkenler tarafından kullanılırlar.

    Asıl program kodlarımızın Flash Program (ROM) daki yerleşim adresleride şu şekilde oldu.


    ROM Allocation:
    000004 topla
    00000D cikar
    000016 test
    000017 MAIN


    Edit: Mesajı imla ve kaydettikden sonraki görünüm bozuklukları için bir kaç defa düzenleme ihtiyacı hissettim.



    < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 29 Eylül 2019; 11:29:32 >




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.