Apa kelebihan masing-masing bahasa saat menggunakan Arduino?
Saya pikir ini adalah pertanyaan umum yang bagus, tetapi saya akan menambahkan sedikit tentang mengapa saya bertanya apakah ada yang mau memberi saya tip.
Saya berpengalaman dalam bahasa yang telah diproses seperti JavaScript, PHP, dan telah mengutak-atik bahasa seperti Java dan Visual Basic. Dengan kata lain saya tahu teknik pemrograman dan orientasi objek prototypal baik klasik, tetapi tidak tentang berkomunikasi langsung dengan perangkat keras.
Saya membuat octocopter, dan saya berpikir bahwa pendekatan berorientasi objek akan menjadi yang paling mudah. (Perangkat lunak ini akan memiliki banyak fitur ...) Namun saya belum pernah menulis dalam bahasa C ++.
Karena ini adalah situs tanya jawab yang seharusnya membantu orang lain, hanya pertanyaan umum yang disajikan di awal yang sangat penting, tetapi saya menghargai komentar apa pun tentang situasi saya.
sumber
C++ vs. The Arduino Language?
- "Bahasa Arduino" adalah C ++. Ada sedikit preprocessing untuk menyelamatkan Anda melakukan prototipe fungsi, tetapi yang paling pasti adalah C ++.Jawaban:
Pengalaman pribadi saya sebagai profesor (pemrograman, mekatronik) adalah bahwa jika Anda memiliki pengalaman pemrograman sebelumnya dan Anda menyadari konsep sebagai OOP, lebih baik menggunakan C / C ++. Bahasa arduino sangat bagus untuk pemula, tetapi memiliki beberapa batasan (mis. Anda harus memiliki semua file Anda di folder yang sama). Dan ini pada dasarnya adalah penyederhanaan C / C ++ (Anda praktis bisa menyalin & menempelkan kode arduino ke file C / C ++, dan itu akan berfungsi). Juga masuk akal bahwa Anda dapat pergi dan menggunakan IDE lengkap yang terkenal sebagai gerhana:
http://playground.arduino.cc/Code/Eclipse
Awalnya diperlukan sedikit lebih banyak pengaturan dan konfigurasi lingkungan dev Anda, tetapi IMHO itu sangat berharga bagi para programmer dengan pengalaman dalam bahasa lain.
Bagaimanapun, itu tidak akan membahayakan Anda untuk mulai menggunakan bahasa arduino dan arduino IDE selama beberapa hari untuk membiasakan diri dengan perangkat keras arduino dan kemudian pindah ke C / C ++ dengan Eclipse untuk benar-benar mengembangkan proyek Anda.
sumber
Secara teori ...
Sebenarnya tidak ada bahasa Arduino. Ini benar-benar hanya C ++ dengan beberapa perpustakaan khusus domain. Ini menambah berbagai fitur, seperti fungsi yang dapat Anda panggil untuk mengontrol perangkat keras. Jika Anda tidak memiliki fungsi-fungsi itu, Anda perlu mengutak-atik register khusus untuk mengendalikan semuanya. Begitulah cara pemrograman tertanam biasanya dilakukan. Ini cepat, tetapi bisa sangat sulit untuk dipelajari dan dipahami.
Selain fungsi, perpustakaan menambahkan nama alternatif untuk beberapa jenis. Misalnya,
boolean
danbyte
tidak dalam standar C ++. Namun, mereka secara langsung setara denganbool
danunsigned char
.Semua hal ini berarti Anda mungkin dapat mem-porting kode C ++ umum langsung ke Arduino tanpa kesulitan. Namun, kembali dengan cara lain mungkin memerlukan beberapa pengeditan kecil.
Dalam prakteknya ...
Setelah mengatakan semua itu, pemrograman untuk Arduino tidak persis sama dengan pemrograman C ++ umum. Banyak perbedaan yang umum terjadi pada semua pemrograman tertanam (seperti memori terbatas dan daya pemrosesan).
Perlu juga dicatat bahwa jika Anda menggunakan IDE Arduino resmi maka ada segala macam kebiasaan dan batasan yang mengganggu tentang cara Anda mengatur kode Anda. Ada beberapa solusi dalam semua kasus (sejauh yang saya ketahui), tetapi terkadang cukup membuat frustrasi.
Untuk fleksibilitas penuh, gunakan IDE pihak ketiga (seperti Eclipse) dengan plug-in untuk mendukung Arduino. Itu akan memberi Anda semua keuntungan dari C ++, bersama dengan perpustakaan Arduino.
sumber
Pertama, kompiler Arduino / IDE menerima C dan C ++ apa adanya. Sebenarnya banyak perpustakaan ditulis dalam C ++. Banyak dari sistem yang mendasarinya tidak berorientasi objek, tetapi bisa saja.
Dengan demikian, "Bahasa Arduino" adalah C ++ atau C.
C ++ bukan sampah yang dikumpulkan. Itu mengelola variabel dalam lingkup - jika Anda menulis:
Maka Anda akan menemukan itu
led
dani
tidak tumbuh atau bocor, tidak peduli berapa kali Anda meneleponblinkTimes
.Jika
i
suatu kelas, itu juga akan dibuang begitu fungsi berakhir. Jadi selama Anda tidak menggunakannew
atau fungsi alokasi memori serupa untuk membuat objek baru, maka Anda tidak perlu khawatir tentang kebocoran.Anda mungkin masih kehabisan memori, jika Anda membuat kelas besar dan menggunakan banyak dari mereka dalam fungsi yang sangat bersarang, tetapi secara umum Anda tidak akan mengalami masalah sampai Anda mulai berurusan dengan
new
danfree
fungsinya.Jika Anda menggunakan
new
, maka Anda harus menelepondelete
pada waktu yang tepat. C ++, dan dengan ekstensi Arduino, tidak memiliki pengumpulan sampah otomatis, Anda harus mengelola memori Anda sendiri secara eksplisit.sumber
Bahasa Arduino adalah C ++, tetapi sangat berbeda dari kebanyakan varietas C ++. Bahasa Arduino memiliki banyak abstraksi bawaan, terutama di antarmuka perangkat keras, yang membuatnya sangat mudah digunakan. Jika Anda memiliki latar belakang di Java, C dan C ++ harus sangat mirip.
Perbedaan utama antara Arduino dan C ++ ada di penyimpanan memori. Biasanya komputer modern memiliki lebih dari 2GB RAM, sedangkan Arduino Uno memiliki 2kB (1 juta kali lebih sedikit). Arduino juga menggunakan instruksi 8-bit sebagai pengganti instruksi 32 bit yang digunakan komputer. Ini terutama akan mempengaruhi jumlah informasi yang dapat Anda simpan dalam variabel.
Jika Anda sangat baru di dunia Arduino, Anda harus mencari tutorial, karena ada banyak yang bagus di luar sana.
sumber
int blah = 5;
) Maka mereka akan dihancurkan secara otomatis ketika mereka keluar dari ruang lingkup (yaitu pada akhir loop atau fungsi). Namun, jika Anda instantiate pada heap (misint *blah = new int(5);
) maka Anda harus melepaskannya sendiri. Biasanya tidak bijaksana untuk menggunakan data tumpukan dalam pemrograman tertanam.--- Perbarui 170412
Saya menulis jawaban asli saya tiga tahun lalu dari perspektif ada yang berbeda "Arduino C ++". Bahasa yang digunakan dalam IDE adalah standar C ++, karena diimplementasikan oleh kompiler GNU C ++. "Tampaknya" perbedaan merayap masuk karena IDE akan melakukan beberapa pra-pemrosesan untuk membantu pendatang baru ke bahasa menghindari beberapa 'gotcha's, dengan mengisi beberapa #includes, f / ex. Tapi Anda bisa - dan saya lakukan - menulis C ++ yang benar untuk itu dan mendapatkan apa yang Anda harapkan.
--- akhiri pembaruan
Batasi penggunaan fitur bahasa C ++ untuk mereka yang implementasinya Anda pahami sepenuhnya. Ada beberapa fitur yang mengkompilasi ke kode sumber daya lebih intensif daripada yang jelas dari membaca kode sumber. Daftar .ls (gabungan sumber dan rakitan) yang dihasilkan opsional dapat memberi Anda wawasan yang baik tentang apa yang dilakukan oleh kompiler C ++ ketika Anda tidak melihat.
Untuk pertanyaan Anda tentang memori: C ++ tidak mengumpulkan sampah. Bahasa berbasis stack seperti C dan C ++ mengalokasikan penyimpanan sementara pada stack untuk variabel otomatis pada entri fungsi, yang kemudian dirilis ketika fungsi kembali, tetapi ini bukan pengumpulan sampah yang sebenarnya. Objek yang dibuat di heap- atau memori global hidup sampai Anda menghapusnya secara eksplisit. Pastikan Anda tahu di mana, kapan, dan berapa lama berbagai jenis objek akan dibuat. Anda benar-benar tidak ingin objek code
new
-ing dandelete
-ing Anda mau tak mau. Mereka akan dibangun di memori tumpukan, memecahnya dan menyebabkannya tumbuh ke dalam tumpukan. Saat itulah kode Anda - dan copter Anda yang bagus - akan macet.C lebih sedikit untuk Anda sehingga lebih sedikit untuk Anda. Itu bukan pilihan yang buruk. C dengan beberapa fitur C ++ bisa menjadi pilihan yang lebih baik, mengingat Anda memilih fitur tambahan dengan bijaksana.C ++, jika itu adalah dua pilihan Anda:
[Jawaban asli] - C ++ adalah bahasa terstandarisasi. Ini banyak digunakan di banyak lingkungan termasuk sistem tertanam dan oleh karena itu lebih teruji daripada bahasa yang sangat mirip C ++ yaitu "Arduino". Ini sangat penting untuk aplikasi mission-critical / safety-critical seperti yang Anda rencanakan. Kode rusak berarti copter yang mogok dan bahkan jika itu tidak melukai seseorang, itu akan merusak mesin mahal Anda.
Menjadi standar, C ++ portabel. Perlu meningkatkan prosesor Anda? Semuanya kecuali kode khusus silikon akan port ke yang baru. Perlu mengubah perangkat Anda, sistem pengembangan, host OS? C ++ akan didukung di mana saja. Meskipun Arduino IDE akan berjalan di mana saja Java didukung, itu adalah satu-satunya alat yang menggunakan Arduino C ++ dan itu adalah alat yang sangat terbatas. Jika Anda ingin menggunakan Eclipse, alat AVR, bertelanjang kaki di command-line, kembangkan di Emacs, atau lingkungan apa pun yang Anda suka, standar C ++ akan didukung.
Arduino IDE melakukan hal-hal di belakang Anda - khususnya, itu termasuk file .h ketika dianggap Anda membutuhkannya. Bahkan jika itu benar, Anda benar-benar ingin menulis, atau setidaknya melihat dan memahami, semua yang akan dilihat oleh kompiler. Bahasa pemrograman tidak dibuat untuk komputer (komputer memakan bit untuk sarapan); mereka dibuat untuk orang-orang, khususnya orang-orang yang mengikuti Anda dalam proyek, yang paling penting di antaranya adalah ... Anda !, ketika 6 bulan setelah Anda menulis modul, Anda harus kembali untuk meningkatkannya, atau lebih kemungkinan, perbaiki. Anda benar-benar ingin dapat melihat semua yang dilihat kompilator.
sumber
Dalam pengalaman saya, yang terbaik adalah menghindari yang baru dan menghapus ketika menjalankan pada mesin dengan memori terbatas.
Mungkin ada kasus di mana dibenarkan untuk menggunakan konstruksi dan penghancuran instance yang dinamis, tapi saya curiga mereka jarang.
sumber
new
dandelete
tersedia di Arduino IDE juga.Seperti disebutkan dalam beberapa jawaban, jika Anda memprogram sistem tertanam secara umum Anda harus menghindari yang baru kecuali jika Anda mengelola tumpukan memori Anda sendiri dan Anda benar-benar tahu apa siklus hidup objek Anda nantinya. Alokasi statis atau variabel stack jauh lebih aman. Yang mengatakan, salah satu trik umum untuk mengelola hal-hal seperti buffer panjang variabel yang dialokasikan untuk durasi fungsi adalah memiliki variabel otomatis (di stack) yang merupakan objek yang memanggil baru dalam konstruktornya, dan kemudian meletakkan delete di destructor jadi ketika objek keluar dari ruang lingkup buffer dilepaskan kembali ke heap. Sekali lagi, ini biasanya penggunaan terbatas dalam sedikit micros tetapi itu adalah pola yang bagus untuk diingat.
sumber
Selain komentar di atas, saya ingin lebih menekankan masalah dengan RAM yang Anda miliki di papan Arduino, terutama dengan Uno (dan yang lain yang memiliki mikrokontroler yang sama). Baru-baru ini saya menulis game Space Invaders sederhana yang dijalankan pada matriks LED 32x32 dan berulang kali mengalami masalah yang disebabkan oleh memori yang rendah.
Uno hanya memiliki 2048 byte RAM. Perpustakaan untuk matriks saya mengambil alih 3/4 dari itu sehingga saya memiliki sekitar 400 byte untuk permainan. Karena itu adalah niat saya untuk "meningkatkan" proyek di beberapa titik untuk menjalankan beberapa game dengan program yang sama berdasarkan yang lebih kuat Karena, saya merancang kode dengan kepala sekolah OO dan banyak warisan kelas. (Kelas game diwarisi dengan pembaruan virtual dan menarik panggilan, entitas game semuanya diwarisi).
Saya cukup banyak kehabisan memori hanya dengan menambahkan penyerbu. Saya mencoba untuk menghemat memori dengan sedikit memasukkan variabel anggota mereka tetapi kehabisan lagi ketika menambahkan objek perisai. Setelah sedikit lebih banyak goresan saya kehabisan menambahkan bom / peluru. Pada titik ini saya menjelajahi kode dan menghapus semua tag "virtual" (semua prototipe kelas saya dibangun dari potongan Visual Assist dan destruktor semuanya virtual secara otomatis). Ini mengurangi separuh penggunaan memori saya secara instan, cukup membebaskan untuk dapat menyelesaikan kode.
Singkatnya, hasil akhirnya adalah kode C ++ yang tidak benar-benar menggunakan fitur C ++. Anda mungkin juga hanya berpegang teguh pada C dan sangat menyadari penggunaan memori Anda. Anda tidak mendapatkan bantuan jika Anda melebihi 2KB - terutama jika Anda menggunakan alokasi dinamis apa pun, kode hanya berhenti bekerja dan Anda dibiarkan menggaruk-garuk kepala Anda sebentar sampai Anda mempertimbangkan kemungkinan overflow memori.
Variabel PS - Bit fielding buruk. Sangat buruk. Selain menambahkan pemrosesan overhead, saya kehilangan jejak berapa kali saya akan menambahkan negara baru ke permainan tetapi kode tidak berjalan dan saya tidak mengerti mengapa. Variabel status saya tidak cukup lebar untuk menampung nilai status baru sehingga saya mendapatkan kondisi tak terduga.
sumber
Bahasa Arduino adalah C ++ (meskipun biasanya diimplementasikan dalam gaya yang lebih mirip "C dengan kelas," yang sebenarnya cukup umum di dunia sistem embedded mikrokontroler). Akhir dari cerita. Cukup dengan orang-orang berpikir itu bahasa yang berbeda! Menggunakan kompiler g ++.
Bukti:
Aktifkan keluaran verbose selama kompilasi dalam Preferensi dan unggah dan Anda akan belajar banyak hanya dengan membaca baris-baris itu.
Inilah beberapa wawasan tambahan:
Kata-kata saya sendiri:
Kode Arduino adalah C ++. Fungsi inti Arduino hanyalah sekumpulan kelas C ++ dan pustaka yang dapat Anda gunakan. Itu dibangun dan dikompilasi menggunakan kompiler GNU gcc / g ++ . Fungsi setup () dan loop () Anda cukup ditempatkan pada fungsi wajib () utama ( di sini sebenarnya - perhatikan file adalah "main.cpp", yang merupakan file sumber C ++) secara otomatis untuk Anda dan ada beberapa tambahan preprocessing dilakukan untuk memastikan itu adalah program C ++ yang valid (mis: pemindaian untuk semua prototipe fungsi [alias: deklarasi] untuk Anda sehingga Anda dapat menggunakan fungsi meskipun prototipenya nanti ada di file .ino Anda). Namun, banyak dari Arduino ditulis dalam "gaya C", dan karenanya membutuhkan
# extern "C" {}
kawat di sekitarnya untuk mencegah C ++ dari"name-mangling" (juga dikenal sebagai "name decorating / name decoration" ) memanggil fungsi C yang diimplementasikan oleh AVR-libc , yang merupakan implementasi C untuk ATmega328 dan mikrokontroler arsitektur AVR-arsitektur lainnya .Kata-kata Arduino:
Sumber: https://www.arduino.cc/en/Main/FAQ#toc13
Kapan menggunakan perpustakaan Arduino vs pure C atau C ++?
Jadi, gunakan bahasa Arduino yang menyederhanakan berbagai hal, dan tuliskan fungsi Anda sendiri di mana Anda membutuhkan lebih banyak spesialisasi. Saya merekomendasikan menjauh dari IDE dengan cepat meskipun untuk menulis kode - cukup gunakan untuk kompilasi. Tetapkan preferensi IDE untuk menggunakan "Editor Eksternal." Kemudian gunakan editor kode sumber profesional / IDE seperti Sublime Text 3 , Atom , Visual Studio Code , atau Eclipse CDT untuk menulis kode Anda. Anda kemudian dapat mengklik kembali ke Arduino IDE untuk menyusun dan mengunggah. Jika Anda menggunakan Eclipse, ada cara untuk melakukannya di Eclipse (lihat jawaban lain di sini, dan lihat artikel Eclipse playground Arduino di sini juga) jadi pertimbangkan untuk menggunakan teknik-teknik itu juga.
sumber