Raspberry Pi Pico Çift Çekirdek Programlama (Dual Core)
Raspberry Pi Pico’da çift çekirdek programlama ile çoklu iş parçacığı oluşturarak iki LED’i kontrol edeceğiz. Şimdiye kadar bir OLED, bir LCD, bir Servo, bir Ultrasonik Sensörün nasıl arayüzleneceğini gördük ve Raspberry Pi Pico ile I2C, ADC, Bluetooth iletişimini uyguladık. Pico kartının RP2040 mikrodenetleyicisi çift çekirdeğe sahiptir.
Çok iş parçacıklı yürütmeye aşina değilseniz, bilgisayar sisteminizi düşünün. Multithreading kullanan bir işletim sistemi tarafından çalıştırılabilen birden fazla programı aynı anda çalıştırabilir. Ancak Raspberry Pi Pico’da CPU döngülerini kontrol eden herhangi bir işletim sistemimiz yok, çekirdek başına yalnızca bir iş parçacığını destekleyebilir, bu durumda toplamda iki iş parçacığı oluşturabiliriz.
Gerekli Malzemeler
Pico kartında çift çekirdekli programlamayı göstermek için aşağıdaki bileşenlere sahip olduğunuzdan emin olmanız gerekir:
- Raspberry Pi Pico
- LED x2
- Direnç x2 (330 ohm)
- Devre kartı
- Bağlantı Kabloları
Bağlantı Şeması
GPIO15 ve GPIO16’ya sırasıyla iki 330ohm direnç kullanarak iki LED bağladık. LED’lerin GND pinleri Pico kartının GND pinlerine bağlanmıştır.
Çift Çekirdek Programlama
Öncelikle buradan ilgili GitHub deposunu klonlamanız gerekiyor. Ardından “T9_DualCore_Program_PIco” klasörünü açın. Bu klasörün içinde “Kodlar” klasörünü bulabilirsiniz. Thonny düzenleyicisinde “main.py” python dosyasını açın. Şimdi main.py dosyasına göz atalım:
from machine import Pin
import utime
import _thread
İlk olarak, Pin() sınıfını yukarıda belirtildiği gibi machine.py kitaplığından içe aktarmamız gerekir. Önceki eğitimlerimizde makine kitaplığını pek çok kez kullandık, umarız artık machine kitaplığına aşinasınızdır. Ardından, pico’nun dahili saatini kullanmak için “utime” kütüphanesini içe aktarmamız gerekir. Raspberry pi pico topluluğu tarafından yapılan dizi oluşturma işlevlerini kullanmak için “_thread” kütüphanesini kullanıyoruz.
led1 = Pin(16, machine.Pin.OUT)
led2 = Pin(15, machine.Pin.OUT)
sLock = _thread.allocate_lock()
Yukarıdaki kodda, “Pin(16, machine.Pin.OUT)” ve “Pin(15, machine.Pin.OUT)” fonksiyonlarını kullanarak GPIO15 ve GPIO16’lı iki LED’i ÇIKIŞ olarak başlattık. “_thread.allocate_lock()” işlevi, her iki iş parçacığına bir semafor kilidi sağlamak için kullanılabilir. Bu işlev hakkında ayrıntılı bilgi edinmek istiyorsanız “_thread” kitaplığının belgelerine başvurabilirsiniz.
def CoreTask():
while True:
sLock.acquire()
print("İkinci konuya girildi")
utime.sleep(1)
led2.high()
print("Led 2 acik")
utime.sleep(2)
led2.low()
print("Led 2 turned kapalı")
utime.sleep(1)
print("İkinci konudan cikildi")
utime.sleep(1)
sLock.release()
_thread.start_new_thread(CoreTask, ())
Diğer çekirdekteki “CoreTask()” fonksiyonunu tek bir thread ile kullanacağız. Fonksiyon içindeki while döngüsünde, iş parçacığını tamamlanana kadar tutmak için bir semafor kilidi devreye sokuyoruz. Daha sonra led2’yi 1 saniye yüksek tuttuk ve komutu Thonny’nin çıkış terminaline yazdırdık. Ardından, iş parçacığı tamamlandığında semafor kilidini serbest bırakıyoruz. “_thread.start_new_thread(CoreTask, ())” işlevi diziyi başlatır. Bu işlev, hedef işlev adını ilk parametre olarak alır. Bizim durumumuzda “CoreTask” ve ikinci parametrede argümanlar alıyor.
while True:
# Semafor kilidini alıyoruz
sLock.acquire()
print("Ana konuya girildi")
led1.toggle()
utime.sleep(0.15)
print("Led 1 acildi")
print("ana konudan cikiliyor")
utime.sleep(1)
# Semafor kilidini serbest bırakıyoruz
sLock.release()
Yukarıdaki while döngüsünde, ana iş parçacığının tamamlanana kadar çalışmaya devam etmesi için benzer şekilde başka bir semafor kilidi kullanıyoruz. Led1’i değiştirir ve ardından semafor kilidini serbest bırakır. Şimdi, Thonny IDE’de “main.py” dosyasını açın. Başlamak için klavyenizdeki “ctrl+shift+s” tuşlarına basarak “main.py” dosyasını Pico panosuna kaydedin. Dosyaları kaydetmeden önce Pico kartınızın bilgisayarınıza bağlı olduğundan emin olun. Kodu kaydettiğinizde, aşağıdaki resimde gösterildiği gibi bir açılır pencere görünecektir. Önce Raspberry Pi Pico’yu seçmeli, ardından dosyayı “main.py” olarak adlandırmalı ve kaydetmelisiniz. Bu prosedür, Pico açıkken programı çalıştırmanızı sağlar.
Kodu Pico kartına yükleyip çalıştırdığınızda GPIO16’ya bağlı led1’in 1,15 saniye gecikmeyle geçiş yaptığını göreceksiniz. Ancak GPIO15’e bağlı olan led2 2 saniye gecikme ile yanıp sönecektir.
Kodun Tamamı
import machine
import utime
import _thread
led1 = machine.Pin(16, machine.Pin.OUT)
led2 = machine.Pin(15, machine.Pin.OUT)
sLock = _thread.allocate_lock()
def CoreTask():
while True:
sLock.acquire()
print("İkinci konuya girildi")
utime.sleep(1)
led2.high()
print("Led 2 acik")
utime.sleep(2)
led2.low()
print("Led 2 turned kapalı")
utime.sleep(1)
print("İkinci konudan cikildi")
utime.sleep(1)
sLock.release()
_thread.start_new_thread(CoreTask, ())
while True:
# Semafor kilidini alıyoruz
sLock.acquire()
print("Ana konuya girildi")
led1.toggle()
utime.sleep(0.15)
print("Led 1 acildi")
print("ana konudan cikiliyor")
utime.sleep(1)
# Semafor kilidini serbest bırakıyoruz
sLock.release()
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.