Kaynak-konstutlu cihazlar için özel gömülü Os geliştirmek
Table of Contents
Kaynak-Konstrained Cihazların Meydanlaştırılmasını Anlayın
Modern gömülü sistemler, küçük bir ağ geçidinden geniş bir ekosisteme güç verir:0)IoT sensörleri) Çevre koşullarını takip eden çevresel koşulları takip eden sistemler) ve endüstriyel kontrolörler. Bu cihazlar, bu tür donanımlar için temel bir geçiş talep eder: Tipik bir mikrokontrolörlüğün üst üste doğrulanmış, RAM ve 128 KB flash depolama ile her zaman sabit tutmalı.
Bu makale, kaynak sınırlı donanımda gelişen özel bir gömülü OS inşa etmek için temel ilkeleri, mimarileri ve geliştirme stratejileri inceleyeceğiz. Tüm özellikli bir genel amaçlı OS olmadan temel tasarım kararlarını, ortak tuzakları ve pratik teknikleri inceleyeceğiz.
Donanımlar OS Design
Tek bir çekirdek işlevi yazmadan önce, donanım ortamını anlamanız gerekir. Kaynak-konstrained cihazlar genellikle aşağıdaki özellikleri gösterir:
- [FONT=0) Düşük Güç CPU çekirdeği:[Dönetici:[Dönetici: 0) Çoğu zaman ARM Cortex-M, RISC-V RV32IMC veya 8-bit AVR. No MMU for memory protection, and limited talimat pipelines.
- [FONT:0]Küçük hafıza havuzları:[Dönderler, megabaylar değil, megabaylar. Flash depolama da kod ve veriler arasında sınırlı ve paylaşılır.
- [FONT=0]Redük periferi set:[Dönetici:[Dönetici: 1 ) Bir avuç GPIO, UART, SPI, I2C ve belki USB OTG veya Ethernet MAC gibi temel ADC. Kompleksi kontrolleri nadir.
- [FONT:0)Kayıt güç kaynakları:[Dönetici:[Dönetici: 0) Birçok cihaz bataryaya güçlenir veya enerji hasatını kullanır. Uzun boş dönemler hakimdir, derin uyku modlarını gerektiren.
- [FONT:0) Standart saat kaynağı yoktur:[Dönetici:[Dönetici:0) İç RC osilatörler ortaktır; dış kristaller, zamanlama hassasiyetini etkileyebilir.
Bu kısıtlamalar doğrudan OS mimarisini etkiler. Örneğin, bir MMU olmadan, sanal hafızaya güvenemezsiniz. Her görev statik olarak bağlantılı olmalıdır veya bir kooperatif hafıza bölmesi programı kullanmak gerekir. Benzer şekilde, birden fazla kanalla bir donanım zamanılayıcının yokluğu tek bir sistem akışı kullanarak yazılım zamanlayıcıları uygulamak için.
Minimal bir gömülü OS için tasarım ilkeleri
Özel bir gömülü OS inşa etmek, her kararın sürücü düzenine rehberlik eden birkaç temel ilkeye uymak gerektirir.
Minimal Footprint
Sistem metni artı verileri, uygulama kodu için yedeklenecek oda ile cihazına sığmalıdır. Tipik minimalist bir çekirdek 2-10 KB flaş ve 1-4 KB RAM'i kaplar. Bu, hafıza maliyetini haklı çıkarmanız gerektiği anlamına gelir; bunun yerine statik havuzlar kullanın ve derle zaman veri yapıları kullanın.
Deterministic Real-Time Behaviour
Birçok gömülü uygulama garanti edilen yanıt süreleri gerektirir. Özel bir OS, sabit öncelikli veya en erken dönemli ilk zamanlama ile öngörülebilir bir ön ödeme programı uygulayabilir. Interrupt latency mikrosaniyelerde ölçülmelidir ve çekirdek uzun aralıklar için asla kesintiye uğramamalıdır.
Modülerite ve Ayrılık
OS'yi bağımsız modüller olarak tasarlayın: programcı, hafıza yöneticisi, cihaz sürücüleri ve olay çerçevesi. Her modülü minimum API'yi ortaya koyar ve ayak izi azaltmak için değiştirebilir veya ihmal edilebilir. Örneğin, cihaz tamamen depolama katmanından ayrılırsa.
Düşük Güç Tüketimi
OS, donanım güç yönetimi ile entegre edilmelidir. Görevin işe hazır olmadığı zaman, çekirdek mümkün olan en düşük uyku durumuna girer - ARM Cortex-M veya SLEEP AVR'de. Interrupts zamanlayıcılar veya dış olaylardan uyanır.
Anahtarlı Mimari Seçenekleri
Doğru çekirdek yapısını seçmek muhtemelen en önemli mimari karardır. Üç ortak desen gömülü dünyada görünür.
Monolithicelek
Tüm OS hizmetleri (scheduler, bellek, kesmeler, sürücüler) tek bir ayrıcalıklı bağlamda çalışır. Bu yaklaşım basit ve hızlı çünkü sistem aramaları için bir koşul yoktur. ancak, bir sürücüdeki bir hata tüm sistemi kazaya uğrayabilir.Kaynak için - Zephyr bazı kullanıcı-uzay özellikleri vardır.
Microkernelnel
Sadece en temel ilkeller (takım, kesme işlemi, işlenme iletişimi) çekirdek modunda çalışır. Sürücüler ve sistem sunucuları, bir MPU (Memory Koruma Birimi) aracılığıyla ayrı süreçler olarak çalışır, ancak mesaj geçişleri yüklenebilir.Çok küçük cihazlar (64 KB RAM’dan az), mikrokerler çok ağır olma eğilimindedirler.
Exokernel veya Kütüphane OS
Eski bir ekokernel, minimum donanım çokluxing sağlar ve uygulama geliştiriciye yapılan karmaşıklıkları uygulama alanına dönüştürür. Ancak, her bir üst düzey arayüze sahip olan ultra-konsasyon cihazları için aktif bir araştırma alanıdır.Bu yaklaşım, kaynak yönetimi üzerinde maksimum kontrol sağlar ve son derece düşük üst düzeye ulaşabilir.In practice, it is rare in business host systems because it changes complex to the application developer. but, it is an active research area for ultra-constrained devices where every byte matters.
Bir MMU olmadan bellek Yönetimi
Bir Memory Management Unit'in yokluğunda, çekirdek hafızayı doğrudan yönetmelidir. İki strateji hakimdir.
Statik Allocation
Tüm görevler ve veri yapıları derleme zamanında tahsis edilir. Bağlantı senaryosu, küresel değişkenler ve sabit adreslerde yer alan bölgeler.Bu yaklaşım hafızanın asla parçalanmadığını ve üst kullanım öngörülebilir olduğunu garanti eder. alt kısım, iş zamanında dinamik olarak ayarlayamazsınız.Tek bir amaçla cihazlar için (örneğin, bir sıcaklık sensörü her dakika verileri gönderir), statik dağıtım ideal.
Havuza Göre Dinamik Allocation
Cihazın değişken iş yüklerini (örneğin, 32, 64) ele alması gerekir (Dönderlik süresine göre)[Dönemli bellek havuzları kullanılır.[Döneticileri)[Bloglar, istekte bulunan en küçük havuzlardan bir blok döndürür.
Ayrıca temel bir yığın kontrol mekanizmasıdır. Bir MMU olmadan, bir yığın aşırı akış sessiz bir şekilde bitişik verilerle bozulabilir.Kapadaki bilinen bir kalıbı atlayarak bir yığın muhafız kullanın ve her bağlamda kontrol edin.
Gömülü Sistemler için Planlama Politikaları
Programcı, OS'nin kalbidir. Kaynak eğitimi için, üç planlama yaklaşımı yaygındır.
Kooperatif (Coroutine-Based)
Her görev açıkça kontrol eder. Bu, bir zamanlayıcı kesintiye ihtiyaç duyar ve son derece hafif olabilir. Çekirdek, görevlerin listesini koruyan ve çağrıları arayabilirsiniz.0)task yield()))))))))))) Bu, görevlerin kısa, iyi tanımlanmış bir uygulama için iyi çalışır.
Sabit Önceliklerle Boşluk
Sistem kene kesintisi (örneğin, her 1 ms) programcıyı çağırır.Her görevin her zaman en yüksek öncelikli görevde en yaygın görevdir. Bu, gömülü gerçek zamanlı sistemlerdeki en yaygın bir modeldir, çünkü kritik görevlerin tarihlerle buluşmasını sağlar.Dönetici[Döneticileri ile)[Döneticileri arasında bir zamanlama adilliğe eklenebilir.
PuanMonotonik ve Earlest Deadline Firstline
Daha öngörülebilir zamanlama analizi için, oran-monotonik zamanlama (daha kısa sürelerle ilgili görevler daha yüksek öncelik alır) genellikle Earlest-deadline-ilk (EDF) daha yüksek CPU utilizasyonunu elde edebilir, ancak son derece küçük MCUs (e.g., 8-bit) üzerinde daha fazla masraf gerektirir.
Güç Yönetimi Entegrasyon
Battery hayatı genellikle gömülü bir cihaz için birincil özelliklerdir. OS aktif olarak güç devletlerini yönetmek zorundadır. Tipik teknikler şunları içerir:
- [FONT:0]Idle kancalar:[Dönetici:[Dönetici:2)[Dönetici:0)[Dönekli))[[Dönemli)))))[[Dönemli)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
- [Dynamic gerilim ve frekans ölçeklendirmesi (DVFS):[DDVFS): Platform bunu desteklerse, OS, dörtlü kuvvetle azaltır.
- [FONT:0) Deep uyku ve uyanma mantığı: genişletilmiş idle dönemleri için (örneğin, sensör her saat rapor), cihaz ana CPU saatini ve en periferik kesme işlemini kapatan derin bir uyku modunda girer.Sadece düşük güç zamanlayıcı veya dış kesim cihazı uyandırır.
- [FONT:0)Peripheral gating:[Dönetici:[Dönetici:0)Peripheral gating:[Döneticileri kullanmamış saatlerini kapat. (e.g., SPI, GPIO bankaları) çekirdeklerin güç yönetimi arayüzü aracılığıyla.
İyi tasarlanmış bir özel OS, uyku sırasında birkaç mikroamps'tan aktif akım çizebilir, dramatik bir şekilde batarya ömrünü uzatabilir.
Device Sürücü Model
Sürücüler yazılım özetlerine kayıt verir. Özel bir gömülü OS'de, sürücü modeli basit ve üniformalı olmalıdır. Her sürücü, küçük bir dizi operasyon uygular (init, okuyun, yazma, ioctl, kontrol).
Critical drivers (e.g., UART, GPIO) should be written in assembly‑inline C for speed. Use volatile pointers for memory‑mapped I/O. A typical driver for a GPIO pin might be:
void gpio_set(int pin, int val) {
if (val) *GPIO_OUTSET = (1 << pin);
else *GPIO_OUTCLR = (1 << pin);
}
Özel sürücüleri yazarken, her zaman OS'nizin farklı bir mikrokontrollü aileye taşınabilir olabileceğini düşünün. Makros veya doğrusal işlevlerin arkasındaki özel ayrıntılar porting'i rahatlatmak için.
İletişim Protokolü Stacks
Neredeyse her gömülü cihaz iletişim kuruyor - UART, SPI, I2C, CAN veya kablosuz bağlantılar. tam bir TCP/IP yığını, birçok kısıtlı cihaz için aşırı kapalıdır. yerine, hafif protokol tamponları ve özel framing.) kablosuz olarak, birFLT'yi bütünlemeyi düşünün:0BLE veya aparat:2|Dönetici[Döneticileri değiştirmiş gibi ayarlandığında, yüksek çözünürlükte ayarlanan 10 adet sabit bir şekilde ayarlandığında, yüksek çözünürlükte bulunabilir.
Basit sensör ağları için, minimum bir minimum [[0)SPI bazlı[[Dönetici:2) veya [[Dönetici[Döneticiler) ile özel protokol sabit uzunlukta paketler ve CRC checks ile tasarlanabilir. OS programı I/O'da engellenmelidir; mümkün olan ve tam transferleri tamamlanana kadar görev blokunu kullanın.
Kaynakta Güvenlik
Güvenlik genellikle hafıza ve işleme sınırları nedeniyle ihmal edilir, ancak kritiktir. Basit bir sensör bile saldırılara karşı bir vektör olabilir. Anahtar önlemler şunları içerir:
- [FONT=0)Güvenli çizme:[Dönetici:0)[DÜcretsiz) Nett: [FODSA doğrulama rutini birkaç kilobaytında çalıştırılabilir.
- [FONT:0)Memory izolasyonu:[Dönetici:[Dönetici:[Dönetici:0)) MCU'nun bir MPU'ya sahip olması durumunda, ayrı çekirdek ve görevler için kullanın (sadece bir monolithic OS’de bile).
- [FONT=0) Şifrelenmiş iletişim:[Dönetici:[Dönetici:0) Donanımlı AES veya ChaCha20'yi ödeme yükleri için kullanın.
- [FONT:0)Canary checks:[Dönetici:[Döneticileri) görev kümesi sınırlarında (günlük değerleri) takılabilir.
Güvenlik özellikleri ek olarak, ancak dikkatli tasarım, on iki flaş ve ameliyat başına birkaç mikrosaniye içinde tutabilir.
Toolchains ve Development Environment
Özel bir gömülü OS geliştirmek güvenilir bir araç zincir gerektirir.ETHFLT:0)GCC[D: 1) Hedef mimarisi için (örneğin, ARM-EABI, RISC-V, AVR) standart olarak kullanılan kodlar ve kodlar doğru şekilde yer alan bölümlere bağlanır (örneğin, .data, RAM’te .bs.
Debugging, OpenOCD ve GDB gibi bir araçla yapılır. Birçok özel OS geliştiricileri de UART postmortem ile yapılır.[DÜT:1] hafif baskıcı-style debugging için. daha gelişmiş bir traksiyon için, bu loglar olayları (task anahtarları, kesmeler) ve UART postmortem ile çöp atlar.
Donanımın mevcut olduğu simülasyon için, [[QEMU) veya STM32CubeIDE'nin simülatörü gibi bir satıcıya özel bir simülatörü. Sistem test cihazı (scheduler, hafıza allocator) bir Linux için son derece verimlidir.
Test ve Optimizasyon Stratejileri
Rigorous test, yıllardır istenmeyen çalışacak herhangi bir OS için zorunludur. Yaklaşımlar şunları içerir:
- [FONT:0]Her ilkel çekirdek için testler[Dönetici:0) ve her bir temel için test zamanlamalayıcı doğrulama, bellek atama kalıpları ve nesting kesmek.
- [FONT:0]Stress testi[[Dönetici:0) yüksek kesme oranları ve eş zamanlı görev anahtarları ile. hedef donanımda 24+ saat boyunca çalıştırın.
- [FONT=0)Kom boyut analizi[[Dönetici:2) [Dönetici:0)[Dönetici:0))
[Dönetici:0)))
[Dönetici:0)))))))
[Düzücük|seçmişler (örneğin, herhangi bir dosya sistemi yok ise, tüm ilgili kodu kaldır.
- [FONT:0]Profiling[[Dönetici: ISR giriş ve çıkışta bir oscilloskop kullanarak en kötü davayı ölçül.
Optimizasyon sıcak yollara odaklanmaktadır: bağlam geçişi, kesintiye uğrama ve kritik sürücü işlevleri. Tasarruf / kayıt için Inline assembly zaman değişebilir. bağlantı zamanı optimizasyonu (LTO) kodu boyutunu azaltmak ve daha iyi inlining sağlamak için bağlantı kurun.
Gerçek Dünya Örneği: Minimal ARM Cortex-M OS
Örnek olarak, STM32G0 üzerinde çalışan özel bir OS düşünün (ARM Cortex-M0+ 36 KB RAM ile 64 KB flaş).
- 8 öncelikli seviye ile boş zamanlama.
- Küçük tahsisler için sabit hafıza havuzları (64 bytes, 128 bytes).
- SysTick handler tarafından tahrik edilen yazılım zamanlayıcıları.
- Güç yönetimi: boş görev çağrıları:0) WFI()).
- UART sürücüsü DMA ring buffer ile.
Tüm çekirdek, 4.2 KB flaş ve 1.1 KB RAM'ın üzerinde kullanır. Uygulama kodu (her 10 saniyede sıcaklık verileri gönderen bir BLE beacon) başka 18 KB flaşı kaplar. Cihazın iki yıl boyunca bir CR2032 para hücresi üzerinde çalışır.Bu, uygulamanın ihtiyaçlarına tam olarak uygun şekilde özel bir OS'nin uygulanabilirliğini gösterir.
Future Trendleri
RISCV gömülü alanda trafiğe yol açıyor, açık kaynak donanıma sahip olmak için özelleştirilmiş olabilir.Özel OS RISC-V'nin ek olarak, RIT'nin bazı kullanımları daha yaygın hale gelecektir. ek olarak, performanstan ödün vermeden güvenlik hafızasını da sağlar.(QUYNTT:2)
Başka bir eğilim, küçük çekirdek bileşenleri için (scheduler doğrulama, hafıza güvenliği) için [[Döneticileri (CBounded Model Checker) tarafından doğrulanan küçük kodbazlar için kullanılabilir.Demekli araçlar için güvenlik-kritik özel OS tasarımları kanıtlanabilir garantilerle görebiliriz.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Kaynakla eğitim edilen cihazlar için özel bir gömülü OS geliştirmek, belirli donanımınız için herhangi bir genel alternatif oluşturmak için bir OS geliştirmek gerekir.Her bir bellekte ve her miliwatt güçle mükemmel bir şekilde uyumlu olan bir sistemdir.In focus on the traditional IoT and edge-computinism, and effective Hardware utilisation, you can build an OS that outperforms any general alternative for your specific Hardware. while the study environment, enabling the operating environment, enabling new IoT and edge-computing applications that it the limits of small-scale Hardware.
Mevcut bir RTOS'tan başlayarak, bu makalede belirtilen ilkeler bir yol haritası sunar. Erken test etmeyi, sık sık sık test etmeyi ve cihazın kaynakları üzerindeki etkisini doğrulamadan asla kod ekleyelim.Dikkatli tasarımla, özel OS güvenilir, uzun süreli ve performansa dayalı gömülü ürünleri gerçekleştirmek için temel haline gelecektir.