C, gömülü yazılım pazarında neden hakimdir? [kapalı]


14

Hemen hemen herkes kutsama diyecektir:

performans !

Tamam, C atletik kod yazmaya izin veriyor. Ama sonuçta bunu yapabilen başka diller de var! Ve modern derleyicilerin optimizasyon gücü harika. Mu C başka hiçbir dil olduğu bazı avantajları vardır? Veya alan adında daha esnek araçlara gerek yok mu?


1
FWIW, Arduino C # ile kontrol edilebilir: arduino.cc/playground/Interfacing/Csharp
FrustratedWithFormsDesigner

@Frustrated: Evet, ama bu bir örnek ve cihaz üreten çoğu insan Arduino kullanıyor.
Ed S.



1
@ dan04, vakaların büyük çoğunluğunda, bu aslında bir sorun değildi. Texas Instruments Savunma Sistemleri ve Elektronik Grubu'ndaki bir 6DOF simülasyon grubu 1988'de küçük bir deney yaptı. O zamana kadar tüm simülasyonlarını FORTRAN'da yaptılar. PASCAL'a ne kadar zarar vereceğini görmek için bir tane yazmaya çalıştılar. PASCAL'ın onlara küçük bir performans vuruşu sunduğunu keşfettiler, ancak güvenilirlik ve hata ayıklama kolaylığındaki artış DAHA FAZLASI. Açıkçası, PASCAL'ın güçlü tip kontrolünün İYİ bir şey olduğunu buldular. (Ve evet, diziler yapıyorlardı.)
John R. Strohm

Yanıtlar:


41

Hemen hemen herkes kutsama diyecektir:

verim!

Bu bir parçası; deterministik kaynak kullanımı, sınırlı kaynaklara sahip cihazlarda başlamak için önemlidir, ancak başka nedenler de vardır.

  1. Düşük seviye donanım API'lerine doğrudan erişim.
  2. Bu cihazların büyük çoğunluğu için bir C derleyicisi bulabilirsiniz. Bu benim tecrübelerimdeki herhangi bir üst düzey dil için geçerli değil.
  3. C (çalışma zamanı ve oluşturulan yürütülebilir dosya) "küçük". Kodun çalışması için sisteme bir sürü şey yüklemeniz gerekmez.
  4. Donanım API / sürücüleri muhtemelen C veya C ++ ile yazılacaktır.

14
+1 Derleyicilerin kullanılabilirliği. Mecliste her şeyi yazarken, ilk nesil derleyiciler tanrısal bir göndermeydi.
Christopher Bibbs

8
+1, bence deterministik kaynak kullanımı en önemli nedenler arasında. Bulaşık makinesinde her türlü süslü çöp toplama işlemini yapmak için çok fazla belleğiniz yok.
user281377

4
+1, "deterministik kaynak kullanımı" için de geçerlidir. Birçok gömülü sistemde, bu gereksinim dinamik bellek ayırma kullanımını bile engeller. Diğer birçok dil, dinamik bellek ayırmaya büyük ölçüde güvenir (C ++ 'nın birçok yararlı yönü bile dinamik belleğe ihtiyaç duyar).
Michael Burr

2
Bir mermi noktası daha ekleyeceğim, bu da teknik nedenlerden ziyade sosyal bir neden olarak ortaya çıkıyor - gömülü yazılım geliştiricilerinin diğer geliştiricilere göre değişime karşı çok daha muhafazakar ve değişime dirençli olduğunu düşünüyorum. Bakış açınıza bağlı olarak, bu iyi ya da kötü bir şey olabilir.
Michael Burr

1
Bir sistem adamı olarak konuşurken, ben büyük soyutlamaların temkinliyim. Çalışmayı bırakana veya komik bir şey yapana kadar harikalar, bu durumda hata ayıklamak büyük bir baş ağrısı olabilir. Bu düşük seviyeli bir sistemde istediğim bir şey değil.
Ed

18

C, bir CPU modellemek için tasarlanmıştır, çünkü C, sadece montaj dilini yazmak yerine Unix'i platformlar arasında taşınabilir hale getirmek için yaratılmıştır.

Bu, C programlarının, gerçek CPU'ya çok yakın bir soyutlama düzeyine sahip olması gereken programlar için bir programlama dili olarak iyi çalıştığı anlamına gelir, bu da gömülü donanım için geçerlidir.

Not: C 1970 civarında tasarlandı ve CPU'lar o zaman daha basitti.


3
1: Bu kesinlikle sebep. Belki insanlar modern işlemcilerin özelliklerini yakalayan daha yeni üst düzey diller tasarlamaya çalıştılar, ancak kimse yakalanan bir dil tasarlamadı.
Ken Bloom

2
@vines, C, büyük bir çalışma zamanı kitaplığına sahip küçük bir dildir. Tüm bunlar çalışma zamanı kitaplığında yapılabilir. Standart C kitaplığına otomatik olarak taşınmaz, bu nedenle platforma özgüdür.

3
+1. C, en fazla 64 bitlik 18 bitlik kelimelere sahip bir PDP-7 için oluşturuldu ve başlangıçta kullanıldı. Daha birçok "modern" dil, bu tür alanlara uymakta daha fazla zorluk çekmektedir. Özellikle Unix gibi bir işletim sistemi yazmak için.
greyfade

2
@greyfade: öyle değil. UNIX PDP-7'den kaynaklandı, ancak C vermedi. Önsözden C Programlama Dili'ne alıntı yapmak için : "C, Dennis PDitch-11'deki UNIX işletim sistemi için Dennis Ritchie tarafından tasarlandı ve uygulandı."
Jerry Coffin

1
@vines: dilde (cf, Eşzamanlı C) diş çekme için doğrudan destek düşünmek kesinlikle makul olsa da, bir önbelleğin önemli bir kısmı, programcı veya dilin herhangi bir müdahalesi olmadan işleri daha hızlı hale getirmesidir .
Jerry Coffin

11

Hakimiyetin bir nedeni, görev için doğru araçlara sahip olmasıdır. Hem Java hem de C / C ++ 'da gömülü platformlarda geliştirdikten sonra, C ++' ın kemik yaklaşımının çıplaklığının daha doğal olduğunu söyleyebilirim. Geliştiriciyi, dilin çok yüksek düzeyde olması nedeniyle çemberlerden atladığını hissetmekten kurtarmak oldukça sinir bozucu bir şeydir. Buna iyi bir örnek, Java'da imzasız değişkenlerin olmamasıdır.

Ve VM / yorumlanmış dillerin kullanışlı özellikleri genellikle uygun değildir ve uygulama dışında bırakılır, örneğin Çöp toplama.


3
"Hem Java hem de C / C ++" - Umarım "her üçünü de kastediyorsunuzdur: Java C ve C ++", çünkü C ve C ++ farklı dillerdir.
BЈовић

1
@ BЈовић: Evet, üçünü kastettiğimi doğrulamak için yıllar sonra cevap vermek. Bu tanımı takip ederek her ikisini de kullanıyordum: "iki veya daha fazla şeyin her birinin dahil edilmesini belirtmek ve vurgulamak için bir işlev kelimesi olarak kullanıldı" (iki veya daha fazla şey) :-)
celebdor

10

C, kendi başına çok az çalışma zamanı desteği gerektirir, bu nedenle ek yük çok daha düşüktür. Çalışma zamanı desteğine bellek veya depolama alanı harcamaz, bu desteği en aza indirmek için zaman / çaba harcamazsınız veya projenizin tasarımında buna izin vermek zorunda değilsiniz.


1
Bu işlevselliğe ihtiyaç duymanız ve kendiniz yeniden icat etmeniz gerçekten gerçekleşmez mi? Örneğin, switches ile inşa edilen büyük durum makineleri korkunçtur ve sınıf hiyerarşileri ile inşa edilen aynı makineler güzel ve bakımı kolaydır.
vines

1
@vines - normalde tanımlı bir girdi kümeniz vardır, anahtar üzerinde yerleşik durum makineleri / merdivenler, sahnelerin polimorfik çağrılarının ardındaki büyü heiracrchy'sinden daha açık ve daha belgelendirilebilir ise.
Martin Beckett

2
@Martin: OO geliştirmede biraz tecrübesi olan birine, polimorfik çağrılar ne "sihirli" ne de "sahne arkasında" değildir ve büyük anahtar / if ifadelerinin daha açık ve daha belgelendirilebilir olduğu fikri garip görünüyor.
Michael Borgwardt

3
Pin27 yükseldiğinde ne olduğunu bulun. Seçenek 1, "case PIN27:" için arama yapın Seçenek 2, çalışma zamanında 27 pinine atanan bir PIN nesneleri için hangisinin çağrıldığını keşfetmek için bir yineleyicileri bir harita üzerinde izleyin. OO kodunun birçoğu ile ilgili sorun, onu okumanın tek yolunun onu çalıştırmaktır. Çalışma zamanı hata ayıklaması olmayan bir platformda veya kodun kağıt üzerinde veya kafanızda izlenmesi anlamına gelen bir konsolda.
Martin Beckett

2
Bu tartışmaya biraz teğet, merdiven mantığının (daha da ilkel bir versiyonu, switchsöyleyebiliriz) hala birçok gömülü uygulamada kullanılmasının bir nedeni var . Hata ayıklaması daha kolay, doğrulaması daha kolay.
geekosaur

9

Diğer cevaplarda belirtildiği gibi, C, 1970'lerin başında, bir mini bilgisayar mimarisindeki montaj dilini değiştirmek için geliştirildi. O zamanlar, bu bilgisayarlar genellikle bellek ve çevre birimleri de dahil olmak üzere on binlerce dolara mal oldu.

Günümüzde, dahili RAM ve G / Ç denetleyicileri de dahil olmak üzere, tek bir miktarda dört dolar veya daha az olan 16 bitlik bir yerleşik mikro denetleyici ile aynı veya daha fazla bilgisayar gücünü elde edebilirsiniz. 32 bitlik bir mikrodenetleyici maliyeti bir veya iki dolar daha olabilir.

Bu küçük adamları programlarken, oturdukları panoları tasarlamadığım zamanların% 90'ında yaptığım şey, işlemcinin ne yapacağını görselleştirmek istiyorum. Montajcıda yeterince hızlı programlayabilseydim, yapardım.

Her türlü soyutlama katmanını istemiyorum. Genellikle ekranda bir dağıtıcı listesine geçerek hata ayıklarım. Başlamak için programı C dilinde yazdığınızda bunu yapmak çok daha kolay.


1
Bazı yerleşik uygulamalar için bu "dolar veya iki tane daha" çok önemlidir. Kimse arabalarındaki fiyat etkisini fark etmeyecek, ancak termostatları veya CD çalarları üzerinde fark edecekler.
David Thornley

3
@David Thornley, evet, tamamen katılıyorum, bu yüzden şu anda farklı müşteriler için aynı anda 8, 16 ve 32 bit mikronlarla projelerim var. (Güç tüketimi, daha küçük cihazlarla gitmenin bir başka nedenidir.)
tcrosley 17:11

1
Fiyat, işlemci maliyetiyle pim sayısından daha az belirlenir. Tahtalar yongalardan çok daha pahalıdır.
Yttrill

7

Derleyiciler geliştikçe ve donanım performansı arttıkça C ++ giderek daha fazla kullanıldığından tamamen hakim değildir. Ancak C birkaç nedenden dolayı hala çok popüler;

  1. Geniş destek. Hemen hemen her çip satıcısı ac derleyici sağlar ve herhangi bir örnek kod ve sürücüler muhtemelen c ile yazılır. C ++ derleyicileri gittikçe yaygınlaşmaktadır, ancak belirli bir yonga için ölü bir sertifika değildir ve çoğu zaman rahatsızlık vericidir. Ayrıca, herhangi bir gömülü mühendisin c. Endüstrinin lingua franca'sı.

  2. Verim. Evet, dedin. Performans hala kraldır ve çekirdek rutinlerinin hala montajcıda yazıldığı veya en azından c, montaj çıktısına referansla optimize edildiği bir ortamda, bunun önemini asla hafife almaz. Genellikle gömülü hedefler çok düşük maliyetli olacak ve çok küçük anılar ve birkaç mips olacak.

  3. Boyut. C ++ daha büyük olma eğilimindedir. Kesinlikle STL kullanan her şey daha büyük olacaktır. Genellikle hem program boyutu hem de bellek alanı açısından.

  4. Muhafazakarlık. Çok muhafazakar bir endüstri. Kısmen arıza maliyetleri genellikle daha yüksek olduğu ve hata ayıklamaya genellikle daha az erişilebilir olduğu için, kısmen değiştirilmesi gerekmediği için. Küçük bir gömülü proje için işi iyi yapar.


11
Bakın, C ++ ile ilgili en yaygın efsanelerden biri gibi görünen # 3. C'de 5 farklı tip için güvenli bir konteyner yazın, 5 farklı tipte tek bir STL konteyneri kullanmak kadar en az "şişkinliğe" neden olursunuz. C programcıları opak tiplerde kaplar yazarak bu sorunu çözerler (void *). THAT ile bir STL şablonunun karşılaştırılması bir kategori hatasıdır. Yine de C'yi tercih etmenin en yaygın "nedenlerinden biri" olduğunu kabul etmeliyim
Edward Strange

Ben tamamen c işlevselliği çoğaltmak için c ++ ile aynı ayak izi ile sonuçlanan katılıyorum. C'nin avantajı, seçici olmanıza izin vermesidir. Herhangi bir önemli projede c ++ kullanmayı tercih ederim, ancak bazen hedef donanım pratik olmayan bir nokta ile sınırlıdır. # 1 dedikten sonra benim deneyim gerçekten ana nedenidir.
Luke Graham

6

Gömülü sistemler için en önemli şey performanstır . Ama dediğin gibi, neden başka bir performans dili değil C?

Şimdiye kadar birçok insan derleyicilerin kullanılabilirliğinden bahsetti , ancak hiç kimse geliştiricilerin kullanılabilirliğinden bahsetmedi . Pek çok geliştirici C'yi zaten OCaml'den daha iyi biliyor.

Bunlar üç büyük.


6

Gömülü yazılım çok farklı.

Bir masaüstü uygulamasında, soyutlamalar ve kütüphaneler size çok fazla geliştirme süresi kazandırır. Bir soruna başka bir çift megabayt veya gigabayt RAM veya bazı 2 + GHz 64 bit CPU çekirdeği atma lüksüne sahipsiniz ve başka biri (kullanıcılar) bu donanım için ödeme yapıyor. Uygulamanın hangi sistemlerde çalışacağını bilemeyebilirsiniz.

Gömülü bir projede kaynaklar genellikle çok sınırlıdır. Çalıştığım bir projede (PIC 17X serisi işlemciler) donanımın 2Kwords program belleği, 8 seviye (donanım içi) yığını ve 192 bayt (<0.2kB) RAM vardı. Farklı G / Ç pinleri farklı özelliklere sahipti ve donanımı, donanım kayıtlarına yazarak gerektiği gibi yapılandırdınız. Hata ayıklama bir osiloskop ve mantık analizörü içerir.

Gömülü olarak, soyutlamalar çoğu zaman engel olur ve sahip olmadığınız kaynakları yönetir (ve maliyetlendirir). Örneğin, çoğu gömülü sistemde dosya sistemi yoktur. Mikrodalga fırınlar gömülü sistemlerdir. Araba motor kontrolörleri. Bazı elektrikli diş fırçaları. Bazı gürültü önleyici kulaklıklar.

Gömülü sistemler geliştirmede benim için çok önemli bir faktör, kodun talimatlar, kaynaklar, bellek ve yürütme süresi açısından ne anlama geldiğini bilmek ve kontrol etmektir. Genellikle talimatlar dizisinin tam sırası, örneğin donanım arabirimi dalga formları için zamanlama.

Soyutlamalar ve sahne arkası 'büyü' (örneğin bir çöp toplayıcı) masaüstü uygulamaları için mükemmeldir. Çöp toplayıcılar, bellek dinamik olarak ayrılabiliyorsa, bellek sızıntılarını takip etmek için size çok fazla zaman kazandırır.

Bununla birlikte, gerçek zamanlı gömülü dünyada, şeylerin ne kadar uzun sürdüğünü, bazen nanosaniyeye kadar düştüğünü bilmemiz ve kontrol etmemiz gerekir ve bir başka çift meg RAM veya daha hızlı bir CPU'yu bir soruna atamayız. Basit bir örnek: görev döngüsünü kontrol ederek LED'lerin yazılım karartma yaparken (CPU sadece LED'lerin açma / kapama kontrolüne sahipti), işlemcinin sönmesi ve örneğin 100 ms boyunca çöp toplama işlemi yapması TAMAM değildir. parlak yanıp sönüyor veya dışarı çıkıyor.

Daha varsayımsal bir örnek, bujileri doğrudan ateşleyen bir motor kontrolörüdür. Bu CPU kapanır ve 50ms boyunca çöp toplama yaparsa, motor bir an için keser veya yanlış krank mili konumunda ateş eder, motoru potansiyel olarak durdurur (geçerken?) Veya mekanik olarak zarar verir. Birini öldürebilirsin.


Bu, C ile alakasız olduğu kadar doğrudur - bahsettiğiniz sorun sadece GC'nin davranışıdır ... C ++ 'ın herhangi bir GC'si yoktur ve ne olduğunu biliyor musunuz? Şahsen satır yorumları ve daha katı tip güvenlik =) nedeniyle kullanıyorum
sarmaşıklar
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.