Gelecekte PIC mikrodenetleyicileri için C ++ 'da kod yazmak mümkün olacak mı?


8

PIC'leri kodlamak için C ++ kullanmak hiç mümkün olacak mı? C ++ kullanmamızı engelleyen herhangi bir donanım sınırlaması var mı? C yerine C ++ kullandığımızda, oluşturulan .hex dosyasının boyutu ve programın çalışma süresi ne kadar artar? Mevcut PIC'ler için C ++ kullanmak pratik olarak mümkün müdür? Bu konuda gelecek planları veya sürekli bir gelişme var mı?


Bence bu mümkün ve mümkün kalacak, ancak AFAIK, güçlü bir şekilde donanım ile ilgili programlama için uygun olmayan yüksek seviyeli yapıları ve işlevleri uyguladığı için
önerilmiyor


2
Cevap "Evet, zaten var olan C ++ derleyicileri var" olduğundan, buna izin vereceğim, ancak gelecekte Stack Exchange sorularının gelecek hakkında varsayımlar değil doğrulanabilir gerçekler hakkında olması gerektiğini bilmelisiniz.
Kevin Vermeer

2
@clabacchio: Mutlaka doğru değil. C ++ ile yalnızca kullandığınız kadar ödersiniz. Cevabımı
şurada

"PICs" işe yaramaz bir genellemedir. Bazı düşük uçlu PIC'lerde (bence 10F200) C'nin kullanımı neredeyse imkansızdır. Bazı üst düzey PIC'lerde (32MX serisi) C ++ 'nın şu anda kullanıldığına dair söylentiler var ve kesinlikle kullanamamasının teknik bir nedeni yok. Bu yüzden biraz daha iyi odaklanma daha kullanışlı bir cevap verebilir, şu anda herkes farklı bir soruyu cevaplıyor.
Wouter van Ooijen

Yanıtlar:


17

PIC'leri kodlamak için C ++ kullanmak hiç mümkün olacak mı?

Evet, şimdi mümkün. DsPIC için, IAR Systems C ++ Derleyici vardır (çok eski ve desteklenmemesine rağmen).

Başka bir seçenek de C ++ 'dan C'ye dönüştürücü kullanmaktır. Bir ön derleme adımı kullanarak, C ++ 'yi C'ye dönüştürün, sonra (kötü görünümlü) C'yi normal C derleyicinize verin. Her ikisini de yapan LLVM veya Comeau'nun C ++ derleyicisine bir göz atın . Comeau's sadece 50 $ 'dır, ancak tüm araç zincirinin ve kütüphanelerin düzgün çalışması için biraz çaba harcayacaktır.

C ++ kullanmamızı engelleyen herhangi bir donanım sınırlaması var mı?

Kısa cevap, hayır, donanım sınırlaması yoktur. Uzun cevap, C ++ kesinlikle sınırlı RAM'e sahip daha küçük MCU'ların mücadele edeceği bir yığın ve / veya yığın kullanımını teşvik eder.

Neden bir yığın / yığınla mücadele ediyorlar? İki nedenden dolayı: A) birçok MCU'nun sınırlı bir RAM'i vardır, kesinlikle bir yığın için yeterli değildir ve bir yığın için zar zor yeterlidir. B) birçok MCU, işaretçileri iyi işlemez, bu nedenle yığıntaki değişkenlerin kullanımı gerçekten performansı öldürür.

İnsanlar bir MCU üzerinde C ++ kullanma hakkında sorduklarında, C ++ ile C'yi karşılaştırmak için yapıcı buluyorum. İnsanlar bu fikre karşı koyarlardı. 256 bayt RAM MCU üzerinde üst düzey bir dil ?? İmkansız. Ama şimdi hepimiz mümkün olduğunu biliyoruz. PIC12 için C yazdım. Sorun değil. A) yazılım geliştiricileri biraz dikkatli olmaları gerektiğini biliyorlar: malloc () vb. Kullanmayın ve B) derleyici özellikle MCU için yazılmıştır. Derleyici ayrıca bellek ayırma konusunda da çok dikkatli olacaktır, bir yığın oluşturmaya çalışmaz ve bir yığın oluşturmayabilir. Bazı C derleyicileri, kesinlikle bir yığın gerektiren yeniden giriş (özyinelemeli) kod yazmanıza izin vermez.

Bir MCU için C yazmanın mümkün olduğunu bilerek, aynı cevaplar bir MCU'ya C ++ yazma sorusu için de geçerlidir. Derleyici hedef cihazın sınırlamalarını ve kullanıcı dili de anladığı sürece, gerçekten sorun yoktur. C ++ ile yalnızca kullandığınız kadar ödersiniz. C'yi kullanırsanız sahip olacağınız asm çıkışını üreten C ++ (nesneler ve her şeyle) yazmak mükemmel bir şekilde mümkündür.

Şimdi, PIC32'ler kesinlikle C ++ ile başa çıkabilir. 64kB'a kadar RAM'e sahiptirler ve düzgün bir şekilde büyütülmüş 32 bit işlemci olan MIPS çekirdeğine dayanırlar. İşaretçiler, bir yığın ve bir PC ile başa çıkabilir. Gerçekten de, MIPS (veya en azından eskiden) tabanlı PC'ler var.

Ne yazık ki, C ++ ile ilgili çok fazla yanlış anlama var. Çok deneyimli kodlayıcıların bile dilin nasıl çalıştığı hakkında hiçbir fikri yoktur. C ++ 'ın gömülü CPU'lara neden uygun olduğuna dair cevabımı görün .

C yerine C ++ kullandığımızda, oluşturulan .hex dosyasının boyutu ve programın çalışma süresi ne kadar artar?

Dediğim gibi, bir fark olmayabilir. Bjarne Stroustrup, bir dizi işlem için zaman ve alan performansını karşılaştırmak için bir grup C / C ++ derleyicisini karşılaştırdı. Sonuçlar büyük farklılıklar gösterdi. Bazı durumlarda, C ++ daha yavaş ve daha büyük, bazı durumlarda daha yavaş ve daha küçük veya daha hızlı ve daha büyük ve daha hızlı ve daha küçük çıktı! Bu nedenle, sorunuzun cevabı, derleyiciye büyük ölçüde bağlı olduğu, ancak genel olarak, hiçbir fark yaratmaya ihtiyaç duymamasıdır. Daha fazla ayrıntı için, C ++ Performansıyla İlgili Teknik Rapor'a bakın

Bu konuda gelecek planları veya sürekli bir gelişme var mı?

Bilmiyorum. Microchip C32 derleyicisinin açık kaynaklı olduğunu biliyorum ve kaynağı indirebilirsiniz. Ayrıca çalıştığım birisinin aslında bazı talimatları çevrimiçi bulduğunu ve derleyiciyi C ++ kodunu derlemesini sağladığını biliyorum. Ama beni uygun bir alet zinciri ile kurmadan önce şirketten ayrıldı.


GÜNCELLEME

Microchip artık PIC32 gömülü MCU'ları için bir C ++ derleyicisine sahiptir .



IAR web sayfasından: "Eski ürün: dsPIC için IAR Gömülü Çalışma Tezgahı eski bir üründür. IAR Systems bunu güncellemez ve bunun için bir Destek ve Güncelleme Sözleşmesi satın almak mümkün değildir."
Jason S

IAR ürünlerinin harika olduğunu biliyorum, ama ne yazık ki çok pahalı ve 'eski' görünüyor. Tüm özellikleri kullanmadığınız sürece C ++ 'ın herhangi bir platformda uygulanabilir olduğunu biliyorum. Bununla birlikte, sınıflarla ekstra bir soyutlama katmanı olasılığı ekler. Sık şablon kullanmıyorum, dinamik bellek ayırma da kullanmıyorum. Herkes PIC24 / PIC32 üzerinde C ++ için başka bir rakip biliyor mu?
Hans

Evet, özür dilerim, gerçekten harika bir keşif değildi. Cevabıma biraz daha şey ekleyeyim.
Rocketmagnet

1
C bir mikrodenetleyici C ++ için bir rakip düşünün. C + 'da yapmak istemiyorum bir şey düşünemiyorum C yapamam ve daha az görünmez işlev çağrıları (yapıcılar, yıkıcılar, vb) vardır. Kodu daha belirleyici ve açık hale getirir. C ++ ile karıştırılamayan hangi C ++ özellikleri gerekir?
AngryEE

1
Birisi şöyle sorabilir: "ASM'de karıştırılamayan C'nin hangi özellikleri olmalı?" Cevap, "Hiçbir şey". Faydaları, tasarımcının tasarımı belirtme yeteneğinin artması ve derleyicinin uygulamanın doğru olup olmadığını kontrol etmesini sağlar. Bu konuda C ++ 'ın gerçek ve anında faydalarının bir listesi için answer. electronics.stackexchange.com/questions/3027/… adresime bakın.
Rocketmagnet

5

C yerine C ++ kullandığımızda, oluşturulan .hex dosyasının boyutu ve programın çalışma süresi ne kadar artar?

Hangi özellikleri kullandığınıza bağlıdır. Temel nesne yönelimli özellikleri (sınıf + yöntemler) kullanırsanız, çok az etkisi olur (değişken değişken / işlev adları daha uzun olur, bu nedenle sembol tablosu muhtemelen biraz artar). Şablonlar da iyi bir derleyici ile fazla eklememelidir.

Her şeyi delirir ve Standart Şablon Kütüphanesi gibi şeyleri çekerseniz ve dinamik bellek ayırma ve istisnalar kullanırsanız, muhtemelen kod blokajı ile karşılaşırsınız.


OP için bir uyarı yapmak, küçük bellek mimarileri ve gömülü sürekli çalışan sistemlerde bellek ayırma konusunda çok dikkatli olun.
kenny

"-1" lütfen neden kabul etmediği hakkında yorum yapabilir mi?
Jason S

Ben -1er değilim ama şablonlar kod bloat önlemek için büyük bir özenle kullanılması gereken bir özelliktir. Bir algoritmanın yeterli olduğu zaman bir algoritmanın birçok kopyasına kolayca ulaşabilirsiniz.
Peter Green

Bunu yapmak için, aslında birkaç farklı veri türüyle şablonu kullanmanız gerekir ve ortak bir temel sınıfa sahip polimorfik kod kullanmadığınız sürece bir kopya yeterli DEĞİLDİR . (Bu durumda bir çalışma zamanı maliyeti vardır.) Şablonlar kodunuzun şişmesine neden olmaz, yalnızca sonuçların farkında olmadığınızda birden çok veri türüyle kullandığınızda şişirilmiş koda neden olurlar.
Jason S


1

Sorunuzu bir şekilde genelleştirerek, gömülü pazar için bir MMU (bellek yönetim birimi) içeren ARM işlemcileri var. Bellek boyutu ve tahsisi, java ve c ++ gibi gömülü seçimler gibi diller yarattı. Gömülü işlemciler daha hızlı ve daha güçlü hale gelmeye devam ettikçe ve bellek yoğunlaştıkça ve gömülü mühendislerin kullanabileceği dil seçenekleri önemli ölçüde değişir. MMU ve 64G Flash kartlı 32 bit 600MHz ARM işlemci, c ++ uygulamaları için mükemmel bir adaydır. Klasik gömülü işlemcinin tanımına uyup uymadığı başka bir sorundur.


0

Muhtemelen evet .. ama yine de yapmamalısınız ... C gömülü bir dildir ve C ++ kullanmanın hiçbir avantajı yoktur. Daha doğrusu, C'nin avantajları gömülü için C ++ avantajlarından daha ağır basar. Zamanını boşa harcama.

  • işlev işaretçileri vb. nasıl kullanılacağını biliyorsanız. C ++ gibi kodlama yapabilirsiniz, orada sorun yoktur.

5
Naçizane size katılmıyorum. C ++ 'ın birçok özelliğini (sınıflar, şablonlar, operatör aşırı yüklemesi, referanslar) çok az veya hiç çalışma süresi maliyeti olmadan kullanabilirsiniz. Evet, tüm bunları acayip yapılarla düz C'de yapabilirsiniz, ancak beyninizde bir sürükleme ve C ++ kullanmayı tercih ederim. (tabii ki daha iyi bir dil kullanmayı tercih ederim, ancak C düzlüğünün üzerinde bir kalp atışında bir C ++ derleyicisi seçerdim)
Jason S

1
Classes = structs (yerleşik yöntemler olmadan, ancak isterseniz, yapıya bir işlev işaretçisi depolayabilir ve bunu çağırabilirsiniz). Şablonlar = bunları kullanıyorsunuz ??? Operatör aşırı yüklenmesi = evet bunu da istiyorum. Referanslar = işaretçiler, hayır? C ile en azından aşırı kod üretimi hakkında endişelenmeden veya sadece derlemek için bir şey almak için rastgele büyük bir kütüphane eklemek zorunda kalmadan istediğiniz C ++ 'özelliklerini' kullanabilirsiniz.
AngryEE

1
Ben de farklı olmaya yalvarıyorum.
Rocketmagnet

3
Evet, şablonlar güvenilir ve yüksek performanslı kod oluşturmanın son derece güçlü bir yoludur. Referanslar daha güvenilir bir göstergedir. C ++ ile sadece kullandığınız özellikler için ödeme yaparsınız. Gerçekten C ++ 'ı daha iyi anlamanız gerektiğini düşünüyorum.
Rocketmagnet

3
"C gömülü dildir" derken ne demek istediğini bilmiyorum. Tabii, çok popüler. Mümkün olan en iyi dil olduğunu mu söylüyorsun? Kesinlikle hayır.
Rocketmagnet
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.