29 Aralık 2016 Perşembe

RTOS 
Real Time Operating System

    Mikrodenetleyiciler küçük ve kaynakları sınırlı işlemcilerdir. işlemciler programlarını ROM veya FLASH'ta tutarlar. Programları buradan yürütürler. Programın çalışması için RAM'e ihtiyaç duyarlar. Tipik bir program direkt olarak ROM'dan çalışır.

    Mikro denetleyiciler en alt gömülü uygulamalar kullanarak özelleştirilmiş işlemleri yaparlar. FreeRTOS, Real Time Scheduling, Görevler arası iletişim(inter-task communication) , zamanlama(timing) ve senkronizasyon ilkelerini içerir. 

    İşletim sistemi tasarımlarında önemli bir konu olan işlemci zamanlama algoritmalarına bir göz atalım. (CPU scheduling algorithms). Bu algoritmaların çalışma prensibi şöyledir; sırası gelen işlem biz bunlara genelde fonksiyon diyoruz. Bekleme sırasına alınarak görevlendirici (dispatcher) olarak adlandırılan bir işlem tarafından CPU'ya gönderilir. RTOS işlemci zamanlama algoritmasının izin verdiği kadar, fonksiyonu bitene kadar veya belirli bir zaman geçene kadar çalıştırır ve hafızadan kaldırır. Böylece birden çok fonksiyon tek bir işlemci tarafından çalıştırılır. Burada kullanılan algoritmaları iki kısımda inceleyebiliriz;
  • Kesintili algoritmalar (preemptive algorithms)
  • Kesintisiz algoritmalar (nonpreemptive algorithms)
    Kesintili algoritmalarda bir Task( bundan sonra işlemlere Task  diyeceğiz) RTOS tarafından belirlenmiş bir süre kadar çalıştırılır ve diğer bir Task'ın çalıştırılmasına geçer. Böylece birden fazla Task zaman paylaşımlı olarak çalıştırılmış olur.

    Kesintisiz algoritmalarda  çalıştırılan Task bitene kadar diğer Task çalıştırılmaz. Task'lar birbirlerini beklerler. Kesintisiz algoritmalara örnek;
  
En Kısa Task İlk (Shortest job first)
İlk Gelen İlk Çıkar (First in first out)
İlk Gelen Son Çıkar (First in last out)

Birbirini Dışlama (Mutually Exclusive)


    İki Task'ın birbiri ile ilişkisizliğini belirtmek için kullanılan terimdir. Bazı dokümanlarda Mutex olarak kısaltılarak da kullanılır.

    İki Task paralel olarak çalıştırıldığında (aslında zaman paylaşımlı kısım kısım çalıştırıldığında) aynı kaynağı veya global tanımlanmış aynı değişkeni kullanabilirler. Bu kullanım yazılımda hatalara sebep olabilir. Bu problemin çözümü için Task'ların senkronize edilmesi gerekmektedir. Temel işletim sistemlerinde 4(dört) yöntem kullanılır.
  • Koşullu Değişkenler (Conditional Variable)
  • Semaforlar (Semaphores)
  • Kilitler (Locks)
  • Monitörler (Monitors)
    Biz bunlardan Semaforları inceleyelim.

Semafor (Semaphors)


    İşletim sistemlerinde eş zamanlı programlamada sıkça kullanılan bir yöntemdir. Birden fazla Task'ın aynı anda çalışması durumunda birbirleri için risk teşkil ettikleri zamanlarda Task'ların birbirlerini beklemesini sağlayan bir mekanizmadır.

    Semafor kullanımında bölünmezlik (atomicity) baş roldedir. Yani tanımlanmış bir semafor'un içerisinde çalışan birden fazla fonksiyon işletim sistemi tarafından tek bir Task olarak kabul edilir ve araya herhangi bir Task girerek çalıştırılmaz. Semafor'lar iki tipte kullanılırlar;
  • İkili Semafor'lar (Binary Semaphores)
  • Tam sayı Semafor'lar ( Integer Semaphores)
    İkili semafor'lar sadece iki Task arasında eşleme sağlarlar. Üçüncü bir Task'a eşleme sağlamazlar. Tam sayı semafor'lar istenilen sayıda Task arasında eşleme sağlarlar.

Kaynak: ST UM1722.pdf , Yrd.Doç.Dr.Şadi Evren ŞEKER


19 Kasım 2016 Cumartesi

CLANG C Derleyici İncelemeleri

Ubuntu 14.04 LTS işletim sisteminde Uçbirimi açalım. Uçbirime aşağıdaki komutu yazalım.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ gedit

ile gedit editörünü açın. Burada aşağıdaki kodu yazın.

#include <stdio.h>
#include <stdlib.h>

// this program count from 1 to 10 in a for loop.

int main()
{
         int z=10;

         char text[]="value of i = ";
         int i;

         printf("\nStart of the program!\n\n");
         for(i=0; i<10;i++)
         {
                  /* code */
                  printf("%s = %d\n", text, i+1);
         }

         printf("\nEnd os the program!\n");
         
         return 0;
}
Yazdığımız c kodunu sample.c olarak bulunduğunuz dizin içerisine kayıt edin. gedit editörünü kapatın. Komut satırına tekrar gelin.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ ls

komutunu işletin ve dizin içerisindeki dosyalara bakın.

sample.c

görüldüğü gibi oluşturmuş olduğumuz c dosya burada. Şimdi bu dosyayı clang compiler ile derleyelim.

komut satırına bunu yazın.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ clang sample.c

derleme sonrasında dizin içerisine tekrar bakalım;

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ ls
a.out sample.c

Derleme sonrasında dizin içerisinde a.out isimli bir doysa oluştu. Şimdi bu dosyayı çalıştıralım.
Komut satırına ./ ile beraber oluşan a.out dosyasının ismini uzantısı ile beraber yazalım.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ ./a.out

Program çalıştığında aşağıdaki çıktıyı verir.

Start of the program!

value of i = = 1
value of i = = 2
value of i = = 3
value of i = = 4
value of i = = 5
value of i = = 6
value of i = = 7
value of i = = 8
value of i = = 9
value of i = = 10

End os the program!

Şimdi de çalıştırılabilir dosya derleyelim;
Komut satırına aşağıdaki komutları yazalım.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ clang sample.c -o result

Derleme sonrasında tekrar dizin içerisine bakalım.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ ls

a.out result sample.c

Görüldüğü gibi result isminde bir çalıştırılabilir dosya oluştu. Şimdi tekrar bu dosyayı çalıştıralım.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ ./result

Program aşağıdaki gibi çıktı verecektir.

Start of the program!

value of i = = 1
value of i = = 2
value of i = = 3
value of i = = 4
value of i = = 5
value of i = = 6
value of i = = 7
value of i = = 8
value of i = = 9
value of i = = 10

End os the program!

Şimdi yazdığımız kodu derledik ve çalıştırdık. Lakin kodumuz ile ilgili uyarıları hiç görmedik. Uyarıları görebilmek için aşağıdaki komutları kullanarak kodumuzu derleyelim.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ clang -Wall sample.c -o

resultsample.c:8:6: warning: unused variable 'z' [-Wunused-variable]
int z=10;
^
1 warning generated.

Çıktıdan görüldüğü üzere 1 adet uyarımız var. Kod içinde "int" tipte "z" değişkeni oluşturmuşuz lakin bu değişkeni hiç kullanmamışız. Derleyici bizi uyarıyor. Kodumuzu gedit ile tekrar açalım.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ gedit sample.c

#include <stdio.h>
#include <stdlib.h>

// this program count from 1 to 10 in a for loop.

int main()
{
         //int z=10;

         char text[]="value of i = ";
         int i;

         printf("\nStart of the program!\n\n");
         for(i=0; i<10;i++)
         {
                  /* code */
                  printf("%s = %d\n", text, i+1);
         }

         printf("\nEnd os the program!\n");
         
         return 0;
}

Burada ilgili tanımlamayı comment içine alalım ve kodumuzu tekrar derleyelim.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ clang -Wall sample.c -o result

Derleme sonrası uyarı mesajı almadık. Şimdi kodumuzu çalıştıralım.

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ ./result

Start of the program!

value of i = = 1
value of i = = 2
value of i = = 3
value of i = = 4
value of i = = 5
value of i = = 6
value of i = = 7
value of i = = 8
value of i = = 9
value of i = = 10

End os the program!

hakki@hakki-Lenovo-ideapad-300-17ISK:~/Clang_prg$ 

Böylece ilk "c" kodumuzu yazdık , derledik ve çalıştırdık.

Saygılarımla...

5 Eylül 2016 Pazartesi

Merhaba,

RF ile ilgili öğrenci projeleri, mikro işlemcili kart tasarımları yapılır. irtibat için m.hakki.kaplan@gmail.com adresinden ulaşabilirsiniz.


28 Haziran 2016 Salı

SPARK GAPS TEKNİĞİ



      Spark Gap metodu elektronik kartlarda bulunan konnektör girişlerinden gelebilecek yüksek voltajlı ESD’yi önleyen bir PCB tekniğidir. Yüksek ESD voltajı oluşturulan boşluklardan Ground’a sıçrayarak devrede bulunan girişler korunmuş olur.


Formulasyon


V= (3000.p.d)+1350

Burada p atmosfer basıncı, d ise iki gap arasındaki uzaklıktır(milimetre)
Bazı uygulanmış PCB örnekleri;