C ++対Arduino言語?


81

Arduinoを使用するときの各言語の利点は何ですか?

これは良い一般的な質問だと思いますが、誰かが私に助言を与えたいかどうか尋ねる理由について少し付け加えます。

私はJavaScript、PHPなどの前処理された言語の経験があり、JavaやVisual Basicなどの言語をいじっています。言い換えれば、私はプログラミング技術と古典的およびプロトタイプのオブジェクト指向の両方を知っていますが、ハードウェアと直接通信することについては何も知りません。

オクトコプターを作成していますが、オブジェクト指向のアプローチが最も簡単だと考えています。(ソフトウェアには非常に多くの機能があります...)しかし、私はC ++で書いたことはありません。

これは他の人を助けるはずのQ&Aサイトであるため、冒頭に提示した一般的な質問のみが非常に重要ですが、私の状況についてコメントをいただければ幸いです。


16
IDE名に値しないArduino IDEは避けてください。非常に貧弱なエディタです。初心者や簡単なスケッチには適しているかもしれませんが、すぐにもっと良いものに行くべきです。
jfpoilpret 14年

4
これは、「Arduinoプログラミング言語」が何を意味するのか(および実際には何をするのか)のかなり簡潔な内訳です。
AdjunctProfessorFalcon

10
C++ vs. The Arduino Language?-「Arduino言語」 C ++です。関数のプロトタイプを作成するための前処理が少しありますが、それは間違いなくC ++です。
ニックギャモン

2
Arduino言語のようなものはありません。これは単なるライブラリです。
オーバー

2
コメントに関しては質問とはあまり関係ありません。Atmelstudioは無料で、IMHOはarduinoプログラミングのビジュアルスタジオよりも優れています。また、Visual Microプラグインもサポートしていますが、arduinoのプログラミングとデバッグにはまったく必要ありません。
サイバーポンク

回答:


55

教授としての私の個人的な経験(プログラミング、メカトロニクス)は、以前のプログラミング経験があり、OOPとしての概念を知っているなら、C / C ++に行く方が良いということです。arduino言語は初心者には本当に優れていますが、いくつかの制限があります(たとえば、すべてのファイルを同じフォルダーに置く必要があります)。そして、それは基本的にC / C ++の単純化です(実際にarduinoコードをC / C ++ファイルにコピーして貼り付けることができ、それは機能します)。また、Eclipseとしてよく知られている完全なIDEを使用することもできます。

http://playground.arduino.cc/Code/Eclipse

最初は、開発環境のセットアップと構成がもう少し必要ですが、私見では、他の言語の経験があるプログラマーにとっては価値があります。

いずれにしても、arduino言語とarduino IDEを数日間使用してarduinoハードウェアに慣れてから、実際にプロジェクトを開発するためにEclipseを使用してC / C ++に移行しても害はありません。


ご意見ありがとうございます。Arduino IDEを使用して、センサーやLCDスクリーンなどのさまざまなハードウェアを制御する方法を学びます。次に、C ++に移行して、octocopter用のソフトウェアを作成します。他の言語を知っている人のための短くて良い本を知っていますか?私が見つけた多くの本の「問題」は、UIコンピューターではなく小さなAtmelマイクロコントローラーを使用しているため、必要ないほど多くの本が含まれていることです。
キムの友人14

1
Julien Bayleによる便利な「C Programming for Arduino」という素晴らしい本があります。C ++言語ではなくC言語ですが、基礎を理解するのに役立ちます。
fenix688 14年

それは良いリクエストです。他の言語のプログラマーのためのC ++の基本を含む短くて良い本です。申し訳ありませんが、推奨事項を提示することはできません。適切な推奨事項を認識していません。実際、私は学生向けの実用的な焦点(ビデオゲームの開発)で本を書きましたが、それはスペイン語のみです。優れた実用的なC ++の本については、Deitel&Deitel C ++のプログラミング方法をお勧めします。多くの高度な章をスキップできます。
ドロドリ14年

1
C ++はオブジェクト指向機能をサポートしますが、C言語はサポートしません。
クリスO 14年

1
@FriendofKim正確には私が意図したものではありません(技術的には可能ですが、Dueは非メガビットシリアル通信用のソフトウェアソリューションをサポートするのに十分高速であり、Arduinoライブラリは4つしか提供しませんが、ただし、iirc DueボードはいずれにせよUSARTの1つにピンを提供しません。Arduinoライブラリは非同期モードを使用するようにUSARTを構成しますが、最大6Mbpsで同期が必要でした(また、ストップビットなどがないため入力を生のビットストリームとして扱う必要があるため、SPIモードを使用する必要がありました)デフォルトのPIOコントローラー構成の変更。
JAB 14年

48

理論的に
は、実際にはArduino言語はありません。実際には、いくつかのドメイン固有のライブラリを備えた単なるC ++です。これらは、ハードウェアを制御するために呼び出すことができる機能など、さまざまな機能を追加します。これらの関数がなければ、すべてを制御するために特殊なレジスターを直接操作する必要があります。これが、組み込みプログラミングの通常のやり方です。速いですが、学ぶことも理解することも非常に困難です。

ライブラリーは、関数に加えて、一部のタイプの代替名を追加します。たとえば、booleanおよびbyteはC ++標準にはありません。ただし、これらはboolおよびに直接相当しunsigned charます。

これらすべてのことから、おそらく一般的なC ++コードをArduinoに簡単に直接移植できることがわかります。ただし、他の方法に戻るには、若干の編集が必要になる場合があります。

実際には...
すべてのことを述べましたが、Arduinoのプログラミングは一般的なC ++プログラミングとまったく同じではありません。ただし、多くの違いはすべての組み込みプログラミングに共通しています(メモリや処理能力の制限など)。

また、公式のArduino IDEを使用している場合は、コードのセットアップ方法にあらゆる種類の迷惑な癖と制限があることに注意してください。(私の知る限り)すべての場合に回避策がありますが、時にはかなりイライラすることがあります。

完全な柔軟性を得るには、サードパーティのIDE(Eclipseなど)とプラグインを使用してArduinoをサポートします。これにより、ArduinoライブラリとともにC ++のすべての利点が得られます。


25

Arduinoを使用する場合、C ++とArduino言語の利点は何ですか?私はJavaScript、PHPなどの前処理された言語の経験があり、JavaやVisual Basicなどの言語をいじっています。

まず、Arduinoコンパイラ/ IDEは、CおよびC ++をそのまま受け入れます。実際、ライブラリの多くはC ++で記述されています。基礎となるシステムの多くはオブジェクト指向ではありませんが、可能性はあります。

したがって、「The Arduino Language」はC ++またはCです。

C ++はガベージコレクションされません。スコープ内の変数を管理します-あなたが書いた場合:

int led = 13;

void blinkTimes(int value)
{
   int i;

   for(i=0;i<value;i++)
   {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1000);
   }
}

そして、あなたはそれを見つけることができますledし、i関係なく、あなたが呼び出し回数、成長しないか、漏れませんblinkTimes

iクラスであれば、関数が終了すると同様に破棄されます。したがって、new新しいオブジェクトを作成するためにメモリ割り当て関数などを使用していない限り、リークを心配する必要はありません。

巨大なクラスを作成し、深くネストされた関数でそれらの多くを使用する場合、メモリが不足する可能性がありますが、一般的にはnewfree関数を処理し始めるまで問題にぶつかることはありません。

を使用している場合は、適切なタイミングでnew電話deleteする必要があります。C ++、および拡張Arduinoには自動ガベージコレクションがないため、独自のメモリを明示的に管理する必要があります。


1
さて、インスタンス化されたオブジェクト(新しいオブジェクト)がガベージコレクションされていない場合は、それも学習する必要があります。私はC ++に関する本がそれをカバーすると思う。良い答えをありがとう!
キムの友人14

14

Arduino言語 C ++ですが、ほとんどのC ++の種類とは大きく異なります。Arduino言語には、特にハードウェアインターフェイスに多くの抽象化が組み込まれているため、非常に使いやすくなっています。Javaのバックグラウンドがある場合、CとC ++は非常に似ているはずです。

ArduinoとC ++の主な違いは、メモリストレージです。通常、最新のコンピューターには2GB以上のRAMがあり、Arduino Unoには2kB(100万倍少ない)があります。Arduinoは、コンピューターが使用する32ビット命令の代わりに8ビット命令も使用します。これは主に、変数に保存できる情報の量に影響します。

Arduinoの世界に慣れていない場合は、チュートリアルをご覧ください。多くの優れたチュートリアルがあります。


あなたは記憶に言及します。96KBのRAMを持っているDueがあります。しかし、私が最後に望むことは、メモリリーク(ヘリコプターに搭載された非常に高価なカメラを持っている)が原因でヘリコプターがクラッシュすることです。
キムの友人14

特に指定されていない場合、C ++のメモリは(Javaのガベージコレクターのように)自動的に処理されますか?
キムの友人14

2
C ++標準では、メモリサイズについての保証はありません。C++は、変更なしで既に組み込みハードウェアで実行されています。
マイケルソープ14年

2
ただし、C ++ではなく、ハードウェアプラットフォーム間の違いについて説明しています。
サイバーギボン14年

5
@FriendofKim C ++には、変数/オブジェクトをインスタンス化する2つの異なる方法があります。それらをローカルにインスタンス化する場合(例:)、それらint blah = 5;はスコープから外れると(つまり、ループまたは関数の終わりに)自動的に破棄されます。ただし、ヒープ(たとえばint *blah = new int(5);)でインスタンス化する場合は、自分で解放する必要があります。ただし、組み込みプログラミングでヒープデータを使用することは通常賢明ではありません。
ピーターブルームフィールド14年

14

---更新170412
3年前、明確な「Arduino C ++」が存在するという観点から、元の回答を書きました。IDEで使用される言語はあるそれはGNU C ++コンパイラによって実装されているため、標準C ++。「明らかな」違いは、IDEがいくつかの#includes、f / exを埋めることによって、言語の初心者がいくつかの「落とし穴」を避けるのを助けるためにいくつかの前処理を行うために忍び込みます。しかし、あなたは-そして私が-正しいC ++を書いて、あなたが期待するものを手に入れることができます。
---更新を終了

C ++言語機能の使用は、実装を完全に理解しているものに限定してください。ソースコードを読むことから明らかなよりも多くのリソースを消費するコードにコンパイルする機能がいくつかあります。オプションで生成された.lss(マージされたソースとアセンブリ)のリストは、C ++コンパイラが見ていなかったときに何をしたかについての良い洞察を与えてくれます。

メモリに関する質問:C ++はガベージコレクションを行いません。CやC ++のようなスタックベースの言語は、関数のエントリ時に自動変数用のスタックに一時的なストレージを割り当て、関数が戻ると解放されますが、これは本当のガベージコレクションではありません。ヒープメモリまたはグローバルメモリに作成されたオブジェクトは、明示的に削除するまで存続します。さまざまな種類のオブジェクトがどこで、いつ、どのくらいの期間作成されるかを確認してください。あなたは本当にあなたのコードnew-ingとdelete-ingオブジェクトを自由に欲しくありません。それらはヒープメモリに構築され、それを断片化し、スタックに成長させます。それはあなたのコード-そしてあなたの素敵な「ヘリコプター」がクラッシュするときです。

Cは、それがあまりを行うことができますので、あなたのためにあまりありません君を。それは悪い選択ではありません。いくつかのC ++の機能を備えたCは、追加機能を慎重に選択すれば、さらに優れた選択肢になります。

[元の回答]-C ++は標準化された言語です。組み込みシステムを含む多くの環境で広く展開されているため、「Arduino」である非常によく似たC ++言語よりも徹底的にテストされています。これは、あなたが計画しているようなミッションクリティカル/セーフティクリティカルなアプリケーションにとって特に重要です。クラッシュしたコードとは、ヘリコプターがクラッシュしたことを意味し、たとえそれが誰かを傷つけないとしても、高価なマシン壊します。

  • 標準であるため、C ++は移植可能です。プロセッサをアップグレードする必要がありますか?シリコン固有のコード以外はすべて新しいものに移植されます。ツールセット、開発システム、ホストOSを変更する必要がありますか?C ++はどこでもサポートされます。Arduino IDEはJavaがサポートされている場所であればどこでも実行できますが、Arduino C ++を使用する唯一のツールであり、非常に限られたツールです。Eclipse、AVRツールを使用する場合、コマンドラインで裸足で行く、Emacs内で開発する、またはその他の好みの環境であれば、標準C ++がサポートされます。

  • Arduino IDEは、あなたの背後にあることを行います。具体的には、.hファイルが必要だと思われるときに#hをインクルードします。たとえそれが正しいとしても、コンパイラーが目にするすべてのものを実際に書きたい、または少なくとも見て理解したいのです。プログラミング言語はコンピューター用に作られていません(コンピューターは朝食に少し食べます)。彼らは人々、特にプロジェクトであなたをフォローしている人々のために作られています。最も重要なのは...あなたです!モジュールを書いてから6ヶ月後、あなたはそれを強化するために戻ってくる必要がありますおそらく修正してください。あなたは本当にコンパイラが見るものすべてを見たいと思っています。


2
これは本当に良い答えです。あなたがC ++が好きで、私もそれを好むべきであることは明らかです!...しかし、真剣に、さまざまなセンサーなどとの「通信」がどのように機能するかを理解したら、すぐにC ++にジャンプします。
キムの友人14

このテーマに関する良い本を知っていますか?(他の言語で何年もプログラミングをしており、C ++の「埋め込み部分」のみが必要な私に適しています。)
キムの友人

Accelerated C ++はこれに適した本だと思いますか?
キムの友人14

2
私は「正しい」本であなたを助けたいと思っていますが、私は私の後ろにたくさんのCを持ってC ++に来ました、そしてKernighan&RitchieのCプログラミング言語はまだ明示的にC ++ではないもののための私の頼りになる本です(悪いしゃれ) 、Ellis&StroustrupのC ++用注釈付きC ++リファレンスマニュアル。ただし、ハードウェアへの書き込みについては、Arduino.ccのユーザーから提供されたデバイスライブラリのいくつかを見てください。pinMode()、digitalWrite()とdigitalRead()関数は、そのアナログとI / Oポートを微調整始めるI / O対応、及び最終的に...
JRobert

1
...速度とメモリ空間の改善のためにI / Oレジスタに直接書き込むことを計画します。blinky.cppやhello.cppなどのプログラムは、ハードウェアをいじり始めるのに適した場所です。シンプルなマルチメーターを追加し、適切な電流制限抵抗器が1本の足に恒久的にはんだ付けされたいくつかのLEDを追加すれば、努力の結果として、実際の結果を見ることができます。その後、興味のあるハードウェアのデータシートを読んで、それらを再生するために読み取り/書き込みが必要な信号を学習します。温度センサーは使いやすく、誰もが冷蔵庫ロガーを必要としませんか?楽しんで!
Jロバート14年

10

私の経験では、メモリが限られているマシンで実行する場合は、新規を避けて削除することが最善です。

  • メモリ管理自体は、貴重なプログラムとRAMスペースを使用します
  • ISRベクトルは、コンパイル時に設定されます。クラスインスタンスが実行時にISRを要求することは困難です(不可能ですか?)
  • 一般に、コンパイル時に、必要なクラスインスタンス(たとえば、3ボタンデバウンサー、ディスプレイドライバー、2行ディスプレイドライバー)がわかります。
  • 新規または削除を使用すると、メモリ管理により未知の遅延が発生します。

動的なインスタンスの構築と破棄を使用することが正当化される場合もありますが、それらはまれであると思われます。


C ++がまったく新しいので、STDに関してフォローアップの質問があります。それを使用するのは賢明ではないのですか?そうでない場合、どのように追加できますか(Eclipse)?AVRコンパイラをセットアップし、うまく機能しています。
キムの友人14

1
あなたが言うことはすべて正しいですが、これがOPの質問に対する答えであるかはわかりません。newそしてdelete、あまりにもArduinoのIDEで利用可能です。
jfpoilpret 14年

それは答えではありませんが、非常に役立つ情報であり、本当に感謝しています。
キムの友人14

8

いくつかの回答で述べたように、一般に組み込みシステムをプログラミングしている場合、独自のメモリヒープを管理していて、オブジェクトのライフサイクルがどうなるかを本当に知っている場合を除き、newを避ける必要があります。静的割り当てまたはスタック変数ははるかに安全です。とはいえ、関数の持続時間に割り当てられた可変長バッファのようなものを管理するための一般的なトリックの1つは、コンストラクタでnewを呼び出すオブジェクトである自動変数(スタック上)を持ち、デストラクタに削除を置くことですそのため、オブジェクトがスコープ外に出ると、バッファはヒープに解放されます。繰り返しますが、これは通常、小さなマイクロでは限られた用途ですが、覚えておくと良いパターンです。


6

上記のコメントに加えて、Arduinoボード上で動作するRAM、特にUno(および同じマイクロコントローラを共有する他のデバイス)のRAMの問題をさらに強調したいと思います。最近、32x32 LEDマトリックスで実行する簡単なSpace Invadersゲームを作成しましたが、メモリ不足が原因で問題が繰り返し発生しました。

Unoには2048バイトのRAMしかありません。私のマトリックスのライブラリーはその4分の3以上を占め、ゲーム用に約400バイトを残しました。ある時点でプロジェクトを「アップグレード」して、より強力なDueに基づいて同じプログラムで複数のゲームを実行することが目的なので、OOプリンシパルと多くのクラス継承を使用してコードを設計しました。(ゲームクラスは仮想更新と描画呼び出しで継承され、ゲームエンティティはすべて継承されました)。

侵略者を追加するだけで、メモリ不足になりました。メンバー変数をビットフィールド化することでメモリを節約しようとしましたが、シールドオブジェクトを追加するときに再び使い果たしました。もう少しこすった後、爆弾/弾丸を追加しました。この時点で、コードを精査し、すべての「仮想」タグを削除しました(クラスプロトタイプはすべてVisual Assistスニペットから構築され、デストラクタはすべて自動的に仮想化されます)。これにより、メモリ使用量がすぐに半分になり、コードを完了できるように十分に解放されました。

要するに、最終的な結果は、実際にはC ++機能を一切使用しないC ++コードです。同様に、Cにこだわり、メモリ使用量を非常によく知っているかもしれません。2KBを超えると何の助けも得られません-特に動的割り当てを使用している場合、コードは動作を停止し、メモリオーバーフローの可能性を考慮するまでしばらく頭をひっかきます。

PS-ビットフィールド変数は悪いです。ひどい。処理のオーバーヘッドを追加することとは別に、ゲームに新しい状態を追加する回数を追跡できませんでしたが、コードが実行されず、理由を理解できませんでした。状態変数の幅が新しい状態値を保持するのに十分ではなかったため、予期しない状態が発生していました。


4

Arduino言語 C ++です(通常、組み込みシステムのマイクロコントローラの世界では実際にかなり一般的な「クラスのあるC」のようなスタイルで実装されます)。物語の終わり。すでに別の言語だと思っている人には十分です!g ++コンパイラを使用します。

証明:

環境設定でコンパイル中に詳細な出力を有効にしてアップロードすると、これらの行を読むだけで多くを学ぶことができます。

追加の洞察は次のとおりです。

私自身の言葉:

Arduinoコード C ++です。Arduino コア関数は、使用できるC ++クラスとライブラリのセットです。GNU gcc / g ++コンパイラを使用して構築およびコンパイルされます。setup()関数とloop()関数は、必須のmain()関数に配置されるだけです(実際には、このファイルはC ++ソースファイルである「main.cpp」であることに注意してください)。有効なC ++プログラムであることを確認するための前処理(例:すべての関数プロトタイプ[別名:宣言]をスキャンして、プロトタイプが後で.inoファイルに含まれていても関数を使用できるようにします)。ただし、Arduinoの多くは「Cスタイル」で記述されて# extern "C" {}いるため、C ++を防ぐために中括弧が必要です。"name-mangling""name decorating / name decoration"とも呼ばれます)関数は、ATmega328および他のAVRアーキテクチャマイクロコントローラーのC実装であるAVR-libcによって実装されるC関数を呼び出します。

Arduinoの言葉:

" ArduinoボードをCでプログラムできますか?
実際、あなたはすでにそうなっています; Arduino言語は、コードから呼び出すことができるC / C ++関数のセットにすぎません。スケッチは小さな変更(関数プロトタイプの自動生成など)を受けますそして、C / C ++コンパイラ(avr-g ++)に直接渡されます。avr-g++でサポートされるすべての標準CおよびC ++コンストラクトはArduinoで動作するはずです。詳細については、Arduinoビルドプロセスのページを参照してください。

ソース:https : //www.arduino.cc/en/Main/FAQ#toc13

Arduinoライブラリと純粋なCまたはC ++ を使用する場合

したがって、物事を単純化する場合はArduino言語を使用し、さらに専門化が必要な場合は独自の関数を作成します。コードを書くために、IDEからすばやく離れることをお勧めします。コンパイルに使用するだけです。「外部エディター」を使用するようにIDE設定を設定します。次に、Sublime Text 3AtomVisual Studio Code、またはEclipse CDTなどのプロのソースコードエディター/ IDEを使用してコードを記述します。その後、クリックしてArduino IDEに戻り、コンパイルしてアップロードできます。Eclipseを使用する場合は、Eclipseでそれを行う方法があります(他の回答を参照し、ArduinoプレイグラウンドEclipseの記事も参照してください)。これらの手法の使用も検討してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.