%100 Arduino Rtos Kullanımı Nasıl Yapılır ?

Arduino Rtos
Arduino Rtos

 Bu makalede Arduino rtos ile bir zaman dilimi içinde birden çok belirli görevi gerçekleştirmek için FreeRTOS işletim sistemini Arduino ile nasıl kullanacağınızı öğreneceksiniz. Arduino Uno kartını kullanarak FreeRTOS ile birden fazla iş parçacığı veya görev yürütmeyi öğreneceğiz. Gösteri için dört görev oluşturacağız ve Arduino’nun kaynaklarını belirli bir süre için her göreve atayacağız ve her göreve öncelik vereceğiz.

RTOS Tanıtım

RTOS nedir?

RTOS olarak da bilinen Gerçek Zamanlı İşletim Sistemi, gerçek zamanlı uygulama gereksinimini karşılamayı amaçlayan bir işletim sistemidir. Tipik olarak arabelleğe alma gecikmeleri olmadan verileri geldiği gibi işleyebilir. RTOS, önceden tanımlanmış işlevlerin çağrılmasıdır.

Arduino RTOS’u sıradan C programından farklı kılan nedir?

Gerçek Zamanlı İşletim Sistemindeki temel faktörler minimum kesme gecikmesi ve minimum iş parçacığı değiştirme gecikmesidir. Gerçek Zamanlı İşletim Sistemi, görevleri belirli bir sürede tamamlamak için ne kadar hızlı ve ne kadar öngörülebilir yanıt verdiğine göre daha değerlidir.

Farklı RTOS türleri nelerdir?

Üç tip RTOS vardır:
1. Sert RTOS; verilen bir süre içinde bir görevi tamamlamak zorunda.
2. RTOS; Son başvuru tarihi vardır ancak son teslim tarihini kaçırırlarsa kabul edilebilir ancak Sert RTOS durumunda kabul edilemez.
3. Yumuşak RTOS; herhangi bir süre sınırlaması yoktur.

Ünlü RTOS nedir?

LynxOS, RTLinux, VxWorks, FreeRTOS, OSE, QNX, Windows CE

Arduino RTOS Artıları

Arduino için iyi bir gömülü yazılım yazdığımızda FREERTOS’a ihtiyacımız yok, ancak karmaşıklığı ve boyutu arttığında FreeRTOS aşağıda listelenen nedenlerden dolayı her zaman faydalıdır:

  • Zamanlama bilgilerini özetleme
  • İdame / Genişletilebilirlik
  • Modülarite
  • Daha temiz arayüzler
  • Daha kolay test (bazı durumlarda)
  • Kodun yeniden kullanımı
  • Verimliliği arttırmak
  • Boşta kalma süresi
  • Esnek kesme kullanımı
  • Karışık işleme gereksinimleri
  • Çevre birimleri üzerinde daha kolay kontrol

Arduino RTOS Eksileri

Bunlar RTOS kullanmanın avantajlarıdır, ancak aşağıda listelenen bazı dezavantajlar da vardır:

  • Düşük Öncelikli Görevler
  • Kodun hassasiyeti
  • Sınırlı Görevler
  • Karmaşık algoritmalar
  • Aygıt sürücüsü ve kesme sinyalleri
  • Konu Önceliği
  • Pahalı
  • Programlamak kolay değil

FreeRTOS Tanıtım

Tipik gerçek zamanlı işletim sistemlerinin aksine, FreeRTOS mikrodenetleyiciler için özel olarak tasarlanmıştır. Mikrodenetleyiciler sınırlı kaynaklarla geldiğinden, mevcut mikrodenetleyici kaynaklarına göre bir işletim sistemine ihtiyacımız vardır. RTOS tabanlı uygulamalarda ücretsiz olarak indirilebileceği ve kullanılabileceği anlamına gelen açık kaynaklı bir çekirdek. Yine de OpenRTOS ve SafeRTOS gibi iki ticari varyantı vardır.

Daha önce de belirttiğimiz gibi, FreeRTOS kullanarak, Arduino’nun her görevinin belirleyici bir yürütme modeline sahip olacağından ve her görevin yürütme son tarihini karşılayacağından emin olabiliriz. Başka bir deyişle, Arduino CPU kaynaklarını bir programlama algoritmasına göre her göreve atanan bir zamanlayıcıdır. Gerçek zamanlı işletim sistemi aşağıdaki gibi farklı zamanlama algoritmalarına sahiptir. Malesef bu makaleler ingilizcedir eğer isterseniz yorumlara yazın türkçe döküman hazırlayabilirim.

FreeRTOS Özellikleri

Ana çekirdek özellikleri şunlardır:

  • Sabit Öncelikli Önleyici Zaman dilimleme Zamanlayıcısı
  • Kuyruklar Arası İşlemler Arası İletişim
  • Görev önceliği ayarı, görev askıya alma, görev silme ve Görev gecikmesi gibi Görev Yönetimi
  • Gatekeeper Görevleri, Semafor ve Muteks ile Görev Eşitleme
  • Zamanlama ölçüm kancası
  • Çalışma süresi İzleme kancaları
  • Yazılım zamanlayıcı yönetimi
  • Kesme yönetimi

Arduino RTOS nasıl kullanılır?

Bu projede kullanılan RTOS, FreeRTOS’tur. FreeRTOS, Real Time Engineers Ltd. tarafından geliştirilmiştir. Açık kaynaklı bir popüler Gerçek Zamanlı İşletim Sistemi çekirdeğidir. Ayrıca, mikrodenetleyiciler Arduino olan gömülü cihazlar için kullanılır. Çoğunlukla C ile yazılır, ancak bazı işlevler montajda yazılır. FreeRTOS’a benzer çevrimiçi olarak SafeRTOS ve OpenRTOS da mevcuttur.

Arduino IDE’de FreeRTOS İndirin ve Yükleyin

İlk olarak, Arduino IDE’de FreeRTOS’u indirip yüklemeniz gerekir. Ancak daha önce Arduino IDE’yi kullanmadıysanız, aşağıdaki öğreticiden geçmelisiniz.

Bundan sonra bu github bağlantısına gidin ve FreeRTOS kütüphanesini indirin:FREERTOS’U İNDİRİN

FreeRTOS kitaplığını indirdikten sonra klasörü çıkarın ve bu ayıklanan klasörü Arduino IDE kütüphaneleri klasörüne aşağıda gösterildiği gibi yapıştırın.

Arduino Rtos yükleme
Arduino Rtos yükleme

Arduino RTOS kütüphanesi doğrudan Arduino Kütüphane Yöneticisi aracılığıyla da kurulabilir. Bunun için Arduino IDE’yi açın ve Sketch >> ”Kitaplığı Dahil Et” e gidin ve Kitaplıkları yönet’e tıklayın.

Arduino Rtos ide ile yükleme
Arduino Rtos ide ile yükleme

Bundan sonra, arama penceresine “FreeRTOS yazın, bu kütüphane görünecektir. Bundan sonra yükle düğmesine tıklayın.

Arduino Rtos kütüphanesi arama penceresi
Arduino Rtos kütüphanesi arama penceresi

Arduino RTOS Görev Yönetimi

Çok görevli bir sistemde, uygulama birçok görevden oluşabilir. Tek çekirdekli işlemci kullanıyorsanız, işlemci üzerinde herhangi bir zamanda yalnızca bir görev çalışabilir. Bu nedenle, yalnızca bir görev çalışır durumda ve diğer tüm görevler çalışır durumda olmaz. Bu, RTOS tabanlı uygulamalarda görevlerin çalışma durumunda veya çalışma durumunda olabileceği anlamına gelir.

Bir görevin çalışma durumu ayrıca engellenen durum, hazır durum ve askıya alınmış durum gibi üç alt duruma ayrılabilir. Aşağıdaki şekilde, çoklu görev sistemindeki bir görevin geçiş ömrü gösterilmektedir. 

FreeRTOS görev durumu
Arduino Rtos Diyagramı

Arduino RTOS Görevler Devletleri

Engellenen Durum

Bir görev birçok nedenden dolayı engellenmiş durumda olabilir. Örneğin, bir görev, görevin periyodik doğası nedeniyle ertelenir ve belirlenen her gecikmeden sonra periyodik olarak kullanılabilir hale gelir. Başka bir neden, kesme bekletme veya kaynak bekletme olabilir. Bir görev harici kesmeyi veya ikili semafor, semafor ve muteks sayma gibi bir kaynağı bekliyor. 

Askıya Alınan Durum

Askıya alınan durum aynı zamanda çalışmayan bir görevin de bir alt tabakasıdır. Uygulama programcısı vTaskSuspend () FreeRTOS API işlevini kullanarak görevi askıya alabilir ve vTaskResume () API işlevini kullanarak göreve devam edebilir.

Not: Engellenen veya askıya alınan durumlardaki görevler bir zamanlayıcı tarafından zamanlanamaz. 

Hazır Durumu 

Bir görev engellenmiş veya askıya alınmış durumda değilse, hazır durumda olacaktır. Hazır durumda olan görevler, işlemci bir zamanlama ilkesine göre seçer seçmez yürütmeye hazırdır.

Bir görev çalışan bir durumdan çalışmayan bir duruma her geçiş yaptığında, bir bağlam değişikliği gerçekleşir. Bu, kayıt değerlerini, geçici değişken değerlerini vb.Görev kontrol bloğuna kaydeder ve tekrar çalışma durumuna gireceği zaman, yürütmeyi bıraktığı yerden başlatacaktır. Aynı yerden yürütmeyi başlatmak için, değerleri TCB’den işlemci kayıtlarına tekrar yükleyecektir. 

Görevler Nasıl Oluşturulur?

Çok görevli faydalar, ancak her bir yürütmenin görevler yardımıyla gerçekleştirilmesiyle elde edilebilir. Örneğin, arduino projenizde sıcaklığı ölçmek ve değerini LCD’de görüntülemek istersiniz. Bu projeyi aşağıdaki gibi üç göreve ayırabiliriz:

  • Arduino ADC Değerini Oku
  • ADC Değerini Sıcaklığa Dönüştürücü
  • LCD’de Baskı Sıcaklığı

Bu şekilde, görevin kritik niteliğine göre her göreve öncelik atayabiliriz. Örneğin, ADC değeri okuması en önemlisidir ve LCD’de yazdırma sıcaklığı değeri en az önemli görevdir. Bu nedenle, ADC görevine en yüksek önceliği ve LCD görevine en düşük önceliği atayabiliriz.

Arduino RTOS Görev Oluşturma

xCreateTask işlevi görevler oluşturmak için kullanılır ve hazır kuyruğa ekler. Görevin çeşitli özelliklerini tanımlamak için girdi olarak 5 bağımsız değişken gerekir

xTaskCreate(MyTask_pointer, "task_name", 100, Parameter, Priority, TaskHandle);
İşaretçiden Göreve İşlev

MyTask_pointer: Görev oluşturma işlevinin bu ilk argümanı, bir görevin işlev tanımının bir göstergesidir. Çünkü yardım işleviyle bir görev tanımlamamız gerekiyor. Daha sonra bir fonksiyonun nasıl tanımlanacağını ve bu işaretçiyi argüman olarak bir fonksiyona nasıl geçireceğimizi göreceğiz.

task_name: Bu bağımsız değişken yalnızca oluşturacağımız işlevin / görevin adıdır.

Yığın Boyutu

StackDepth: Çoklu görevde, her görevin / iş parçacığının kendi yığını vardır. Bir görevin yığın boyutunu bayt olarak tanımlar. Bu nedenle, hesaplama karmaşıklığına göre yığın boyutunu seçtiğinizden emin olmalısınız. Örneğin, bu örnekte 100 bayt boyutunu seçiyoruz.

Parametre: Bir değişkene görev işlevine bağımsız değişken olarak bir işaretçi iletmek istiyorsak, bu bağımsız değişkeni kullanabiliriz. Aksi takdirde, NULL değerini iletebiliriz. Bu bağımsız değişken, görevin (işlevin) alabileceği bir değişkenin işaretçisidir.

Öncelik nasıl ayarlanır?

Öncelik : Bu önemli bir parametredir çünkü görevlerin önceliğini ayarlamak için kullanılır. Sayıları argüman olarak geçirerek önceliği belirledik. Örneğin, dört görev oluşturup öncelik 0, 1,2 ve 3’ü atarsak, sıfır en düşük öncelik, 3 en yüksek önceliktir.

TaskHandle : Bu bağımsız değişken, bir görevin silinmesi, önceliğinin değiştirilmesi vb. Gibi işlev özelliklerini değiştirmek için kullanabileceğimiz işlevin tutamağını tutar.

Özetle, xCreatTask kullanarak birden çok iş parçacığı oluşturabiliriz. Ancak her göreve benzersiz işaretçi adı ve adı sağladığınızdan emin olun.

Görev Yürütme Düzenini Ayarlama

vTaskDelayUntil, belirli bir görev yürütme dizisini tanımlamak için kullanılır. Örneğin, dört görevimiz varsa ve her bir görevi 100, 120, 130 ve 140ms’den sonra yürütmek istiyorsak, vTaskDelayUntil görevi ilk yürütüldükten sonra belirli bir süre için engeller.

Not: vTaskDelayUntil, Arduino IDE’nin delay () işlevinden farklıdır. Çünkü delay () CPU yürütmesini durdurur. Bu arada, vTaskDelayUntil belirli bir görevi geciktirir ve CPU diğer iş parçacıklarını yürütmeye devam eder.

Bağlantıdaki iki işlev hakkında daha fazla bilgi edinebilirsiniz .

Arduino RTOS Başlangıç ​​Örneği

Artık Arduino IDE’yi başarıyla kurdunuz ve RTOS kütüphanesini kurdunuz. Arduino’daki ilk programla ilerleyelim.

Görev değiştirme Örnek

Bu örnek kodda, xTaskCreate kullanarak farklı önceliklere sahip dört farklı görev oluşturacağız. 3 LED üç görevi ve bir LED boşta durumunu gösterir. Üç görev sırasıyla Görev1, Görev2 ve Görev3 şeklindedir.

FreeRTOS ve Arduino Uno ile LED yanıp sönüyor

Bu kod, üç LED’i üç farklı görevle kontrol ettiğimiz basit bir örneği gösterir. Her görev belirli bir süre sonra yürütülür. FreeRTOS kütüphane dosyasını dahil etmemiz dışında, bu program tipik Arduino koduna benzer.

Arduino Rtos Sketch

FreeRTOS hem önleyici çizelgeleme hem de işbirliği çizelgelemesini takip eder. Ancak, varsayılan olarak, bu API önleyici zaman dilimleme zamanlamasını uygular. Bu, yüksek öncelikli görevlerin düşük öncelikli görevlerden önce çıkması ve eşit öncelikli görevlerin CPU kaynaklarını almak için zaman paylaşımlı ilke kullandıkları anlamına gelir. Bu kod, farklı önceliklere sahip dört görev oluşturur. Ancak her üç görev de periyodiktir. VTaskDelay () işlevi nedeniyle, her görev belirli bir süre için engelleme durumuna geçer.  

#include <Arduino_FreeRTOS.h>
void setup()
//Serial Monitor  9600 baud rate ile tanimliyoruz
{
Serial.begin(9600);
Serial.println(F("Kurumlum"));
//digital pin 8 ve 11 Dijital cikis olarak ayarliyoruz
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);

//Uc adet task yaratiyoruz Task1, Task2 and Task3 ve oncelik siralamasini 1, 2 ve 3 ayarliyoruz. 
//idle task atamasi yapiyoruz bu en oncelikli task olacak bostaki durumu ayarlamak icin gereklidir.

 xTaskCreate(MyTask1, "Task1", 100, NULL, 1, NULL);
 xTaskCreate(MyTask2, "Task2", 100, NULL, 2, NULL);
 xTaskCreate(MyTask3, "Task3", 100, NULL, 3, NULL);
 xTaskCreate(MyIdleTask, "IdleTask", 100, NULL, 0, NULL);}

void loop()

{

}



static void MyTask1(void* pvParameters)
{
 
  while(1)

  { 
    digitalWrite(8,HIGH);

    digitalWrite(9,LOW); 

    digitalWrite(10,LOW);

    digitalWrite(11,LOW); 

    Serial.println(F("Task1"));

    vTaskDelay(100/portTICK_PERIOD_MS);
  }
}

static void MyTask2(void* pvParameters)

{  
while(1)

  { digitalWrite(8,LOW);
    digitalWrite(9,HIGH); 
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);   
    Serial.println(F("Task2"));
    vTaskDelay(110/portTICK_PERIOD_MS);
  }
}

static void MyTask3(void* pvParameters)
{ 
while(1)
  { 
   digitalWrite(8,LOW);
   digitalWrite(9,LOW); 
   digitalWrite(10,HIGH);
   digitalWrite(11,LOW);
   Serial.println(F("Task3"));
   vTaskDelay(120/portTICK_PERIOD_MS);
  }
}
static void MyIdleTask(void* pvParameters)

{
  while(1)
   { 
    digitalWrite(8,LOW);
    digitalWrite(9,LOW); 
    digitalWrite(10,LOW);
    digitalWrite(11,HIGH);
    Serial.println(F("Idle state"));
    delay(50);
  }  
}

Her görevin kendine özgü önceliği ve farklı çalışma süresi vardır.

Kod Nasıl Çalışır?

Bu örnekte, task3 en yüksek önceliğe ve task_idle en düşük önceliğe sahiptir. Bu nedenle, seri monitörünüzde Arduino kartını ilk kez açtığımızda görev3’ün ilk olarak yürütüleceğini göreceksiniz. Aksine, en düşük öncelikli görev olan görev_kimliği, sonunda veya çalıştırılacak başka bir görev olmadığında yürütülür. Demo için bu videoyu kontrol edin:

Seri Monitör Çıkışı

Seri monitörün çıkışından görebileceğiniz gibi, en düşük öncelikli görev (Boş görev) yalnızca işlemci serbest olduğunda ve yürütülecek başka bir görev olmadığında yürütülür.

  • T1: Görev3, önce üç olan en yüksek öncelikli görev olarak yürütülmeye başlar. Bundan sonra, 120ms için engelleme durumuna girer.
  • T2: Bundan sonra Görev2 yürütülmeye başlar çünkü Görev3 engelleme durumunda olduğu için şimdi en yüksek önceliğe sahiptir. Benzer şekilde, yürütmesini de tamamlar ve engellenmiş bir duruma geçer ve 110ms boyunca orada kalır.
  • T3: Şu anda hem Görev3 hem de Görev2 engellenen sürenin bitmesini bekliyor. Bu nedenle, Görev1, önceliği boş görevden daha yüksek olduğu için yürütülmeye başlar. Bu nedenle, aynı zamanda çalışma durumuna girer ve yürütülmesini tamamlar ve 120ms için engelleme moduna geçer.
  • T4: Şimdi, tüm yüksek öncelikli görev yürütmelerini tamamladı ve engelleme sürelerinin sona ermesini bekleyen engellenmiş durumdalar. Bu nedenle, işlemci yüksek öncelikli bir görev engelleme durumundan çıkıncaya kadar idle_task komutunu çalıştırmaya devam eder.
  • Ayrıca, en kısa engelleme süresi 100ms olan görev1 için kullanılır. Bu nedenle, diğer yüksek öncelikli görevlerden önce ve benzer şekilde görev2 ve görev3 için çalışma durumuna girecektir.

Bundan sonra tüm evreler önceliklerine ve engelleme sürelerine göre çalışmaya devam eder.

Serial Monitor Çıktısı
Serial Monitor Çıktısı

Arduino Rtos Çalışma Videosu

Arduino Rtos Kullanım Videosu

Hakkında Onur NP

Arduino Stm32 gibi Mikrodenetleyici PLC Otomasyon sistemleri ve Genel elektronik projeleri üzerine örnek paylaşımlar yapmaktayım Endüstriyel ve Kişisel proejelerinize Ücretli olarak destek verebilirim.

Kontrol edin.

2020 Transistör nedir?

Transistor nedir ? Transistör nedir Ne Değildir ? Yazımıza başlamadan transistör ne demektir bir tanımını …

One comment

  1. Ich kann gute Informationen aus diesem Artikel finden. Gerianna Lamont Massarelli

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir