Yalnızca programım için 1 işlemci çekirdeği alabilir miyim?


12

GPIO pinlerinde yüksek -> düşük ve düşük -> yüksek sinyal kenarı arasındaki zaman farkını zamanlamalıyım. Bunu yapan basit bir program yazdım. Bir süre çalıştırdıktan sonra sonuçtan oldukça memnun kaldım (0,01 s varyasyon). Ancak zaman zaman 0,5 s'lik bir hata vardı. Bunun o sırada çalışan başka bir sistem sürecinden kaynaklanabileceğini düşünüyordum. Benim sorum şu:

Bir işlemci çekirdeğini yalnızca programım için ayırabilir ve diğer 3 çekirdeğin sisteme girmesine izin verebilir miyim?

Raspbian Jessie Lite kullanıyorum, bu yüzden 3 çekirdeğin çalıştırmak için yeterli olacağını düşünüyorum.


4
GPIO pininin durumu için bir döngüde oyladığınızı varsayıyorum. Bu, işletim sisteminin programınızı yürütmeye nasıl karar verdiğine son derece duyarlıdır, bu da zamanının çoğunu gerçekten yararlı bir şey yapmazken CPU'yu meşgul tutmak için harcayacaktır. Programınızın GPIO pinlerindeki sinyal kenarları arasında uyumasına izin vermek için kullanabileceğiniz belirli bir GPIO pininde bir kesme ayarlamak için bir yol aramak isteyebilirsiniz.
Florian Castellane

4
Projenizin ne olduğundan emin değilsiniz, ancak bir Mikrodenetleyici, özellikle daha gerçek zamanlı bir sisteme daha fazla ihtiyaç duyduğunuzda daha uygun olur. Arduino birçok seçenek sunar ve programınızı C / C ++ 'da yazabilirsiniz.
SnakeDoc

@Florian RPi.GPIO'da kesmeye benzer bir işlev vardır. Kenar algılanana kadar programı engelleyecektir (kaynak: sourceforge.net/p/raspberry-gpio-python/wiki/Inputs ).
NonStandardModel

@SnakeDoc Mikro denetleyicinin daha iyi olduğunu biliyorum. Bundan kaçınmayı umuyordum, çünkü mikrosaniye hassasiyetine ihtiyacım yok. Saniyenin 1 / 100'ü fazlasıyla yeterli. Ayrıca ben sadece zaman farkı gerekir, bu yüzden başlangıç ​​ve bitiş için aynı olacağını umuyordum bir gecikme varsa. Bu işe yaramazsa, verileri saklamak için RPi'ye bağlı mikroişlemci ile gitmek zorundayım.
NonStandardModel

1
Veya PI üzerinde çalışan bir Gerçek Zamanlı İşletim Sistemi edinin. Kurulumunuzdaki sorun, işletim sisteminin "en iyi çaba" ya bağlı olmasıdır. Aynı anda başka neler olup bittiğine bağlı olarak, programınız GPIO'lara ayrıcalıklı erişim ister, işletim sisteminin o anda gerçekleştirdiği diğer görevlerin arkasında sıraya girebilir. Kullanıcı alanı programınız sistem görevlerinden daha düşük bir önceliğe sahip olacaktır. Önleme de var, yani programınızın çalışma süresi boyunca başka bir işlemin yürütülmesi için işletim sistemi tarafından "duraklatılabilir ve" bir kenara bırakılabilir "anlamına gelir, yani zamanlama gözlemleriniz çarpık olabilir.
SnakeDoc

Yanıtlar:


13

Bir çekirdeği ayırmak muhtemelen aşırıdır.

Pigpio kütüphanemi denemenizi öneririm . Varsayılan olarak GPIO seviyesinin 10µs içinde değişmesini sağlayacaktır.

Hızlı bir test olarak , herhangi bir GPIO seviyesi geçişini ve bu GPIO'daki son geçişten bu yana geçen mikrosaniye cinsinden zamanı yazdıracak bu Python örneğine bakmanızı öneririm .

pigpio varsayılan olarak Jessie Lite'a yüklenmez. Bağlı siteden en son sürümü ya da depolara eski sürümü yükleyin.

sudo apt-get install pigpio python-pigpio python3-pigpio

pigpio - Library for Raspberry Pi GPIO control
python-pigpio - Python module which talks to the pigpio daemon (Python 2)
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)

Pigpio kütüphanenizi deneyeceğim. Şu anda başka bir projeyi bitirmek zorundayım, ama buna geri döneceğim. Birkaç hafta içinde rapor vereceğim. Teşekkür ederim!
NonStandardModel

4

Bu Cyberciti makalesindeschedutils açıklandığı şekilde programınızı bir çekirdeğe kilitleyebilirsiniz :

sudo apt-get install schedutils
sudo taskset -c 3 -p 13545  # Lock PID 13545 to core 3

Yine de diğer süreçler aynı çekirdek üzerinde programlanabilir. Bu nedenle yapılacak ikinci şey, nice komutunu kullanarak komutunuzun en yüksek önceliğe sahip olduğundan emin olmaktır (bu, Linux çekirdeğine gerekirse diğer işlemlerin önceden uygulanması gerektiğini söyler ). Programınızı şu şekilde başlatın:

nice -n -20 your-program

Zamanlama sorunlarınızın başka olası nedenleri de vardır. Bunlar hakkında bir şey yapmak o kadar kolay değil:

  • Python'da programlama yapıyorsanız, bazen kullanılmayan belleği boşaltmak için programınızı duraklatan bir çöp toplayıcı vardır.
  • Kesmeler, CPU'nun istediğinizden başka bir şey yapmasını sağlar. Örneğin, ağ paketleri veya diğer giriş / çıkışlar.
  • Programınız çok uyuyorsa CPU önbelleklerini dolduran başka işlemler de olabilir (L1 / L2 önbellek). Bu sizi RAM erişimini beklemeye zorlar.
    • RAM'in dolu olması durumunda daha da kötüsü, SD kartlar sloooow olduğu için işleminizin diske değiştirilmesini sağlar.

İşleminizi gerçek zamanlı yapmanın yolları vardır , bu da belirli zamanlama garantileriyle çalışacağı anlamına gelir. Bununla ilgili sorun, her şeyin daha yavaş olabileceği ve karmaşık bir konudur. Bu tavşan deliğinden aşağı inmek istiyorsanız , Linux'ta gerçek zamanlı süreçleri okumaya başlamanızı öneririm .


2
Güzel olmaktan ziyade, gerçek zamanlı olmayan süreçlerin tercih edilmesini sağlayacak sürece gerçek zamanlı önceliğe sahip olmak daha iyi olacaktır.
joan

Güzel bir nokta, bunun hakkında bir not ekleyeceğim.
Emil Vikström

1
"gc.disable ()" çöp toplayıcısını devre dışı bırakırsanız ne olur?
Keine

@Keine Bellek sızıntısı alabilirsiniz. B'yi gösteren bir değişkene sahip bir A nesneniz olduğunu varsayalım. Python bu referansı bir sayı olarak izleyecektir, B'nin kendisine doğru 1 nesnesi olduğunu bilir. Artık ihtiyacınız olmadığında A'yı kaldırın. B için referans sayısı azalacaktır ve 0'a ulaşması durumunda Python da B'yi serbest bırakabilir. Buna referans sayımı denir. Ama şimdi o B, bir referans olduğunu varsayalım arkasını Artık birbirlerine dönük nesnelerin bir küme A'ya. Hiçbiri 0'a çarpmayacak ve serbest bırakılamayacak. GC bu tür kümeleri bulabilir ve ana program kümeye "işaret etmediğinde" bunları kaldırabilir.
Emil Vikström

1
Yaptığım önerileri projeme ekleyeceğim. Ama çok karmaşık konulardan kaçınmayı umuyorum. Bu durumda, bir mikroişlemci kesme algılaması yapmak ve sadece veri kaydetmek için RPi'ye bağlamak daha iyidir. Teşekkür ederim!
NonStandardModel

2

Zamanlama gereksinimleriniz olduğundan Raspberry Pi artık bunun için uygun bir platform değildir. Gerçek zamanlı bir platform değildir ve zamanlama birçok farklı parazit kaynağı tarafından atılabilir.

Bunun yerine, bu zamanı ölçmek için bir mikrodenetleyici kullanmalı, tercihen kesmeleri kullanmalı ve bilgileri daha sonra Pi'ye iletmelisiniz.


1
Bir Raspberry Pi üzerindeki GPIO pinlerinde kesinti yapmak mümkün değil mi?
Florian Castellane

Elbette bu, linux makinesini MCU'dan daha uygun hale getiren tasarım gereksinimlerinin başka bir parçası olup olmadığına bağlıdır. RPi, 10 MHz'de saatli bir MCU gibi bu görevi iyi bir şekilde yerine getirebilir.
Sean Houlihane

1

İhtiyacınıza göre tek çekirdekli işlemci kullanmanız gerektiğini düşünmüyorum. İhtiyacınız olan şey, programınızın her zaman çalıştığından emin olmaktır. Bunu başarmak için, programınızın önceliğini çok yüksek olarak ayarlayabilirsiniz, böylece başka bir işlemden rahatsız olmaz.

İşletim sistemini (Genel Amaçlı İşletim Sistemi) bildiğim kadarıyla, kullandığımız gerçek zamanlı sistemlerde kullanılmak üzere tasarlanmamıştır, bu nedenle sürecinizi gerçek zamanlı olarak çalıştırmak istiyorsanız, başka hiçbir işlem rahatsız etmiyorsa, gitmeniz gerekir. Gerçek Zamanlı İşletim Sistemi (RTOS) için. Belki de çekirdek seçim ile gelebilirler. :)


1
Dışarıda iyi ücretsiz RTOS var mı?
Keine

RTLinux ve Vxworks RTOS'a örnektir ve onlar da iyidir. Ancak yüklemeden önce işletim sistemi (oluşturulması için odak noktası neydi) üzerinde çalışmanız gerekir, böylece ihtiyaçlarınızı karşılayabilir.
Vishwajeet Vishu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.