Kayıtlar

gömülü sistemler etiketine sahip yayınlar gösteriliyor

C++ Dersleri | C++ Diziler [ Array ]

    C++ 'da d iziler, aynı veri tipine sahip adetli verilerin tek bir değişken ismiyle erişilebilir hale gelmesine olanak tanır. Ne diyebiliriz; ADC 'den veri okuyoruz, saniyede 100 örnek alacağız, her biri için adcVal1, adcVal2 .. adcVal100 diye yüz adet değişken tanımlayıp her birine verimizi kaydedebiliriz, çok pratik olmayacak gibi geldi bana ve de örnekleme sayımız parametrik ise bu yolu kullanmak zaten imkansız oluyor. Bu noktada dizilerden faydalanıyoruz. AdcVals diye bir dizi oluşturup, boyutunu belirtip hafızada bizim için o veri tipinin yüz adedinin sığabileceği bir bellek alanı ayırmasını söylüyoruz, verilerimizi onun içinde saklayıp yine oradan erişebiliyoruz.     C++ da bir diziyi her değişkende olduğu gibi önce tanımlamak "declare" sonrasında da dilersek başlatmak "initialize" gerekiyor. Sabit değerli diziler için dizi boyutunu da belirtmek gerekiyor ki hafıza organizasyonu işlevi düzgün görevini yerine getirebilsin. Sabit değerli diye ba

C++ Dersleri | Bit Alanları - Gömülü Sistemler Bellek Organizasyonu

Resim
     Gömülü sistemlerde hepimizin bildiği ya da şuanda öğreneceği üzere hafıza alanlarımız (flash - eprom - ram) oldukça kısıtlıdır. Atmega 328p için 2kb ram alanı var desek ve bunun da ancak 2048 tane harfi ram de barındırabileceği anlamına geldiğini söylesek, belki de şu okumakta olduğunuz metini bile ram de saklayamıyor olacağımızı kolayca tahmin edebiliriz. Bazı durumlarda herhangi bir parametrenin sadece açık ya da kapalı olduğunu tutmak istediğimiz bir değişkene ihtiyacımız olur. Ancak en küçük hafıza birimimiz 8 bit (1byte) olduğundan, 1 byte harcamadan 1 bitlik veriyi bir değişken içerisinde saklayabilmek mümkün değildir. Ancak bu bir byte 'ın geri kalan 7 bitini farklı değişkenler için kullanmamıza olanak tanıyan bit fields dediğimiz bir yapı vardır. Tanımlarken hangi değişken için kaç bitlik alan ayırmak istediğimizi belirtmemiz yeterli, bit ayırma işlemini compiler halleder.           Bir projede parametreleri kaydetmek isteyelim, hatta daha net olarak örneklendirelim,

C++ Dersleri | Bit işlemleri, Bit Clear ve Bit Set

 C++ dersleri bit işlemlerinde belki de en çok kullandığımız bit işlemlerinden biri bit set diğeri de bit clear dir desek yanılmış olayız herhalde, bitwise OR konusunda örneğini vermiştik burda da kullanalım: int indexOfBitToSet = 5 ; PORTB |= 1LL << indexOfBitToSet ; 5. indexteki bit 'i set eder. portB 'nin 5 numaralı pini Set edilmiş (HIGH) olur. Burada diğer pin konfigürasyonları bu durumdan etkilenmezler. PORTB 'nin 0000 0000b olduğunu düşünelim, 1 << 5 bize 0010 0000b değerini verir, bu değerle 0000 0000b değeri orlanırsa, gayet basitçe 5. indexin 1 olduğunu görebiliyoruz. Aynı şekilde bir bit dizesindeki belirli bir biti CLEAR (0) yapmak için bitwise and kullanıyoruz:   int indexOfBitToClear = 5 ;   PORTB &= ~( 1LL << indexOfBitToClear ); şimdide PORTB 'nin tümünün HIGH olduğunu varsayalım, 1111 1111b, 1 << 5 'den 0010 0000b değeri gelir, ifadenin başında yer alan ~ işaretiyle bit dizisindeki tüm değerler inverse oldu,

C++ Dersleri | Bit İşlemleri - Set Bitleri sayma

 C++ bit işlemlerinde bir bit dizesi içerisindeki SET (1) olmuş bitlerin sayısını elde etmek için bir kaç yol izleyebiliriz, basitçe programlama kafasıyla for kullanarak yapılabilir : int   main () { unsigned   int   a   =   1234 ;       // 0100 1101 0010 int   bitCount   =   0 ; for   ( bitCount   =   0 ;   a ;   a   >>=   1 ) bitCount   +=   a   &   1LL ; cout   <<   " result= "   <<   bitCount   <<   endl ; }  result=5  ne yapmış olduk açıklamaya çalışamadan önce for ne yapıyor onu anlatalım : for 'un ilk ifadesi bir kez çalıştırılır, ikinci ifadesi kontrol edilecek durumu belirler; burada yalnızca a var, bu ne anlama geliyor, bu ifade boolean bir ifade olmalıdır, 0 olmamışsa durumun sağlandığını kabul eder yani 3 5 7 vs diğer tüm sayılar true kabul edilir, yani for 'un bitme şartı a nın sıfır olması durumudur, en son ifadesi de her dönüşte yürütülecek kod ifadesidir, for'u yazmadan for'u da anlatmış olduk kıs

C++ Dersleri | Bit işlemleri - Bit Kontrol

 C++ bit işlemlerinde bir bit dizesindeki belirli bir bitin durumunu kontrol etmek için değeri elde etmek istediğimiz bitin indeks değeri kadar right shift yapıp üzerinde and işlemi uygulayarak yapılabilir. Cümle şeklinde ifade edince bana bile anlaşılabilir gelmedi :) kodla bakalım : int   main () { int   a   =   170 ;       // 10101010 int   result   =   ( a   >>   5 )   &   1LL ; cout   <<   " result= "   <<   result   <<   endl ;    }  result = 5  5. numaralı indexte yer alan bitin değerini sorguluyoruz, bu indexle kastettiğim sayma sayılarıyla değil, en sağdaki bit için 0 'dan başlayarak sayıyoruz anlamını ifade ediyor. Adım Adım şöyle gidiyor işlem : a = 10 1 01010 değerini   a >> 5 : 0000010 1 : yaptığımız zaman zaten istediğimiz bit en sağda yerini almış oluyor, bu değeri de 1 ile & işlemine tabi tutunca 1 ise 1, 0 ise döndürüyor result değişkenine. LL kullanmamızın sebebi Long Long deyip, değişkenin boyutundan bağı

C++ Dersleri | Bit İşlemleri - Bit Toggle

 C++ Dersleri | Bit İşlemleri - Bit Toggle; kısaca açıklamak gerekirse bir bit dizesinin istenen bitini toggle etmek, mevcut değerini ters çevirmek anlamına gelir, yani 0 ise 1, 1 ise 0 a çevirir. int   main () { int   a   =   255 ;       // 11111111 a   ^=   1LL   <<   7 ;    // 01111111 127 cout   <<   " a= "   <<   a   <<   endl ;    } a değişkeninin 7 bitini toggle yap demiş olduk, işlemi adım adım yazmamız gerekirse a 255 değerindeyken 8 bit, hepsi 1 şeklinde değer buluyor ikili sistemde -> 11111111 bu değeri (1 << 7) ile -> 10000000 xor işlemine tabii tutarsak 01111111 elde etmiş oluyoruz. Önceki konu :  Tüm Bitleri Set Etme Sonraki konu : Bit Kontrol

C++ Dersleri | Bit İşlemleri - Tüm Bitleri Set Etme

 C++ ve gömülü sistemlerde bir değişkene ya da yazmaca ait tüm bitlerin set edilmesi çokça kolay bir mantığa dayanır. Eğer değişkenin ya da yazmacın boyutunu biliyorsak o kadar bit sayısına eşit olan en büyük sayıya eşitleyerek işin içinden sıyrılabiliriz: 8 bitlik bir yazmaç için 0xFF 'e eşitlemek bir çözüm olmakla beraber eğer bilmiyorsak bir fonksiyon içerisine template ile geliyorsa mesela daha basit bir yolu da söz konusu: değeri -1 e eşitlemek.  uint8_t a = 0xFF ;      Yazının birinde bahsetmiştik, işaretli sayıların MSB biti (en solda) işaret biti olup 0 ise sayının pozitif 1 ise negatif olduğu anlamına geliyordu ve negatif tarafta anlamlı bitler 1 'ler değil 0'lardı. Ne demeye çalışıyorum ? 8 bit için konuşursak : -1 sayısı 2 lik sistemde 11111111b olarak ifade edilir, bence tüm bitleri set etmek için güzel yöntem :)   PORTB = - 1 ; Tüm bitleri resetlemek istersek? Bilmem söylemeye gerek var mı ama yazmış olalım : a=0; işinizi çözecektir. Herkese kolay gels

C++ Dersleri | Bitwise Operatörleri | Right Shift Operatör

 C++ bitwise operatörlerden right shift operatörünü konu alıyoruz >> . Right shift operatörü,   C++ Dersleri | Bitwise Operatörleri | Left Shift Operatör konusunda bahsettiğimiz tüm özellikleri taşıyor, tek farkla : bit dizisini sağa doğru kaydırıyor. Bir örnekle right shift operatörünün nasıl kullanıldığına bakalım: int   main () { int   a   =   2 ; // 0010b int   b   =   a   >>   1 ; // 0001b cout   <<   " a= "   <<   a   <<   " , b= "   <<   b ; } çıktımız şu şekilde :  a=2, b=1  Kolayca anlayabileceğimiz şekilde a değişkeni için oluşan binary sistem diziliminde indexlemeye göre 1. bit hanesinde yer alan operatöre gönderdiğimiz sayı :1 adedince sağ tarafa kaydırılmış. Left Shift operatörü için sayıyı 2 'nin kuvvetleriyle çarpmakla aynı şey demiştik, burada olan da sayıyı 2 'nin kuvvetleriyle bölmekle aynı şeydir. a değişkeninin değeri olan 2 'yi 2^1 'e (bu 1 operatöre gönderilen 1) bölerek 1 eld