Kontrol Sistemleri ve Otomasyon
Iot Cihazları için Portreatif C Kod Nasıl Yazılır
Table of Contents
IoT cihazları için portatif C kodu yazmak, çeşitli donanım platformlarında uygulamaları dağıtmaya ihtiyaç duyan gömülü geliştiriciler için temel bir beceridir. IoT ekosistemi, ARM Cortex-M, RISC-V, AVR ve özel mimariler, her biri benzersiz hafıza haritaları, periferik kayıtları ve derleyici tasarım olmadan, portability için çalışır kodlar, bir hedefle birlikte sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sık sıkılır ve bakımlı ve bakım kabuslar.
IoT Development'de Portability Anlamak
Portability, kaynak kodun küçük veya hiçbir değişiklikle farklı donanım mimarileri üzerinde derlemek ve çalıştırılabileceği anlamına gelir. IoT dünyasında, portability sadece bir rahatlık değildir - bir iş gereksinimidir. Ürün yaşam döngüsü uzun, tedarik zincirleri değişir ve yeni silikon sürekli olarak mevcut donanıma sahip olarak görünür.
Portability bir spektrumda var.Bir sonunda, IoT için tamamen platforma bağımlı olmayan (örneğin, genel tür algoritmaları) herhangi bir yerde derlenir.Diğer bir ucunda, doğrudan donanım kayıtlarını manipüle eden kod, doğrudan taşınabilir olmayan C'nin hedefi soyutlama katmanlarının arkasındaki farksız ayrıntıları izole etmektir.
Kod Portability
C portability'i gömülü tutan birkaç düşük seviyeli fark:-
- [FONT:0]Endianness.[[DÜDÜT:1) ARM Cortex-M ve AVR küçük bir Hintlidir; bazı eski mimariler (örneğin, Free HC12) büyük bir İbranicedir. Doğrudan siparişler ile karşı karşıya kalan kişiler veya sendikalar sessiz veri yolsuzluklarına yol açar.
- [FONT=0]Word büyüklüğü ve tip tanımları.[DÜT:1] AnAHFLT:0) 8-bit AVR, 32 bit bir Cortex-M0 üzerinde, ve 64 bit bir RISC-V 64-bit işlemci üzerinde.
- [FONT:0]Kayıt harita farklılıkları.[[Dönetici:0] Aynı satıcıdan iki MCU bile genellikle farklı periferik temel adreslere, biraz alana ve konfigürasyonlara sahiptir.
- [FONT=0]Compiler uzantıları ve pragmas[Dönder: GCC, IAR, ARM Compiler 6 ve Keil her birinin kendi kendine has bir şekilde var:2.
- [FONT=0]Memory düzeni ve hizalama[Döneticiler için sıkı bir uyum gerektirir; diğerleri bir hata eller ile yanlış erişimle yanlış bir şekilde ele alır.
- [FONT:0]Strupt kullanımı ve yığın kullanımı.[DDD: 1) Interrupt vektörleri, öncelik modelleri ve yönlendirme davranışı yaygın olarak değişir.
Yazmak için Anahtar Stratejileri
Donanım Özeti Katmanlar (HAL)
Donanımlı kod cephaneliğinde en güçlü araç, alt kayıt için bir API'dir:0) Yönelme katmanında (e.g.) iyi tasarlanmış bir HALK'nın ortak periferik (GPIO, UART, I2C, SPI, UART, I2C, SPI, zamanlayıcılar) saklanan bir kayıt için kullanılan HTML'de tanımlanmalıdır.[değiştir | kaynağı değiştir]
Tipik bir HAL uygulama modeli bu şekilde görünüyor:
// hal_gpio.h (common)
typedef uint8_t gpio_pin_t;
typedef uint8_t gpio_port_t;
void hal_gpio_set_output(gpio_port_t port, gpio_pin_t pin);
void hal_gpio_set_high(gpio_port_t port, gpio_pin_t pin);
void hal_gpio_set_low(gpio_port_t port, gpio_pin_t pin);
Platforma özel dosyalar (örneğin, 03.03.2012) gerçek kayıt yazarını içerir. Yeni bir MCU'ya taşınırken, sadece düşük seviyeli HAL kaynaklarının yeniden yazması gerekir, tüm yüksek tabakalar dayanılmaz kalırken.
Standart Kütüphaneleri Kabul Etmek
C standart kütüphane birçok ortak operasyon için taşınabilir bir temel sağlar.Templeksiyonlar gibi işlevleriz.), [[Döneticiler ve matematik işlevleri, C derleyicisi ile ilgili varsayımlardan kaçınmak kritiktir - derlemenizin uygulamanızın yetersiz olmadığını doğrulayan performans için tekrar yazmanız gerekir.
Sınırlı hafıza ile IoT sistemleri için standart kütüphanenin alt setini kullanmayı düşünün (örneğin:0) Yenilib-nano) GCC ekosisteminde, kendi dize rutinlerinizi atmak yerine, aynı zamanda, [[DÜVENİT:12] makro ve [[Sessiz Link: TheFLT:2|GNU C Library Belgeleri) mevcut olan bilgileri anlamak için mükemmel bir referanstır.
Sabit veri türleri
Her zaman, açık genişlikteki tüm değişkenleri beyan etmek için [[Üyetim: 03.03.2012, [[Üye Olmayanlar İçin Tıklayınız.)
Web üzerinden veri serilendirmeniz gerektiğinde, sabit genişlikteki türleri bir ağla birleştirin ([DÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ
Örnek:
Preprocessor yönergeler platforma özgü kod için meşru bir araçtır, ancak her dosya üzerinden küçük bir yapılandırma makrolarını tanımlamak gerekir (örneğin, 03.03.2012)
// platform_config.h
#if defined(STM32L4)
#define PLATFORM_STM32L4
#elif defined(EFM32GG)
#define PLATFORM_EFM32GG
#else
#error "Unsupported platform"
#endif
Sonra kodda, sadece kesinlikle gerekli olduğunda, genel olarak [[Cinseller kullanın. aşırı derecede :32'in okuma ve korumayı zorlaştırdığını unutmayın. HAL Özetleri mümkün olan durumlarda.
Dış Bağımlılığı
Dahil olduğunuz her üçüncü taraf kütüphane, potansiyel bir taşınabilirlik tehlikesidir. Bir bağımlılık eklemeden önce, tüm hedef mimarilerinizi desteklediğini ve mevcut olmayan varsayımlara güvenmeyen varsayımlara güvenmediğini doğrulamadan önce.Kaynaklar tamamen taşınabilir C (e.g., 03.D) olarak, kütüphaneyi kendi inceleyerek genişletin, böylece daha sonra dokunmaksızın değiştirebileceğinizi düşünün.
Link: TheFLETHT:0)Embedded.com gerçek dünya taşınabilir C kodu) üzerinde makale, bağımlılıklara bağlı olarak ek bir perspektif sunar.
Enhancing Portability için Pratik İpuçları
Write modüler Code
Bilgisayarınızı iyi tanımlanmış arayüzlerle bağımsız modüllere ayırın. Her modülün işlevselliğini bir üst düzey dosya ile açığa çıkarmalı ve iç ayrıntıları saklamalıdır. Bu endişelerin ayrılması, yeni bir platforma porting yaparken bir modüle geçiş yapmak kolaylaşır. Örneğin, bir motor kontrol modülü doğrudan PWM çıkışı için bir HAL ile konuşmalıdır, doğrudan bir zamanlayıcı periferik kayıt için değil.
Doküman Donanım Bağımlılığı
Açıkçası belirli donanım davranışını varsayan herhangi bir kodun. Belirli bir sınır dışı olmayan yaklaşımın neden seçildiğini açıklamak için yorum kullanın, hangi platformların üzerinde çalıştığını ve farklı bir hedef için değişmesi gerekir.Bu belge orijinal geliştirici kullanılamadığında ve yeni bir mühendis koda girmeli.
Use CrossPlatform Build Tools
CMake, her platform için araç zincir dosyalarını belirtebilmeli ve hedefe göre derlemeniz için gerekli olan tanımlamaları yapabilirsiniz.Meson[DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD)S[FONT=STR][FONT=S][FONT=S][FONT=S][FONT=S FONT=SNT=S FONT=SNT=SNT=S FONT=SNT=S FONT=SNT=SNT=S FONT=S FONT=S FONT=S FONT=S FONT=S FONT=SNT=SNT=S FONT=S FONT=S FONT=SNT=S FONT=S FONT=S FONT=S FONT=S FONT=S FONT=SNT=S FONT=S FONT=S FONT=S FONT=S FONT=SNT
Portre Bit-Manipulation Teknikleri Kullanın
Kayıtlarda biraz açık veya açıklandığında, biraz-alan yerlerini varsayan mutlak maskeler yazmadan kaçının. Bunun yerine, HAL'de tanımlanmış sembolik sabit sabitler kullanın ve makroları veya doğrusal işlevleri güvenli operasyonlar için kullanın:
#define BIT_SET(reg, bit) ((reg) |= (1u << (bit)))
#define BIT_CLEAR(reg, bit) ((reg) &= ~(1u << (bit)))
DefineFLT:34, gerçek bir tam tam tam tamsayı yerine soyut bir parametre olarak tanımlar. Bu şekilde, farklı bir MCU üzerinde biraz pozisyon değişirse, sadece sabit tanım değişmeli, kodbase boyunca kullanım olmamalıdır.
Test ve Geçerlilik Across Platforms
Portability iddiaları doğrulanmalıdır. Tüm desteklenen platformlar için projenizi inşa eden sürekli entegrasyon (CI) kullanın. CI'de, ARMD gibi statik analiz araçları çalıştırın.) veya Coverity) fiziksel donanım olmadan uygulamasız bir şekilde yürütmeye devam etmek için, normal sigara testlerinde, normal sigara testlerinde (örneğin, RISCV için QEMU veya Renode) normal bir donanım olmadan uygulama yapmak.
Regresyon testleri her platformda tüm HAL API'leri erken yakalamak için egzersiz yapmalıdır. "UART'a bir aste yazmak, bir döngüde geri okumak" gibi bir test UART uygulamaları arasında zaman veya yapılandırma farklılıkları ortaya koyacak.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
IoT cihazları için portatif C kodu yazmak bir sonraki değildir - donanım alanında kaçınılmaz değişiklikler elde edebilir bir disiplindir. Donanım soyutlama katmanına yatırım yaparak, standart türlere ve kütüphanelere giriş yapmak, koşullu derlemeye özen göstermek için bugün, donanım peyzajdaki kaçınılmaz değişiklikleri sağlayabilen bir disiplindir.