Stage-a
Bir gömülü sistem projesinde bir birimi (slave) kontrol eden başka bir birime (master) hangi dataları kontrol edebileceğini ortak bir dil ile söylemek gerekmektedir. Haberleşme protokollerinin var olma sebebi de budur. Kontrol edilecek cihaz kontrol edilmesi gereken değişkenlerini haberleşme protokolünün kurallarına uygun adresleyerek dokümante eder. Adreslenmiş dataları belli olan bir cihaz için değişkenlerine kontrollü ve güvenli şekilde erişimi sağlayan kısmı koda dökeceğiz.
Yazının başında CANopen’dan esinlendiğimi söylemiştim. CANopen data adresleme mantığıyla ben bazı değişken listesi oluşturup adreslendirilmesini yaptım. Tekrarlıyorum CANopen hakkında en küçük bir bilgiye sahip olmanız bile gerekmiyor bu uygulamayı yapabilmek için. Ben şimdi kullanacağımız adresleme mantığını anlatacağım. Öncesinde oluşturduğum listeyi aşağıda görebilirsiniz.
Bu adresleme mantığına göre değişkenlerin index numarası bulunmaktadır. Ancak aynı kategori altındaki değişkenler farklı index numaraları yerine tek index altında farklı sub-index numaralarında tutulmaktadır. Yukarıdaki tabloda görüleceği gibi LED kontrolü için oluşturduğumuz servisin index numarası var ancak LED’lerin bu indexe bağlı ayrı ayrı sub-index numaraları bulunmaktadır. Kategorilendirilmemiş bir değişkenin sadece index numarası bulunmaktadır. Örnek olarak yukarıdaki listede verilen Value 1 değişkeni index objesidir ve bu sebepten dolayı sub-index değeri 0’dır. Kategorilendirilmiş (sub-index) değişkenlerin bağlı olduğu index’in her zaman ilk sub-index değişkeni bu indexe bağlı kaç tane değişkenin olduğunu gösterir. Örnek verecek olursak dört değişken içeren bir index’in bu dört sayısını tutan bir elemana daha ihtiyaç duyacağımız için bu index’in toplam beş alt değişkeni (sub-index) bulunmaktadır. Tablodaki nof_sub (sub-index sayısı) bunu göstermektedir. Bu değişken kodlama aşamasında bize çok yardımcı olacaktır.
Tabloda görüleceği gibi index altındaki her değişkenin tip bilgisi (type), değişkenin özellikleri (attr.), ve değişkenin başlangıç değeri (default) bulunmaktadır. Ayrıca değişkenin tam işlevini anlatan kısımda listede sonda bulunmaktadır. (description)
Bu listeyi detaylı inceleyelim.
Name: Index’in ve değişkenlerin adını belirtir.
Index: Değişkeni adreslendirmek için kullanılan sayıdır. 16-bit genişliğindedir. Hexadecimal olarak yazılmıştır.
Not: Yukarıdaki tabloda index numaraları 0x1000 ile başlamıştır. Herhangi bir haberleşme protokolünü baz almadığımız için bu sayı farklı bir sayı da olabilirdi. Dileyen farklı index adresleri girebilir.
Sub-Index: Sub-index’lerin numaralarını belirtir. Sub-index’lerin de index’ler gibi diğer özellikleri girilmiştir.
Type: Değişkenlerin data tipini gösterir. Yukarıdaki tablodan görüleceği gibi aynı index altındaki değişkenlerin tipleri farklı olabilmektedir.
Attr (Attribute): Değişkenlerin karakteristik özelliğini gösterir.
ro: Read Only (bu değişken sadece okunabilir, değeri değiştirilemez.)
rw: Read-Write (bu değişken hem okunabilir hem de değiştirilebilir.)
Default Value: Değişkenlerin başlangıç değerlerini gösterir.
Description: Değişkenlerin projedeki işlevini açıklar.
Tablo özelinde birkaç örnek verilecekse eğer:
LED1 ile işaretlenmiş LED’in değeri değişecekse eğer 0x1000 indexinin 1. sub-index’ini değiştirmek gerekmektedir. Talep şu şekilde olmalıdır. 0x1000 indexinin 1. sub-index’inin değeri ‘1’ olsun.
Bu açıklamalardan sonra kodlamaya başlayabiliriz. Haydi mutfağa!
Kodlayacağımız her bölümün başlangıcında ne yapmamız gerektiğini yazacağım. Ne yapmamız gerektiğine bakıp kendiniz yapmaya çalışırsanız eğer ve daha sonra da benim paylaştığım kod ile karşılaştırır iseniz daha faydalı olacaktır.
Görevler:
- Değişken listemizi koda dökmek.
- Sub-indexli olan değişkenleri index’inin adında struct içerisinde birleştirmek, prototiplerini oluşturmak.
- Tüm tanımlamalarımızı objects ana bir struct içerisinde tanımlamak.
- Tanımladığımız bu temel struct’ı initialize etmek.
Bu aşamadan sonra değişkenleri obje diye adlandıracağız. Şu an kullandığımız projede objects adında .c ve .h dosyaları oluşturalım.
Yukarıda kategorilenmiş değişkenlerin (objelerin) struct bildirimleri (declaration) gösterilmiştir.
Sub-index’lenmemiş index objelerinin struct prototipini oluşturmaya gerek yoktur. Bu değişkenleri ve sub-index’lenmiş struct tanımlamalarını bir arada tutan yeni bir struct yaratmamız gerekiyor. Bu struct objelerin tamamını tutan ana struct kabul edilecek.
Buna göre struct şöyle olacaktır:
Bu struct’ı objects.c dosyası içerisinde Objects_t tipinden global bir nesne tanımlayıp içini tabloda verilen değerlere göre tanımlamak gerekmektedir. Oluşturacağımız bu global nesneyi uygulama katmanı da kullanacaktır.
Tabloda verilen ilk değerlerine göre ataması yapılan objects adındaki nesnemiz aşağıda gibi tanımlanacaktır.
Uygulamamızın ‘a’ bölümünü bitirmiş bulunmaktayız. Bu kısmı dahil ettiğimiz ya da oluşturduğumuz projede debug üzerinden test edebiliriz. Debug ekranında objects nesnesini izlemeye aldığımız zaman aşağıdaki gibi görüntülenecektir.
Sadece bu kısmı içeren projenin github linki:
https://github.com/mekzum/40ambar/tree/master/Section-1/stage-a