Apakah mungkin untuk menulis kode dalam C ++ untuk mikrokontroler PIC di masa depan?


8

Apakah mungkin menggunakan C ++ untuk mengkode PIC? Apakah ada batasan perangkat keras yang menghalangi kita untuk menggunakan C ++? Berapa ukuran file .hex yang dihasilkan dan waktu menjalankan program meningkat ketika kita menggunakan C ++, bukan C? Apakah mungkin untuk menggunakan C ++ untuk PIC saat ini? Apakah ada rencana masa depan atau pengembangan yang sedang berlangsung tentang ini?


Saya pikir itu mungkin dan akan tetap mungkin, tetapi AFAIK tidak direkomendasikan karena mengimplementasikan struktur dan fungsi tingkat tinggi yang tidak cocok untuk pemrograman yang sangat terkait dengan perangkat keras
clabacchio


2
Karena jawabannya adalah "Ya, sudah ada kompiler C ++ yang sudah ada", saya akan membiarkan yang satu ini berdiri, tetapi di masa depan Anda harus sadar bahwa pertanyaan Stack Exchange harus tentang fakta yang dapat diverifikasi, bukan dugaan tentang masa depan.
Kevin Vermeer

2
@clabacchio: Belum tentu benar. Di C ++, Anda membayar hanya untuk apa yang Anda gunakan. Lihat jawaban saya di: electronics.stackexchange.com/questions/3027/…
Rocketmagnet

"PICs" adalah generalisasi yang tidak berguna. Pada beberapa PIC low-end (pikirkan 10F200) C hampir mustahil untuk digunakan. Pada beberapa PIC kelas atas (seri 32MX) C ++ dikabarkan akan digunakan saat ini, dan tentu saja tidak ada alasan teknis mengapa tidak bisa. Jadi beberapa fokus yang lebih baik mungkin memberikan jawaban yang lebih bisa digunakan, saat ini semua orang pada dasarnya menjawab pertanyaan yang berbeda.
Wouter van Ooijen

Jawaban:


17

Apakah mungkin menggunakan C ++ untuk mengkode PIC?

Ya, itu mungkin sekarang. Untuk dsPIC, ada IAR Systems C ++ Compiler (meskipun sangat lama dan tidak didukung).

Pilihan lain adalah menggunakan konverter C ++ ke C. Menggunakan langkah pre-build, konversikan C ++ ke C, lalu berikan C (nasty looking) ke kompiler C normal Anda. Lihatlah LLVM atau kompiler C ++ Comeau yang keduanya melakukan itu. Comeau hanya $ 50, tetapi mungkin perlu upaya untuk membuat seluruh rantai alat dan perpustakaan berfungsi dengan baik.

Apakah ada batasan perangkat keras yang menghalangi kita untuk menggunakan C ++?

Jawaban singkat, tidak, tidak ada batasan perangkat keras. Jawaban panjangnya, C ++ tentu mendorong penggunaan heap dan / atau stack, yang mana MCU kecil dengan RAM terbatas akan kesulitan.

Mengapa mereka berjuang dengan tumpukan / tumpukan? Karena dua alasan: A) banyak MCU memiliki RAM terbatas, tidak cukup untuk tumpukan, dan hampir tidak cukup untuk tumpukan. B) banyak MCU tidak menangani pointer dengan baik, jadi penggunaan variabel pada stack benar-benar membunuh kinerja.

Ketika orang bertanya tentang menggunakan C ++ pada MCU, saya merasa konstruktif untuk membandingkan C ++ ke C. Pertanyaan yang sama persis adalah (dan masih) ditanyakan tentang C pada MCU. Orang-orang terbiasa menolak ide itu. Bahasa tingkat tinggi, pada 256 byte RAM MCU ?? Mustahil. Tapi sekarang kita semua tahu itu mungkin. Saya telah menulis C untuk PIC12. Tidak masalah. Itu mungkin karena A) pengembang perangkat lunak tahu bahwa mereka harus sedikit berhati-hati: jangan gunakan malloc () dll dan B) kompiler telah ditulis khusus untuk MCU. Kompiler juga akan ekstra hati-hati dengan alokasi memori, ia tidak akan mencoba membuat tumpukan dan mungkin tidak membuat tumpukan. Beberapa kompiler C tidak akan membiarkan Anda menulis kode re-entrant (recursive) yang benar-benar membutuhkan stack.

Mengetahui bahwa mungkin untuk menulis C untuk MCU, jawaban yang sama berlaku untuk pertanyaan menulis C ++ pada MCU. Selama kompiler memahami keterbatasan perangkat target, dan pengguna juga memahami bahasa, tidak ada masalah. Di C ++, Anda hanya membayar apa yang Anda gunakan. Sangat mungkin untuk menulis C ++ (dengan objek dan semuanya) yang menghasilkan output asm tepat yang akan Anda dapatkan jika Anda menggunakan C.

Sekarang, PIC32s tentu dapat mengatasi C ++. Mereka memiliki hingga 64kB RAM, dan didasarkan pada inti MIPS, yang merupakan prosesor 32-bit yang tumbuh dengan baik. Itu dapat menangani pointer dan tumpukan serta PC. Memang, ada PC berdasarkan MIPS (atau setidaknya, dulu).

Sayangnya, ada begitu banyak kesalahpahaman seputar C ++. Bahkan coders yang sangat berpengalaman tampaknya tidak tahu bagaimana bahasa itu bekerja. Lihat jawaban saya tentang mengapa C ++ cocok untuk CPU yang disematkan.

Berapa ukuran file .hex yang dihasilkan dan waktu menjalankan program meningkat ketika kita menggunakan C ++, bukan C?

Seperti yang saya katakan, mungkin tidak ada perbedaan. Bjarne Stroustrup melakukan perbandingan sekelompok kompiler C / C ++ untuk membandingkan waktu dan kinerja ruang untuk sejumlah operasi. Hasilnya sangat bervariasi. Dalam beberapa kasus, C ++ keluar lebih lambat dan lebih besar, beberapa kasus lebih lambat dan lebih kecil, atau lebih cepat dan lebih besar, dan bahkan lebih cepat dan lebih kecil! Jadi, jawaban untuk pertanyaan Anda adalah bahwa hal itu sangat tergantung pada kompiler, tetapi secara umum, tidak perlu membuat perbedaan sama sekali. Untuk lebih detail, lihat Laporan Teknis tentang Kinerja C ++

Apakah ada rencana masa depan atau pengembangan yang sedang berlangsung tentang ini?

Itu saya tidak tahu. Saya tahu bahwa kompiler Microchip C32 bersumber terbuka, dan Anda dapat mengunduh sumbernya. Saya juga tahu bahwa seseorang yang bekerja dengan saya benar-benar menemukan beberapa instruksi online dan berhasil mendapatkan kompiler untuk mengkompilasi kode C ++. Tetapi dia meninggalkan perusahaan sebelum dia dapat mengatur saya dengan rantai alat yang tepat.


MEMPERBARUI

Microchip sekarang memiliki kompiler C ++ yang tersedia untuk rentang MCU tertanam PIC32.



dari halaman web IAR: "Produk lawas: IAR Embedded Workbench untuk dsPIC adalah produk lawas. Sistem IAR tidak memperbaruinya dan tidak mungkin membeli Perjanjian Dukungan dan Pembaruan untuk itu."
Jason S

Saya tahu produk IAR bagus, tapi sayangnya sangat mahal dan sepertinya 'tua'. Saya tahu C ++ layak pada platform apa pun asalkan Anda tidak menggunakan semua fitur. Namun, itu menambahkan kemungkinan untuk lapisan tambahan abstraksi dengan kelas. Saya tidak sering menggunakan template, saya juga tidak menggunakan alokasi memori dinamis. Apakah ada yang kebetulan mengetahui pesaing lain untuk C ++ pada PIC24 / PIC32?
Hans

Ya, maaf, itu bukan temuan yang bagus. Biarkan saya menambahkan beberapa hal lagi ke jawaban saya.
Rocketmagnet

1
Saya akan mempertimbangkan C pesaing untuk C ++ pada mikrokontroler. Saya tidak dapat memikirkan apa pun yang ingin saya lakukan di C ++ yang tidak dapat saya lakukan di C dan ada lebih sedikit panggilan fungsi yang tidak terlihat (konstruktor, destruktor, dll). Membuat kode lebih deterministik dan polos. Fitur-fitur apa dari C ++ yang harus dimiliki yang tidak dapat diatasi dengan C?
AngryEE

1
Orang bisa bertanya: "Fitur C apa yang harus dimiliki yang tidak dapat diuraikan dalam ASM?" Jawab, "Tidak ada". Keuntungannya adalah peningkatan kemampuan bagi desainer untuk menentukan desain, dan meminta kompiler memeriksa implementasinya dengan benar. Lihat jawaban saya electronics.stackexchange.com/questions/3027/… untuk daftar manfaat nyata dan langsung dari C ++ dalam hal ini.
Rocketmagnet

5

Berapa ukuran file .hex yang dihasilkan dan waktu menjalankan program meningkat ketika kita menggunakan C ++, bukan C?

Tergantung fitur apa yang Anda gunakan. Jika Anda menggunakan fitur berorientasi objek inti (kelas + metode), kemungkinan memiliki efek yang sangat kecil (variabel variabel / nama fungsi lebih lama sehingga tabel simbol kemungkinan akan sedikit meningkat). Template juga tidak boleh menambahkan banyak dengan kompiler yang baik.

Jika Anda benar-benar gila dan melakukan hal-hal seperti Perpustakaan Template Standar, dan menggunakan alokasi dan pengecualian memori dinamis, maka Anda kemungkinan akan mengalami kode mengasapi.


Justing peringatan untuk OP, sangat berhati-hati tentang alokasi memori pada arsitektur memori kecil dan tertanam selalu menjalankan sistem.
kenny

mungkinkah "-1" er mengomentari mengapa dia tidak setuju?
Jason S

Saya bukan -1er tetapi templat adalah fitur yang harus digunakan dengan sangat hati-hati untuk menghindari kode gembung. Anda dapat dengan mudah berakhir dengan banyak salinan dari suatu algoritma ketika satu sudah cukup.
Peter Green

Untuk melakukan itu Anda benar-benar harus menggunakan templat dengan beberapa tipe data yang berbeda, dan satu salinan TIDAK AKAN mencukupi kecuali Anda menggunakan kode polimorfik yang memiliki kelas dasar umum. (Dalam hal ini ada biaya runtime.) Template tidak secara ajaib menyebabkan kode Anda membengkak, mereka hanya menyebabkan kode membengkak ketika Anda menggunakannya dengan beberapa tipe data ketika Anda tidak mengetahui konsekuensinya.
Jason S


1

Agak menggeneralisasi pertanyaan Anda, ada prosesor ARM yang dibuat untuk pasar tertanam yang berisi MMU (unit manajemen memori). Ukuran dan alokasi memori membuat bahasa seperti java dan c ++ pilihan yang disematkan buruk. Seiring prosesor yang tertanam terus menjadi lebih cepat dan lebih kuat, dan karena memori menjadi lebih padat dan lebih murah, pilihan bahasa yang tersedia untuk insinyur yang disematkan berubah secara dramatis. Prosesor ARM 32-bit 600MHz dengan MMU dan kartu Flash 64G adalah kandidat yang bagus untuk aplikasi c ++. Apakah itu sesuai dengan definisi prosesor tertanam klasik adalah masalah lain.


0

Mungkin ya .. tetapi Anda tidak seharusnya tetap ... C adalah bahasa yang disematkan dan tidak ada keuntungan menggunakan C ++. Atau lebih tepatnya, keunggulan C jauh melebihi keunggulan C ++ untuk disematkan. Jangan buang waktu Anda.

  • jika Anda tahu cara menggunakan pointer fungsi dll. Anda dapat kode seperti C ++, tidak ada masalah di sana.

5
Saya mohon untuk berbeda. Anda dapat menggunakan banyak fitur C ++ (kelas, templat, overloading operator, referensi) dengan sedikit biaya runtime. Ya, Anda dapat melakukan semua hal ini dalam C sederhana dengan konstruksi retas, tapi itu hambatan pada otak Anda, dan saya lebih suka menggunakan C ++. (tentu saja saya lebih suka menggunakan bahasa yang lebih baik, tapi saya akan memilih kompiler C ++ dalam detak jantung di atas C.)
Jason S

1
Classes = structs (tanpa metode bawaan, tetapi jika Anda suka, Anda dapat menyimpan pointer fungsi di struct dan menyebutnya). Template = Anda menggunakannya ??? Kelebihan operator = ya saya juga ingin itu. Referensi = petunjuk, bukan? Dengan C setidaknya Anda bisa menggunakan hanya 'fitur' dari C ++ yang Anda inginkan tanpa khawatir tentang kelebihan pembuatan kode atau harus menyertakan pustaka besar acak hanya untuk mendapatkan sesuatu untuk dikompilasi.
AngryEE

1
Saya juga mohon berbeda.
Rocketmagnet

3
Ya, templat adalah cara yang sangat ampuh untuk menghasilkan kode kinerja yang andal dan tinggi. Referensi adalah pointer yang lebih andal. Dengan C ++ Anda juga hanya membayar untuk fitur yang Anda gunakan. Saya pikir Anda benar-benar perlu memahami C ++ lebih.
Rocketmagnet

3
Saya tidak tahu apa yang Anda maksud dengan "C adalah bahasa yang tertanam". Tentu, ini sangat populer. Apakah Anda mengatakan bahwa itu adalah bahasa terbaik? Tentunya tidak.
Rocketmagnet
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.