20
Oct
2020

Stage-b

Görevler:

  • Index objeleri için struct oluşturulması
  • Sub-index objeleri için struct oluşturulması
  • Objelerin type karakteristikleri için enum tanımlanması
  • Sub-index ve index struct’ları tanımlanması

Objeleri tanımlayıp ilk değerlerini atadıktan sonra her objeyi ayrı ayrı ifadelendirmek gerekmektedir. Tablodan da görüleceği gibi her objenin özelliği, tipi, hangi konumda olduğu (index ve sub-index numarası) bilgileri bulunmaktadır. Bu ifadeleri her objeye atayabilmek için yeni struct üreteceğiz. Ancak burada sub-index’i olmayan bir objenin sahip olacağı içerikler ile sub-index objesinin içerikleri aynı olmayacaktır. Örnek verecek olursak, Tablodaki 0x1001 objesinin doğrudan bir değişkeni yoktur. Bu objenin sub-index’lerinin değişken ataması olacaktır. Aynı şekilde sub-index objelerini ifadelendirirken index numarasını belirtmeye tekrardan gerek yoktur. Çünkü aynı index altındaki tüm sub-index’lerin index numaraları aynıdır. Buna göre index ve sub-index objelerinin ayrı ayrı structları olacaktır.

Index struct yapısı tablodan da görüleceği gibi index numarası, sub-index sayısı, tipi, karakteristik özelliği ve değişkenin kendisini içerecektir.

Objelerin tip bilgisi kod aşamasında bize boyut (length) açısından işe yarayacağından tip yerine lenght ifadesini kullanacağız. Değişkenin tipi kaç byte ise o değer buraya atanacak.

Buna göre index struct yapısı aşağıdaki gibi olacaktır.

index: objenin index numarasını tutar.

nof_SubIndex: Objenin sub-index’leri var ise sub-index numarası tutulur. Eğer objenin sub-index parametreleri yok ise bu değer 0’dır.

length: Objenin type karşılığındaki byte değerini tutar. Bu değer sizeof() değerine eşittir. Eğer objenin sub-index’leri var ise bu değer 0’dır.

attr: Objenin karakteristik özelliğini tutan değişkendir. (read-write vs.) Eğer objenin sub-index parametreleri var ise bu değer 0’dır.

data:  Objenin data değişkeninin adresini tutar. Bu değişkenin void tipinde olmasının sebebi değerini tutacağı data değişkeninin adresinin belirsiz olmasından dolayıdır. Eğer obje sub-index parametreleri içermiyorsa bu değişken doğrudan data değişkeninin adresini tutar. Eğer obje sub-index parametreleri içeriyorsa bu değişken sub-index struct’ının adresini tutar.

sub-index objeleri için gerekli olan struct yapısı da aşağıdaki gibi olacaktır:

Bu struct eğer bir index’in sub-index parametreleri var ise o index’in data pointer’ına eşitlenir. Kaç adet sub-index var ise bu sub-index’ler yukarıda Obj_subIndex_t tipinde array oluşturularak tanımlanır. Index struct’ı içerisinde data pointer’ın adresi bu sub-index array struct’ın adresine eşitlenir.

Daha anlaşılır ve kontrol etmesi daha rahat bir sistem geliştirebilmek için C programlama dilinin imkan verdiği özellikleri kullanmak gerekmektedir. Bu özellikler performans açısından herhangi bir verim kaybı ya da kazancı sağlamasa da temiz bir kod için gereklidir. Enum tipi bu özelliklerden biridir. Uygulamamızda attr olarak adlandırdığımız dataların karakteristik özelliğini tutacak olan değişkeni enum başlıklarıyla atayacağız. Binary çözümleme yapabilmek için enum içerisindeki başlıkları 2^n sıralamasıyla gireceğiz. Bu sistem attr değerini yine enum başlıkları ile çözümlemeyi sağlayacaktır.

Enum başlıklarımız şöyle olacaktır:

Tüm malzemelerimizi tezgahımıza aldığımıza göre birleştirip yemek yapmaya başlayabiliriz.

Yukarıdaki tüm tanımlamaları başlık dosyasına ekledikten sonra bu tiplerden oluşturup dataları .c dosyasında tanımlayacağız.

Sub-index’leri olan bir datanın atamasını burada ben göstereceğim. Diğerini siz tanımlayın.

Tablomuzdaki index sayısı 6 tanedir. Sub-index’li index sayısı ise 2’dir.

Sub-index’li parametrelerin Obj_subIndex_t struct ile tanımlanması ile başlamak gerekmektedir. Sistemin en uç noktası burası olduğu için ilk olarak bu tanımlamaları yapmak zorundayız. Bu struct’ları tanımlarken const olarak belirtmemiz gerekmektedir. Çünkü hiçbir index ve sub-index’in struct içerisindeki parametreleri başlangıçta belirtilen değer dışına çıkacağı durum yoktur.

Soru (?): Struct içerisinde data pointer’ı bulunmaktadır. Struct’ları belirttiğimiz gibi const olarak tanımladıktan sonra datalar sabit mi kalacak?

Cevap: Hayır, biz dataları değil dataların adreslerini const ifade içerisinde tanımlıyoruz. Dataların adreslerinin değişmeyeceğini garanti ediyoruz. Çünkü struct’lar içerisinde data’yı temsil eden tanımlama pointer olarak bildirilmiştir ve böyle tanımlanacaktır.

 

LED_Service:

5 adet sub-index parametresi bulunmaktadır. Bu beş parametreyi Obj_subIndex_t dizisi oluşturarak tanımlayalım.

Daha açıklayıcı olsun diye struct dizisinin ilk elemanını inceleyelim:

 { (void*)&objects.LED_Service.noSubIndex, OBJ_READABLE, 1 }

Daha önce oluşturmuş olduğumuz dataların aslının bulunduğu objects struct içerisindeki LED_Service index’inin ilk datası void pointer olarak tanımlandı. İkinci elaman attr değerini enum tanımlamalarından seçildi. Tabloya göre değişken sadece okunabilir olduğu için OBJ_READABLE tanımlaması yazıldı. Struct son elemanı objenin type karşılığındaki byte değerini tuttuğu için tabloda uint8_t tipinin byte karşılığı olan 1 yazılmıştır.

Tüm sub-index struct’ları tanımlandıktan sonra index struct’ının oluşturulmasına geçebiliriz.

Daha önce oluşturduğumuz index struct ile toplam index sayımız kadar dizi oluşturacağız. Diziyi tanımlarken tablodaki index sırasına göre tanımlamak gerekmektedir. Çünkü bu diziyi kullanarak işlem yapacağımız zaman hangi index’in dizinin hangi sıradaki elemanı olduğunu önceden bilemeyeceğiz. Ancak ben diziyi oluştururken yine de sırasına göre ekledim. Dizinin eleman sayısını tutan NOF_INDEX_ARRAY adında bir makroyu başlık dosyama ekledim. Değeri uygulamız için 6 olacaktır.

Yukarıdaki tanımlamada data pointer’a sub-index dizisinin adresi ya da doğrudan değişkenin adresi girilmiştir. Bununla beraber tanımlama işini bitirmiş bulunmaktayız.

 

Bu kısıma kadar olan kodların olduğu github repo linki:

https://github.com/mekzum/40ambar/tree/master/Section-1/stage-b