Pil-güçlü veya enerji-harvesting uygulamaları için kullanılan gömülü sistemler, CPU tarafından çekilen her mikroampiyona, her hafıza erişimine ve her periferik aktivasyona katkıda bulunur. Bu makale, güç kodlama uygulamaları için C kodlarını azaltmak için pratik, üretim-testli teknikler, derleyici kullanım ve donanım-aware programlamaya nasıl çeviren bir tasarım yaklaşımı gerektirir.

Gömülü Cihazların Güç Tüketimini Anlamak

Mikrokontrollü bir sistemdeki güç tüketimi iki birincil bileşene sahiptir: dinamik güç, hangi ölçekleri geçiş aktivitesi ve saat frekansı ile ölçeklendirir ve her biri cihazın aktif işlem sırasında nispeten sabit kalırken, statik güç, boş veya uyku durumlarında önemli hale gelir. CPU çekirdeği, bellek alt sistemleri (flash, RAM, önbellek), ve periferik bloklar her biri bu bileşenlere farklı katkıda bulunur.

48 MHz'de çalışan tipik bir Cortex-M0+ cihazı için, aktif akım yaklaşık 5-10 mA olabilir, derin bir araç modu, 1 μA. Yazma verimli C kodu altında, CPU'nun aktif modda harcadığı zaman, hafıza trafiklerini azaltıp mümkün olduğunca düşük güç donanımlarını kullanmak için kodlarını profilli bir şekilde kullanmak gerekir. Geliştiriciler, noktaları tanımlamak için entegre bir enerji izlerini kullanarak veya entegre bir enerji izlerini azaltmalıdır.

Enerji Verimliliği için optimizasyonlar

Modern C derleyicileri gömülü hedefler için bir dizi optimizasyon bayrağı sunar, çünkü daha küçük kod daha az flaş hafızasını ve daha az talimat getirir, hem dinamik hem de statik enerjiyi azaltır. [FONT=O3[Dönetici için optimize edilir) bayrak, daha hızlı bir şekilde kod büyüklüğüne ve bu nedenle, bellek-dönüşüm sistemlerinde enerji tüketimini artırabilir. ancak, hesaplamak için daha az flaş döngüsü için, daha az sayıdaki komut dosyası sağlar.

Düşünmek için ek derleyici seçenekler:

  • [FONT:0]-fno-math-errno) – matematik işlevleri için hata kontrolü ortadan kaldırır, tasarruf talimatları.
  • [FONT:0]-Flev-bölümler -fdata-bölümler[[DÜT:1) - kullanılan fonksiyonları ve verileri silmek için bağlantıya izin verir, flaş ayak izini azaltır.
  • [FONT:0]-flto[DÜDÜT:1] (link-time Optimizasyonu) – çeviri birimlerinde agresif ve ölü kod ortadan kaldırmayı gerçekleştirir.
  • [FONT:0]-mno-unhased-erişim[Dönetici] – derleyicinin, birçok ARM çekirdeği üzerindeki otobüse yavaş veya çift katlı erişimlerini engellemesini sağlar.

[FONT:0) CEVAP tarafından yapılan bir endüstri çalışması, ölçümle kıyaslanmadığı halde, performansları optimize eden sürümler için% 20-35 oranında azaltılabilir.

Enerji Verimliliği için Kodlama Teknikleri

Enerji farkındalığı ile C kodu yazmak düşük güç modlarını kullanmanın ötesine geçer. Her dil inşasında bir donanım maliyeti vardır. CPU döngüleri, hafıza erişimleri ve periferik etkileşimleri azaltan aşağıdaki alt bölümlere sahiptir.

Veri Tip Seçimi ve Arithmetic

En küçük yeterli veri türü hafızayı kullanarak ve otobüs trafiğini azaltır. Tercih eder:0))Ölmüş 8 t) veya [[Dönemli):2.16 t) için [[Dönetici:0|Dönetici için, bir parça ve modülel işlemler için; bunları iki değişkenle çalışırken değiştirme ve biraz mantıklı işlemlerle değiştirin.[D) Örneğin,FLT:0) x x devre dışı bırakılabilir.

Yüzen nokta operasyonları özellikle pahalı.In Cortex-M4F cihazlar bir donanım FPU, tek taraflı yüzler hızlı, ancak çift taraflı kararlar hala yazılımda emated edilir.In M0/M0+ temeller, tüm yüzen nokta emilir ve kaçınılmalıdır. Bunun yerine sabit nokta arithmetic veya ölçeklenmiş bir tamsayı kullanın.

Ring Optimizasyon ve Branş Prediction

Halkalar büyük bir güç tüketimi kaynağıdır çünkü CPU aktif kalır, talimatları getirir ve koşulları değerlendirir. Teknikler döngü ekini en aza indirmek için:

  • [FONT:0]Loop kayıt dışı[[Dönetici: 1 ) - manuel veya derleyici ipuçları ([[Döneticiler ve şube talimatlarının sayısını azaltmak için). 4 veya 8 faktör tarafından kayıt dışı bırakmak genellikle en iyi sonuçlar verir.
  • [FONT:0]Üsing count-down loops[Döneme:0)[[Döneme:0)[[değiştir | kaynağı değiştir], sıfır kontrol birçok mimaride ücretsizdir (örneğin, ARMEND: 5)
  • [FONT:0]Software borulining[Dönetici: 1 ) – hafızayı geç saklama ve boru hattı tam olarak tutma.
  • [FONT:0) Bir işlev döngü içinde aramalardan kaçınılması[Dönetici: 1 ) – sabit küçük fonksiyonlar el veya İLFLT:6) çağrı/dönüşümü ortadan kaldırmak için anahtar kelime.

İyi optimize edilmiş bir döngü aktif alanda naif bir uygulamadan% 70 daha az zaman geçirebilir, doğrudan enerjiyi çevirir.

Hafıza Access Patterns

Flash bellek SRAM erişimlerinden daha fazla güç tüketiyor ve dış hafıza arabirimleri daha pahalı. Önbellekli vuruşları (eğer önbellekli mevcutsa) veya en az bekleme eyaletlerini kullanın.UseENFLT:0) andurFLT:2statik eksi) notu (FLT:3) böylece flaşta kalıyorlar, ancak rastgele erişim tezgahlarından kaçınmak için uygun olarak.

Bit-field erişimleri pahalı olabilir çünkü derleyici bir C bit-alanından daha küçük ve daha hızlı bir şekilde yapılmalıdır.

DMA (Direct Memory Access) güç verimliliği için önemli bir müttefiktir. CPU kopya verileri hafızaya ve hafızadan hafızaya kadar (örneğin, UART'tan RAM'a kadar), CPU'nun düşük güç durumuna girdiği zaman transfere girebilmesi için bir DMA kanalı yapılandırın. Birçok mikro kontrol cihazı hafızaya ve hafızadan hafızaya DMA desteği sağlar.

Interrupts vs Polling

Yoğun bir döngüde bir bayrak, CPU'yu aktif ve tüketerek güç tutar. Interrupt-güdümlü I/O, istenen aralığın ardından bir kesintiye uğramaya veya diğer çalışmayı gerçekleştirmesine izin verir.For periodic tasks, use Hardware timers instead of aFLT:7 döngü that count to 1,000,000, set a timer to generate a step after the desired interval and put the CPU into sleep mode.

Bir ince nokta: Her kesme işlemi, sistemdeki kesintiler ve CPI'nin genel olarak, her 10 μs'den daha yavaş meydana gelmesi durumunda, genel olarak, eylemlerin daha verimli olması için daha fazla güç tüketebilir.

Dinamik Bellek Allocation

[FONT=0]Malzeme[[Dönetici:2) ve [[Döneticileri kullanarak, sadece öngörülemeyen zamanlama ve parçalamaları tanıtmıyor, ancak aynı zamanda Cortex-M0 gibi) sabit olarak tahsis edilen tamponlar ve havuz tümocators.Eğer dinamik tahsis edilemezse, asla başarısız olmayan sabit bir havuz kullanın.(O kompleksine sahip olmak için) küçük mikro kontrolcülere yönelik işlemlere mal olur.

Donanım Özellikler

Çoğu modern mikrokontrolörler, özellikle güç azaltmak için tasarlanmış özellikler içerir. Bu özellikleri doğru kontrol eden C kodu yazmak önemlidir.

Low-Power Modes ve Wake-up Sources

MCU satıcılar birkaç uyku modları sunar: idle, uyku, derin uyku ve hibernate. C, bunlar genellikle algFLT:0)WFI) veya TELT:2)WFE[DÜye Olmayanlar İçin Tıklayınız.[Dönetici için:0) Uygulamalı kaynaklar (örneğin, GPIO, zamanlayıcı, RTC) ve uygun güç modu seçin. Örneğin, MSP430 veya STM32, çağrı yapabilirsiniz:

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

Birden fazla uyanma kaynağı kullanırken, sistemin olayı servis ettikten sonra hızlı ve yeniden girebilmesini sağlayın. Ortak bir model, altta bir uyku ile "süper döngü"dir:

while (1) {
 uint32_t next_event_time = schedule_next_event();
 enter_sleep_until(next_event_time);
 process_event();
}

Saat Gating ve Gereking

Birçok MCUs, periferik saatlerin bireysel olarak devre dışı kalmasına izin verir. C, bu, kayıtların (örneğin, RCC->AHBENR'nin STM32) tarafından aktif bir şekilde kesintiye uğramasını sağlar. Bazı gelişmiş cihazlar dinamik gerilim ve frekansı ölçeklendirmeyi destekler (DVFS). CPU saatini 48 MHz'den 24 MHz'den 24 MHz'ye kadar azaltın.

Örneğin, NXP LPC55S6x'te, temel saati ile değiştirebilirsiniz:

CLOCK_SetFreq(kCLOCK_Core, 24000000U);

Ve daha sonra hesaplamak yoğun patlamalar için 96 MHz'e geri döndü. Bu "kahkaha için" strateji, derin devletlerle birleştirildiğinde son derece etkilidir.

Offload için On-Chip Peripherals kullanmak

Bazı periferiklar, CPU'dan bağımsız olarak çalışabilirler. Bir analog kompatörü, bu bağımsız modların geçtiğinde bir kesintiyi tetikleyebilir, sürekli ankete son verebilir. Donanım zamanılayıcı, CPU müdahalesi olmadan PWM sinyalleri üretebilir. Bir olay sistemi ( Microchip AVR, Labs veya TI cihazlarında bulunur) zinciri periferik modları doğrudan aktif CPU zamanlarını sıfıra yakınlaştırmaya olanak sağlar.

Vaka Çalışması: Bir Güç-Optimized LED Blinker

Klasik disky örneği optimizasyon etkisini göstermek için iyi bir başlangıç noktasıdır. İki AA pilden çalışan bir sistem düşünün, bir yıl hedef ömür boyu. Cihazı 100 ms için bir LED takarak.

Naive implementation (polling delay):

while (1) {
 toggle_led();
 delay_loop(1000000); // busy-wait ~100 ms
 toggle_led();
 delay_loop(19000000); // busy-wait ~1900 ms
}

İşte, CPU zamanın% 100'ü aktif, enerji bekliyordu. Şimdiki çiz ~5 mA, ortalama enerji ~ 1080 mAh / yıl ( 3.0 V varsay).

[0] Düşük Güç Uyku Uygulaması: ).

void SysTick_Handler(void) {
 static uint32_t ticks = 0;
 ticks++;
 if (ticks == 2000) {
 toggle_led();
 ticks = 0;
 }
}
int main() {
 init_systick(1); // 1 ms tick
 while (1) {
 __WFI(); // sleep until SysTick interrupt
 }
}

Şimdi CPU, 2 saniyelik dönemin çoğu için uyur, sadece 1 ms SysTick kesintisi ve LED toggle için uyanmak. Ortalama mevcut düşüşler -0.5 mA (konuş dahil), verim -120 mAh / yıl - 9x gelişme.

[FONT:0)Further Optimizasyonu Donanım zamanılayıcı PWM:[Dönetici: 1 )

CPU'yu LED'i yakalamak için kullanmak yerine, 16 bit zamanlayıcıyı PWM'yi her 2 s'te 100 m'lik bir üretime kadar devre dışı bırakmak ve derin bir uykuya girmek. Zamanlayıcı dikkatli bir tasarımla çalışır, ortalama akım LED'in kendi tüketimi de dahil olmak üzere, beş yıldan fazla batarya hayatını verebilir.

Bu ilerleme, en büyük kazanımlar, CPU'nun aktif katılımının en aza indirgenmesini yeniden düşünmekten geldiğini gösteriyor, mikro optimize döngülerden değil.

Pratik ölçüm ve Doğrulama

Gerçek ölçümler gerektiren bir iteratif işlemdir. Mevcut bir prob veya özel bir güç profili (örneğin, Kuzey Power Profiler Kit veya Joulesko) mevcut dalgaformunu yakalamak için bir oscilloskop kullanın.

  • Aktif zirveler: Mümkün olduğu kadar kısa olmasını sağlar.
  • Uyku akımı: Seçilen mod için veri tablo değerini doğrulayın.
  • Wake-up geçiciler: aşırı akım artışlara neden olabilecek hızlı geçişler.

Görev başına veya ikinci başına ortalama enerji hesaplayın ve gereklilikleri karşılayın. AETHFLT:0)EETimes makalesi) Bu ölçüm odaklı geliştirme genellikle beklenmedik pin çekme veya yüzen GPIOs gibi şaşırtıcı enerji batmasını ortaya koyar, bu da basit C kodu değişiklikleriyle sabitlenebilir (örneğin, analog modları düşük olarak yapılandırın).

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

Güçlendirilmiş gömülü cihazlar için C kodu optimize etmek, modern mikro kontrol cihazlarının düşük güç yeteneklerini kullanmak, geliştiriciler enerji tüketiminde dramatik azalma elde edebilir - dinamik ve statik güç fiziği anlamak, derleyici optimizasyonlar, enerji-bilinçli kodlama modellerini uygulamak ve modern mikro kontrolellerin düşük gücünü kullanmak, geliştiriciler enerji tüketiminde dramatik bir azalma elde edebilir - daha fazla sayıda değişkenlik veya daha fazla tasarruf sağlamak için uzun süreler harcayabilirler. Anahtarlar aktif CPU zamanlarını azaltır, bellek trafiği azaltır ve donanım işlerini bağımsız olarak uygulayın.

Daha fazla okuma için, danışma:0)ARM Yazılım Geliştirme Kılavuzu[Döneticileri ve [[Döneticileri için:2)Mikroçi Güç Yöneticisi araçları[Döneticileri için 3 )