Gömülü Sistemler için RTOS


57

Bana zaman yönetimi ve kaynak yönetimi için RTOS kullanmam gerektiğini söyleyen birçok makale gördüm. Zamanım kendi araştırmalarıma izin vermedi, bu yüzden tavsiye almak için chiphacker'a geldim.

Düşük kaynak mikrodenetleyicileri (MSP430, PIC) kullanıyorum ve kullanabileceğim RTOS'ları arıyordum.

Diyeceğim şey şu ki:

  1. Sistemin kaynak maliyeti
  2. Sistemin avantajları
  3. Sistemin dezavantajları
  4. Uygulama Püf Noktaları
  5. RTOS'un içinde kullanılması / kullanılmaması gereken durumlar.

Arduino gibi sistemler kullanmıyorum, çalıştığım projeler böyle bir sistemin maliyetini desteklemiyor.


2
Bunun ne için aşağı oy aldığı konusunda kafam karıştı. Seçmen bana geri bildirim verebilirse, gelecekte böyle bir eylemden kaçınmaya çalışacağım.
Kortuk

1
Aynen. Bu harika bir soru ....
Jason S

Bir soruyu kabul ettim çünkü bunun açık uçlu olduğunu düşündüğümde bile, çok büyük tepkiler aldım ve çaba için en az bir yazarı ödüllendirmek istedim.
Kortuk

Yanıtlar:


29

RTOS'lar ile QNX dışında çok fazla kişisel deneyimim olmadı (ki bu harika. Ama ucuz değil ve belirli bir yönetim kurulu satıcısıyla ve QNX'in diğer sistemler için umursadığı tutumu ile ilgili çok kötü bir deneyim yaşadım. PIC'ler ve MSP430'lar için çok büyük olanlarından daha yaygın olanlarından).

Bir RTOS'dan yararlanacağınız yerler, örneğin

  • iş parçacığı yönetimi / zamanlaması
  • dişler arası iletişim + senkronizasyon
  • Stdin / stdout / stderr veya seri port veya ethernet desteği veya bir dosya sistemi bulunan sistemlerde I / O (seri portlar hariç çoğunlukla MSP430 veya PIC hariç)

Bir PIC veya MSP430'un çevre birimleri için: seri portlar için bir halka tamponu kullanırım + keserim ... sistem başına bir kere yazdığım bir şeyi kullanır ve yeniden kullanır; diğer çevre birimleri Bir RTOS’tan çok fazla destek bulacağınızı sanmıyorum, çünkü satıcıya özel.

Mikrosaniye kadar sağlam olan bir zamanlamaya ihtiyacınız varsa, bir RTOS muhtemelen yardımcı olmaz - RTOS'lar zamanlamayı sınırladı, ancak genellikle bağlam geçişi gecikmeleri nedeniyle programlarında zamanlama titremesi var ... PXA270 üzerinde çalışan QNX vardı 100-200us maksimum, tipik mikrosaniye onlarca jitter, bu yüzden yaklaşık 100Hz'den daha hızlı çalışması gereken ya da yaklaşık 500us'tan daha doğru zamanlaması gereken şeyler için kullanmazdım. Bu tür şeyler için muhtemelen kendi ara işlemlerinizi yapmanız gerekecektir. Bazı RTOS'lar bununla iyi oynayacak ve diğerleri onu kraliyet acısı yapacak: zamanlamanız ve zamanlamanız bir arada bulunamayabilir.

Zamanlama / zamanlama çok karmaşık değilse, iyi tasarlanmış bir durum makinesi kullanarak daha iyi olabilirsiniz. Henüz yapmadıysanız, C / C ++ ile Pratik Statik Raporları okumanı şiddetle tavsiye ederim . Bu yaklaşımı çalıştığım bazı projelerimizde kullandık ve karmaşıklığı yönetmek için geleneksel devlet makinelerine kıyasla bazı gerçek avantajlar sağladı .... ki bu gerçekten bir RTOS'a ihtiyacınız olan tek şey.


En deneyimli gömülü sistemler çalışanlarının kolej dışında olduğu bir şirkette çalışıyorum (yani, Ben ve yaklaşık 2 yıldır benimle birlikte çalışan diğer adam). Çalışma haftası boyunca kendime endüstri uygulamaları hakkında çok fazla zaman harcıyorum. Okuduğum için herkes için bilgilendirildim ama en düşük maliyetli sistemimiz bir RTOS büyük bir gelişme olacaktır.
Kortuk

PIC'ler ve MSP430 gibi şeyler için çok karmaşık bir sistemden deterministik bir sistem oluşturulmasına yardımcı olabilecek, aynı zamanda modülleri birbirinden ayırma yönetimimizi büyük ölçüde temizleyen çok düşük kaynak RTOS sistemi var gibi görünmektedir. Alanında veri toplama ve yönlendirme sistemini etkin bir şekilde oluşturan iki kişilik bir ekibin parçası oldum. Şimdi RTOS'a baktığımda, tasarladığımız şey için mükemmel olduğunu görüyorum.
Kortuk

Üç posta yuvası kullandığım için üzgünüm, cevabınız çok yardımcı oldu, çok düşük bir kaynak çözümü arıyorum, ancak bu bilginin olması değerli, yardımlarınız için teşekkür ederim.
Kortuk

yorum sayısı hakkında endişelenmeyin (IMHO StackExchange çerçevesinin eksik olduğu bir şey tartışmaları desteklemesidir ... Q / A formatı çoğu şeyi kapsar, ancak bazılarını değil) ... arıyorsun. Steve'in bahsettiği FreeRTOS'a bakmadım, ancak düşük seviye mikrodenetleyicilere aktarılmışsa, belki de ihtiyacınız olan zamanlama yönetimini yapacaktır.
Jason S

Yığın (50 itme / çekme ifadesi gibi) ve zamanlanmış kesintileri kaldırabilse de her ipliğin durumunu kurtarıyor gibi görünüyor. Sistemim normalde iş parçacığı değiştirme için bir bağlantı noktası kesme kullanır, ancak görev yapılabilir görünüyor. Bu site türünün tartışmayı daha iyi bir biçimde ele almasını diliyorum.
Kortuk

26

FreeRTOS'u denediniz mi? Bu var ücretsiz (T & C tabi) ve MSP430 ve PIC çeşitli tatlar hem taşınır.

Bazıları ile karşılaştırıldığında küçüktür, ancak bu özellikle daha önce bir RTOS kullanmadıysanız öğrenmeyi kolaylaştırır.

Bir (ücretsiz) ticari lisans ve ayrıca bir IEC 61508 / SIL 3 versiyonu mevcuttur.


Bir ton teşekkür ederim, hafta içinde inceleyeceğim, soruyu diğer cevaplar için açık bırakacağım, ancak çok yardımcı oluyorsunuz!
Kortuk

12

8052 (8-bit) sistemde bile çalışabilen NuttX RTOS'u yeni öğrendim . Çok fazla limanı yok ama ilginç görünüyor. POSIX bir artı olabilir, çünkü daha güçlü bir işlemciye geçtiğinizde kodunuzu biraz daha taşınabilir hale getirebilir ve gerçek zamanlı linux veya QNX çalıştırmak istiyorsanız.

Ticari RTOS'ların kendisiyle ilgili hiçbir deneyimim yok, ancak yıllardır ev yapımı olanları kullandım! Kod geliştirmenizi birçok programcı arasında bölmenize yardım etmekte harikadırlar, çünkü esas olarak her biri kendi alanlarında çalışmak için bir "görev" veya "iş parçacığı" alabilirler. Yine de koordine etmek zorundasınız ve her görevin son tarihini verebilmesini sağlamak için birisinin tüm projeyi denetlemesi gerekiyor.

Ayrıca bir RTOS kullanırken Rate Monotonic Analysis veya RMA'yı araştırmanızı tavsiye ederim . Bu, kritik görevlerinizin son tarihlerini yerine getireceğini garanti etmenize yardımcı olur.

Ayrıca, Miro Samek'in bir RTOS ile veya onsuz çalışabilen ve yine de size gerçek zamanlı yetenek sağlayan, QP-nano olay odaklı programlama çerçevesine bakacağım . Bununla beraber, tasarımınızı geleneksel görevler yerine hiyerarşik devlet makinelerine böldünüz. Jason S, Miro'nun görevindeki kitabından bahsetti. Mükemmel bir okuma!


9

Birkaç makinede faydalı bulduğum tek şey basit bir yığın değiştirici. Aslında PIC için bir tane yazmadım, ancak her iki / tüm iş parçacığı toplam 31 ya da daha az yığın seviyesi kullanıyorsa, yaklaşımın PIC18 üzerinde iyi çalışacağını umuyorum. 8051'de, ana rutin:

_taskswitch:
  xch a, SP
  xch a, _altSP
  xch a, SP
  çürümek

PIC'de yığın göstergesinin adını unuttum, ancak rutin şöyle bir şey olurdu:

_taskswitch:
  movlb _altSP >> 8
  movf _altSP, w, b
  movff _STKPTR, altSP 
  movwf _STKPTR, c
  dönüş

Programınızın başlangıcında, altSP'yi alternatif yığının adresiyle yükleyen bir görev2 () yordamını çağırın (16 muhtemelen bir PIC18Fxx için iyi sonuç verir) ve task2 döngüsünü çalıştırır; Bu rutin asla geri dönmemelidir, aksi halde işler acı verici bir ölümle ölür. Bunun yerine, birincil görevin kontrolünü vermek istediğinde _taskswitch'i çağırmalıdır; Birincil görev daha sonra ikincil göreve ulaşmak istediğinde _taskswitch'i çağırmalıdır. Genellikle, biri gibi sevimli küçük rutinleri olacak:

void delay_t1 (işaretsiz kısa val)
{
  yap
    taskswitch ();
  while ((imzasız kısa) (millisecond_clock - val)> 0xFF00);  
}

Görev değiştiricinin herhangi bir 'koşulu bekle' yapmanın bir yolu olmadığını unutmayın; Tüm desteklediği bir ıspanak. Öte yandan, görev anahtarı o kadar hızlıdır ki, diğer görev bir zamanlayıcının sona ermesini beklerken bir görev anahtarı () denemek diğer göreve geçer, zamanlayıcıyı kontrol eder ve tipik bir görev değiştiriciden daha hızlı geri döner Görevlerin yerine getirilmesine gerek olmadığını belirlerdi.

Kooperatif çoklu görevinin bazı sınırlamaları olduğunu unutmayın, ancak geçici olarak rahatsız edilen değişmezlerin hızlı bir şekilde yeniden kurulabildiği durumlarda çok sayıda kilitleme ve diğer muteks ile ilgili kod gereksinimlerini önler.

(Düzenleme): Otomatik değişkenlerle ilgili birkaç uyarı;

  1. Görev değiştirme kullanan bir rutin her iki diziden de çağrılıyorsa, genellikle rutinin iki kopyasını derlemek gerekir (büyük olasılıkla #define ifadeleriyle aynı kaynak dosyasını iki kez ekleyerek). Herhangi bir kaynak dosya yalnızca bir iş parçacığı için kod veya başka iki kez derlenecek kod içerecektir - her iş parçacığı için bir kez - böylece "#define delay (x) delay_t1 (x)" gibi makrolar kullanabilirim veya #define delay (x) delay_tx (x) "kullandığım konuya bağlı.
  2. Çağrılan bir işlevi "göremeyen" PIC derleyicilerinin, böyle bir işlevin tüm CPU kayıtlarına zarar verebileceğini varsaydığı ve böylece görev değiştirme yordamındaki herhangi bir kaydı kaydetme ihtiyacını ortadan kaldıracağına inanıyorum. önleyici çoklu görev]. Başka bir CPU için benzer bir görev değiştiriciyi düşünen herkes, kullanımdaki kayıt kurallarından haberdar olmalıdır. Bir görev değiştirmeden önce kayıtları itmek ve sonra bunları açmak, yeterli yığın alanı bulunduğunu varsayarak, işleri halletmenin kolay bir yoludur.

İşbirlikçi çoklu görev, bir kişinin kilitleme ve benzeri konulardan tamamen kaçmasına izin vermez, ama gerçekten işleri kolaylaştırır. Sıkıştırılmış bir çöp toplayıcılı önleyici bir RTOS'ta, örneğin, nesnelerin sabitlenmesine izin vermek gerekir. Bir işbirlikçi anahtarlayıcı kullanırken, bu, GC nesnelerinin görevler () çağrıldığında herhangi bir zamanda hareket edebileceğini varsayması şartıyla gerekli değildir. İğnelenmiş nesneler için endişelenmek zorunda kalmayan bir sıkıştırma toplayıcı, olduğundan daha basit olabilir.


1
Müthiş cevap. Kendi RTOS'uma yaklaşırken kaynaklarla ilgili bazı bağlantılar bulmanın ilginç olacağını düşünüyorum. Buradaki odak noktam, gerçek zamanın zorluğunu sağlama işini yapan bir satıcıdan yüksek kaliteli bir RTOS almaktı, ancak bu benim için eğlenceli bir hobi projesi olabilir.
Kortuk

1
Serin, hiçbir zaman sadece SP'yi değiştirmek gibi işler düşünülmüyor ...
NickHalden

1
@JGord: 8x51 ve bir TI DSP'de küçük görev değiştiriciler yaptım. Yukarıda gösterilen 8051, tam olarak iki görev için tasarlanmıştır. DSP olanı dört ile birlikte kullanılır ve biraz daha karmaşıktır. Yine de çılgınca bir fikrim vardı: bir kişi dört görevi sadece üç görev makinesi kullanarak yapabilirdi. İlk iki görevden biri görev değişikliği yapmak istediğinde, TaskSwitch1 ve TaskSwitch2'yi çağırmalıdır. İkinci iki görevden biri görev yapmak istediğinde, Taskswitch1 ve Taskswitch3'ü çağırmalıdır. Kodun stack0'ta başladığını ve her görev değiştiricinin karşılık gelen yığın numarasıyla ayarlandığını varsayın.
supercat

@JGord: Hmm ... pek işe yaramadı; 3 yollu bir yuvarlak robin veriyor gibi görünüyor ve üçüncü değiştiriciyi görmezden geliyor. Şey, deney ve bence muhtemelen iyi bir formül bulursun.
Supercat

7

Ben kullandım Salvo MSP430 üzerinde. Bu, işlemci kaynaklarına çok açıktı ve uygulama kurallarına uymanızı sağlaması, kullanımı çok kolay ve güvenilir. Bu bir kooperatif işletim sistemidir ve görev anahtarlarının görev işlevlerinin dış işlev çağrısı düzeyinde yapılmasını gerektirir. Bu kısıtlama, işletim sisteminin, çok az miktarda yığın alanı kullanmadan, görev bağlamlarını koruyarak çok küçük bellek aygıtlarında çalışmasını sağlar.

AVR32'de FreeRTOS kullanıyorum. Yine şimdiye kadar çok güvenilir ancak FreeRTOS'un yayınladığı sürüm ile Atmel çerçevesiyle birlikte verilen sürüm arasında bazı yapılandırma / sürüm farklılıkları yaşadım. Ancak bu, ücretsiz olması avantajına sahiptir!


5

Hergün Uygulamalı Elektronik'in Aralık sayısında PIC'ler için Gerçek Zamanlı İşletim Sistemleri (PIC n 'Mix Sütununda) serisinin 3. bölümünde yer alan ve FreeRTOS'u MPLAB ve PICKit ile kurma detaylarına sahiptir. görmedim) çeşitli RTOS'ların haklarını tartıştılar ve FreeRTOS’a yerleştiler. Mevcut makale geliştirme ortamını kurduktan sonra, ikili bir dijital saat tasarlamaya başlıyorlar. Bu konuyla ilgili en az bir bölüm daha var gibi görünüyor.

EPE'nin ABD'de ne kadar müsait olduğundan emin değilim, ancak sitelerinden bağlantılı bir ABD Mağazası var ve elektronik kopyalar mevcut olabilir.


4

PIC için CCS derleyicisi basit bir RTOS ile birlikte gelir. Denemedim, ama eğer bu derleyiciye sahipseniz, denemesi kolay olacaktır.


1
Aslında bunu ilk olarak denedim. Kelimenin gerçek anlamındaki bir RTOS değildir. Hiçbir şekilde önleyici değildir. Verimlilik komutlarının düzenli bir şekilde kullanılmasını gerektirir, böylece RTOS sıradaki kimin çalışacağına karar verebilir, başka bir programın üstlenilmesi gerektiğinde kasıtlı olarak sürekli olarak koymanız gerekir.
Kortuk

2
Bence hala bir RTOS olarak adlandırılıyor. Tamamen önleyici bir zamanlayıcı yerine kooperatif bir zamanlayıcıya sahip gibi görünüyor.
Jay Atkinson,

Evet, teknik olarak hala bir RTOS, ancak bunun için çok az değere sahiptim ve hala çok az değerim var. Bunun kişisel bir şey olduğunu biliyorum, ama benim için değerli olmak için önemsiz olması gerekiyor. Ben hala +1 olarak iyi bir cevap ve değer olarak.
Kortuk

3

Teşekkürler! Görünüşe göre çoğu insan soruyu anlamadı, ama yine de ilginç.
Kortuk

SO'yu, kullanıcıyı yardım için E&R'ye gelmeye davet eden SO'ya soru gönderdim!
Kortuk

Bence SO sorusunu "aldık", farklı bir şey soruyordu ama bu soruyla ilgili. Belgelendirme hakkında oradaki yorumunuz için; bu pek çok şeye bağlı. Buradaki cevaplara bakarak DoxaLogos'un QP-nano'ya verdiği cevabı seviyorum; Tecrübelerim, olay odaklı kodları tercih etmemi ve konuların içerik bağlamında örtülmesini gerektiriyor.
janm

2

Başvurunuz hakkında fazla bir şey söylemediniz. Bir RTOS kullanıp kullanmamanız PIC'de yapmanız gerekenlere çok bağlıdır. Sıkı zaman sınırı gerektiren veya birkaç iş parçacığı olan birkaç farklı eşzamansız işlem yapmadığınız sürece, bir RTOS fazla sorumlu olabilir.

En önemli olana bağlı olarak zamanı bir mikrodenetleyicide düzenlemenin birçok yolu vardır:

  1. Sabit kare hızı: Örneğin 1000Hz'de çalışması gereken bir servo kontrolörü çalıştıran bir PIC için. PID algoritmasının çalıştırılması 1ms'den daha az sürerse, milisaniyenin geri kalanını, CAN veri yolunu kontrol etmek, sensörleri okumak, vb. Gibi diğer görevleri yapmak için kullanabilirsiniz.

  2. Tüm kesintiler: PIC'de gerçekleşen her şey bir kesinti tarafından tetiklenir. Kesinti olayın önemine göre önceliklendirilebilir.

  3. Bir döngüye sokun ve her şeyi mümkün olduğunca hızlı yapın. Bunun uygun zaman sınırları sağladığını görebilirsiniz.


Diğer yöntemleri anlıyorum, ancak bir RTOS'a genişletmek istiyorum. Birden fazla görev yürüteceğim ve zor gerçek zamanlı bir sisteme sahip olacağım, ancak zor gerçek zamanlı gereklilikler olmadan başlamak istiyorum. Cevaplamak için zaman ayırdığınız için teşekkür ederim, ancak bir RTOS öğrenmek istiyorum, böylece bunu çok talepkar bir durumda kullanabiliyorum.
Kortuk
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.