Gömülü yazılım geliştirme, donanım ve yazılım kesiştiği noktada, her kod hattının belirli kayıtlarla etkileşime girdiğini, pins ve periferiklar için. gömülü sistemler karmaşıklıkta büyüdü - basit 8-bit mikrokontroller için çok-core sisteme-on-çişler - bu karmaşıklıkların en etkili stratejilerinden biri, akanlık bağımlılığının kullanılması, sabitlenme ve gömülü sistemlerin kullanımıdır.

Bir Donanım Özeti Katman Nedir?

Donanım Özeti Katmanı, donanım platformu ve uygulama seviyesindeki kod arasında oturan bir yazılım katmanıdır. GPIO pins, zamanlayıcılar, seri iletişim modülleri ve hafıza haritaları gibi donanım kaynaklarına erişmek için tutarlı, üniformalı bir arayüz sunar.

Onun özünde, bir HAL bir çeviri sınırı olarak hizmet eder. Örneğin, ESFLT gibi bir işlev:0) bir kayıt biraz bir işlemciye ve başka bir kayıtta tamamen farklı bir kayıt oluşturabilir. Uygulama asla bu farklılıkları görmez; sadece HAL'leri bu ayrımı görür.

Katmanlı Mimari

Birçok gömülü sistemde, yazılım yığını katmanlarda düzenlenir:

  • [FONT=0) Uygulama Katmanı:[Dönetici:[Dönetici:0)İş mantığı, kullanıcı arayüzleri, kontrol algoritmaları.
  • [FONT=0)Middleware Katman:[Dönetici:[Dönetici:[Dönetici: 0)[FONT=FONT=FONT=FONT=0)[[FONT=FONT=0)Middleware Katmanı:[[[FONTT:1).
  • [[Dönware Abstraction Katmanı:[Dönetici: 1) Donanım erişimi için standart API'ler sağlar.
  • [FONT:0)Board Support Package (BSP): ), düşük seviyeli sürücüleri, eller kesmek ve belirli bir yönetime özel olarak tasarlanmış başlangıç kodu.
  • [FONT:0)Hardware:[Döneticiler, sensörler, eylemciler ve periferiler.

HAL genellikle BSP'nin üzerinde oturur, daha genel bir arayüz sunar. Bazı mimarlıklar BSP ve HAL'ı tek bir katmana birleştirir, ancak soyutlama prensibi aynı kalır.

Neden HALs Maddesi: Core Faydaları

Bir Donanım Özeti Katmanının benimsenmesi, doğrudan gelişim verimliliğini, kod kalitesini ve ürün yaşam döngüsünü etkileyen sayısız avantaj getiriyor.

Portability Across Platforms

Belki de bir HAL'ın en çok alıntı avantajı donanım portability. Standart bir HAL API'ye karşı uygulama kodu yazarak, aynı uygulama aşağıdakiler içinde birden fazla donanım türüne veya hatta tamamen farklı mimariye sahip farklı bir şekilde çalıştırılabilir. Örneğin, genel I2C işlevleri kullanarak yazılmış bir sensör sürücüsü, bir STM32'de yeniden kullanılabilir, bir PIC veya bir ARM CortexM sistemi ile yeniden kullanılabilir.Bu, bir ürün ailesi içinde birden fazla donanım varyantını desteklemek için gerekli çabaları dramatik bir şekilde azaltır.

Basitleştirilmiş Kalkınma ve Daha Hızlı Zaman-Pazarlama

Gömülü mühendisler artık her periferiklıkta uzman olmak zorunda değiller. bir HAL ile uygulama mantığına, veri akışına ve sistem davranışına odaklanabilirler. Yeni ekip üyeleri daha önce üretken olabilir, çünkü sadece HAL API'leri öğrenmeleri gerekir, projelerde tutarlı bir HAL kullanan şirketler gelişim döngülerinde önemli bir azalmalar raporlayabilirler - bazen% 40 olarak - kod yeniden kullanımları pratik ve düşük seviyeli hale gelir.

Geliştirilmiş Koruma

Donanım yükseltildiğinde veya bir boğa düşük seviyeli bir sürücüde keşfedildiyse, değişiklikler HAL'de bulunur. Uygulama kodu devam eder.Bu izolasyon regresyon test çabalarını azaltır ve sahada donanıma daha güvenli hale getirir. Benzer şekilde, yeni bir periferik bir başlangıç aralığı gerektirirse, sadece HAL modülünün değiştirilmesi gerekir.

Geliştirilmiş Testability

gömülü yazılımlar çok zor çünkü testler genellikle gerçek donanım üzerinde çalışır, bu yavaş ve pahalıdır. A HAL, a tekniğin adı altında aranır veya [[Döneticileri:2)) veya ZDDDDÜSÜSÜŞÜNCÜŞÜNCÜŞÜNÜSÜSÜŞÜ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

Kod Reusability Across Projects

İyi tasarlanmış bir HAL, şirket sahibi bir varlık haline gelir. Takımlar, ortak periferiklar için yeniden kullanılabilir sürücülerin kütüphanelerini inşa edebilir (örneğin, sıcaklık sensörleri, motor kontrolleri, ekran modülleri) tüm desteklenen platformlar boyunca çalışır.

Donanım Özeti Katmanları Gerçek Dünya Örnekleri

HALs teorik bir konsept değildir; neredeyse her modern gömülü sistemde kullanılırlar. İşte birkaç belirgin örnek.

STM32 HAL ve LL

STMikroelektronik, tüm periferik API'leri (GPIO, UART, SPI, I2C, zamanlayıcılar, DMA, vs.) ile daha düşük bir kontrol grubu ile birlikte, performans-kırıklama kodu için daha doğrudan kayıt erişimi sunan bir dizi procedural API'ler içerir (GPIO, UART, SPI, I2C, zamanlayıcılar, DMA, vs.)

Arduino Framework

Arduino'nun başarısı büyük ölçüde basit, tutarlı bir soyutlama nedeniyledir.Seks, ARM, ESP32 ve hatta RISC-V tabanlı yönetim kurulular C++'da sık sık sık yazılır, bu soyutlama, milyonlarca hobi ve profesyonelin ihtiyaç duyduğunda Arduino'yu hızlı bir şekilde kullanması ve daha sonra gerekli olan alüminyum koda taşıması çok etkilidir.

FreeRTOS ve CMSIS-RTOS

FreeRTOS gibi gerçek zamanlı işletim sistemleri, portability için bir HAL kullanıyor.The FreeRTOS çekirdeği C'de sadece küçük bir platforma özgü bir katmanla yazılır ve bağlantı bağlamını keserek.IfSTT:0) ve [[Döneticiler, mutexs, kuyruklar, zamanlayıcılar) Bu, CMSOS web sitesindeki tüm belgeleri kullanarak uygulamaktadır.

Linux

OS seviyesinde, donanım soyutlama daha da kritiktir. Linux çekirdeği soyutlama, standart modellere uygun olan cihazlara: karakter cihazları, blok cihazlara, ağ arabirimleri, giriş cihazları vs. Kullanıcı alanı uygulamaları, iyi tanımlanmış dosya işlemleri ve ioctl çağrıları ile etkileşime girer, asla dokunmaz.[Döneticileri değiştir] Cihazın özetlemesi, binlerce farklı donanım yapılandırmasını desteklemek için tek bir işletim sistemi imajını sağlar.Bu makale, mikro kontrol cihazları geliştirmeye odaklanırken, aynı ilkeler, Linux sistemleri ile etkileşime girer.

Donanım Özeti Katmanları ve Pitfalls

Birçok faydalarına rağmen, HAL'lar bir gümüş mermi değildir. Yoksulca tasarlanmış veya kötüye kullanılan soyutlamalar avantajlarını sınırlayan sorunları ortaya çıkarabilir.

Performans Overhead

Özet genellikle bir maliyetle gelir: ekstra işlev aramaları, ek doğrulama kontrolleri ve on iki işlem içinde tamamlamaları gereken bir kesintiye uğrayabilir.Gerçek zamanlı sistemlerde sıkı tarihlerde, bu ek kabul edilemez. Örneğin, STM32'de her parametreyi kontrol eden bir HAL, on döngüsün içinde tamamlamak için mikrosaniyeleri ekleyebilir.

Özet Leakage

Donanıma özel detaylar uygulama katmanına yol açıyorsa soyutlama “kahalar” olur. Bu, HAL arayüzünün tüm donanım yeteneklerini kapsamak için yeterince zengin değildir. Örneğin, basit bir şekilde 3 ) işlevi, donanım akışı kontrolü, DMA zincirleme veya değişken kelime boyutları gibi gelişmiş özellikler destekleyemez.

Tasarım ve Dokümantasyon

Sağlam bir HAL oluşturmak, hem donanımın hem de onu tüketecek uygulamaları hakkında derin bilgi gerektirir. arayüzün yararlı olması için yeterince genel olması gerekir. Zavallı belge kötüye gidenler; geliştiriciler, HAL'ın garanti etmediği davranışları yanlış veya varsayabilir. Birçok proje doğru bir HAL tasarlamak için gereken çabaları hafife almamalıdır, çok ince (daha kalın) veya çok kalın (blosuz) veya çok kalın (blosuz) tabakalara yol açan katmanlara yol açabilir.

Debugging Kompleksi

Uygulamada bir hatanın uygulama mantığında olup olmadığını belirlemek zor olabilir, HAL'de veya donanımda kendi başına etkinleştirilebilecek ekstra tabakalar.Debuggers genellikle sadece HAL kodu göstermez, donanım kaydı durumunu azaltmak için.

LockIn to a specific HAL Uygulama

İronik olarak, kötü tasarlanmış bir HAL satıcı kilit oluşturabilir. Eğer HAL belirli bir araç zincirine veya kütüphaneye sıkıca bağlıysa, her platform için adaptörler sağlayabilir.Bu yenilgiler, uygulama odaklı arayüzü tanımlamaktır.

Tasarım ve HAL'ları kullanarak en iyi uygulamalar

Bir Donanım Özeti Katmanının değerini maksimize etmek için, dezavantajlarını miniken, bu yönergeleri takip edin.

Temiz, Minimal Interface

Uygulamanızın ihtiyaç duyduğu temel işlevleri ile başlayın. Her bir donanım özelliğini gizlemek için bir uyarıdan kaçının. iyi bir HAL, gerekli kullanım koşulları için yeterli , ancak daha büyük bir kullanım için tıkanma işlemine izin vermek için.

Özetin Birden Çok Seviyelerini Destekleyin

Hem yüksek seviyeli bir “kolay” API'si hem de daha düşük seviyeli bir “hızlı” API'si sağlayın. Örneğin, yüksek seviyeli bir SPI işlevi tüm konfigürasyonu içebilir, düşük seviyeli versiyon, çağrıcının otobüs seferlerini yönetmesini beklerken, bu, net duyarlı kodların, HAL paradigmayı tamamen terk etmeden uzaklaşmasına olanak sağlar.

Standart Naming Conventions kullanın

Konsolosluk adı, tüm HAL işlevleri modül adı ile birlikte (örneğin, [[D) ile birlikte, [[BİLMİŞE: 5) Bilgilendirme parametreleri için enumlar, MISRA-C gibi bir kodlama standardı takip edin.

HALA için Birim Testleri

HAL'ın kendisini simülasyonlu veya taklit edilmiş bir ortam kullanarak test edin. Her işlevin normal ve hata koşullarında doğru davrandığını doğrulamayı sağlayın.Bu, HAL'ı yeni bir çip üzerinde yeniden kullandığınızda, temel davranış tutarlı kalır. Ünite test eder HAL ayrıca kullanım için canlı dokümantasyon olarak hizmet eder.

Porting Kits ve Örnekler

Eğer HAL'ınız birden fazla platform hedefliyorsa, yeni bir mikro kontrol için ne uygulanmalıdır açıklayan bir “porting guide” oluşturmak. İki veya üç popüler çip için referans uygulamaları sağlayın. Bu, diğer takımların veya müşterilerinizin HAL'ı benimsemesini önemli ölçüde azaltır.

Özet Doğru Düzeyde

Her bileşen soyutlama için aday değildir. Örneğin, çok basit bir LED toggling, bir HAL çağrısı aracılığıyla doğrudan kayıt yaz aylarında daha verimli bir şekilde yapılabilir. Ancak, LED kritik bir sistem durumunu gösterirse, soyutlama hala test edilebilirliği için haklı olabilir.Her zaman belirli mühendislik ticaretlerini göz önünde bulundurun.

Basit bir HAL'ı Uygulamak: Minimal Örnek

Konsepti göstermek için, varsayımsal bir mikrokontrol için C'de yazılmış temel bir GPIO HAL'ı düşünün.

// hal_gpio.h
typedef enum { LOW, HIGH } GPIO_State;
typedef enum { OUTPUT, INPUT, INPUT_PULLUP } GPIO_Mode;

void hal_gpio_init(int pin, GPIO_Mode mode);
void hal_gpio_write(int pin, GPIO_State state);
GPIO_State hal_gpio_read(int pin);

Belirli bir çip için uygulama kayıt adreslerini kullanabilir:

// hal_gpio_stm32.c
void hal_gpio_init(int pin, GPIO_Mode mode) {
 // Map pin to GPIO port and bit
 // Set MODER, PUPDR registers based on mode
}
void hal_gpio_write(int pin, GPIO_State state) {
 // Write to BSRR or ODR registers
}
GPIO_State hal_gpio_read(int pin) {
 return (GPIOA->IDR & (1 << pin)) ? HIGH : LOW;
}

HAL'ı kullanarak bir uygulama asla kayıtlara dokunmuyor ve farklı bir şekilde bağlantı kurarak farklı bir çip için derlenebilir.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Donanım Özeti Katmanları modern gömülü yazılım mühendisliğinin temel taşıdır. Kod taşınabilirliği, basitleştirme, test edilebilirliği sağlar ve STM32 HAL, Arduino ve CMSIS-RTOS gibi bakım maliyetlerini azaltırken, etkili HALA'lar tasarlamak ve kullanmak için gereken beceriler daha önemli hale gelir - iyi bir arayüz tasarımı, birden fazla soyutlama seviyesi ve disiplinli testler.

Daha fazla okuma için, ESD'nin ve LL[DÜSTR] ile ilgili olarak, BÖLÜMÜSÜSÜSÜSÜŞÜ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