質問

質問このコメントのフォローアップ= "https://stackoverflow.com/questions/452139/writing-firmware-assembly-or-high-level">ファームウェアの書き込み:アセンブリまたは高レベル?:

Arduino プラットフォーム用のC ++コードをコンパイルする場合、仮想関数、例外などを使用できますか?または、で説明されているように、C ++のサブセットを使用する必要がありますかコメント)?

Arduinoプラットフォーム用にプログラミングする際のその他の注意事項はありますか?

役に立ちましたか?

解決

Arduino環境では、GCCツールチェーンのAVRバージョンを使用しています。コードはC ++としてコンパイルされるため、クラスを使用できます。仮想機能が可能です。 vtableは.dataセクションに保存され、正しいアドレスを持ちます。実際、Print基本クラスは仮想関数を使用して、さまざまな<!> quot; print <!> quot;を調整します。さまざまな出力タイプへのメソッド。

コードスペースの理由により、例外はサポートされていません。 Arduino環境は<!> quot; -fno-exceptions <!> quot;を渡します。コンパイラのコマンドラインに。この検証については、ソースをご覧ください。 。

テンプレートがサポートされています。たとえば、この無料のストリーム挿入演算子テクニックは、単純なテンプレートとインライン演算子を使用して正常に機能します。

他のヒント

Arduinoソフトウェアはavr-gccを使用してスケッチをコンパイルします。次の制限は、 avrlibc FAQ(C ++を使用できますか? AVR?)

サポート

  • 仮想関数
  • コンストラクタとデストラクタ(グローバルなものを含む)

サポートされていません

  • C ++標準関数、クラス、およびテンプレートクラス(ただし、 Arduino用uClibc ++のこのポートを参照)
  • 演算子newおよびdelete(それらを使用しようとすると、リンカーは未定義の外部参照について文句を言います)。つまり、オブジェクトはスタック上でのみ作成できます。動的メモリ割り当てが必要な場合、malloc()およびfree()タイプのCを使用して実装する必要があります
  • 例外。 C ++フロントエンドではデフォルトで例外が有効になっているため、コンパイラオプションで-fno-exceptionsを使用して例外を明示的にオフにする必要があります。これはArduino IDEがavr-gcc
  • を起動したときに自動的に行われます

その他の問題

  • 提供されているインクルードファイルの一部はC ++に対応していません。つまり、
    extern "C" { . . . }
  • でラップする必要があります。

機能の使いやすさはプラットフォームによって制限されるのではなく、使用しているコンパイラによって制限されます。

サポートされている言語機能については、コンパイラのドキュメントを確認します。

Comeau Computing には、すべてのC ++機能をサポートするC ++ to Cコンパイラがあります。仮想関数や例外だけでなく、エクスポートもできます。 Arduino言語をターゲットにするためにComeauを呼び出す必要がありますが、それほど難しくないはずです。

ドキュメントによると:

  

Arduino言語はC / C ++に基づいており、すべての標準C構成体といくつかのC ++機能をサポートしています。

見つけることができる仮想関数については何も言っていません。

簡単なプログラムを試してみましたが、問題なくコンパイルできます。ただし、Arduinoハードウェアではテストしていません。

編集:例外もテストしていません。

g ++をこのMakefile で使用し、このコード。 C ++はスペースを浪費します。しかし、プロトスレッドはあまりにもクールなので使用しないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top