将来、PICマイクロコントローラー用のコードをC ++で作成することは可能でしょうか?


8

PICのコーディングにC ++を使用することは可能でしょうか?C ++の使用を妨げるハードウェアの制限はありますか?Cの代わりにC ++を使用すると、生成された.hexファイルのサイズとプログラムの実行時間がどれだけ増加しますか?現在のPICにC ++を使用することは実際に可能ですか?これに関する将来の計画や進行中の開発はありますか?


私はそれが可能だと思うし、可能なままになりますが、それは強く、ハードウェア関連のプログラミングに適していない高レベルの構造や機能を実装して私の知る限りでは、それはお勧めできません
clabacchio


2
答えは「はい、すでに存在するC ++コンパイラがあります」なので、これをそのままにしておきますが、将来的には、Stack Exchangeの質問は、将来についての仮定ではなく、検証可能な事実に関するものであることに注意してください。
ケビンフェルメール

2
@clabacchio:必ずしもそうとは限りません。C ++では、使用した分に対してのみ支払います。で、私の答えを参照してください:electronics.stackexchange.com/questions/3027/...
Rocketmagnet

「PIC」は役に立たない一般化です。一部のローエンドPIC(10F200など)では、Cを使用することはほとんど不可能です。一部のハイエンドPIC(32MXシリーズ)では、C ++は現在使用されていると噂されており、使用できなかった技術的な理由は確かにありません。したがって、より良い焦点を絞ることで、より使いやすい答えが得られる可能性があります。現時点では、全員が実際に別の質問に答えています。
Wouter van Ooijen

回答:


17

PICのコーディングにC ++を使用することは可能でしょうか?

はい、それは今可能です。dsPICには、IARシステムのC ++コンパイラがあります(ただし、非常に古く、サポートされていません)。

別のオプションは、C ++からCへのコンバータを使用することです。ビルド前のステップを使用して、C ++をCに変換し、(厄介な)Cを通常のCコンパイラに渡します。見てみましょうLLVMコモのC ++コンパイラの両方がそれを行います。Comeauの価格はたったの$ 50ですが、ツールチェーン全体とライブラリーを適切に機能させるには、おそらく多少の努力が必要です。

C ++の使用を妨げるハードウェアの制限はありますか?

短い答え、いいえ、ハードウェアの制限はありません。長い答えですが、C ++は確かにヒープやスタックの使用を奨励します。これは、RAMが限られている小型のMCUでは苦労します。

なぜ彼らはヒープ/スタックと格闘するのですか?2つの理由から:A)多くのMCUにはRAMが制限されており、ヒープには不十分であり、スタックには不十分です。B)多くのMCUはポインタを適切に処理しないため、スタックで変数を使用するとパフォーマンスが大幅に低下します。

人々がMCUでC ++を使用することについて尋ねるとき、C ++をCと比較することは建設的であると思います。MCUでのCについてまったく同じ質問が(そして今も)尋ねられました。人々はその考えをぼんやりさせていた。256バイトRAM MCUでの高水準言語?? 無理だよ。しかし、今ではそれが可能であることがわかっています。PIC12のCを書きました。問題ない。これは、A)ソフトウェア開発者が少し注意する必要があることを知っているため可能です。malloc()などを使用しないでください。B)コンパイラはMCU専用に作成されています。コンパイラは、メモリ割り当てにも特に注意を払います。ヒープを作成しようとせず、スタックを作成しない場合があります。一部のCコンパイラーは、スタックが絶対に必要な再入可能(再帰的)コードを作成できません。

MCUにCを書くことは可能であることを知っているので、MCUにC ++を書くという問題にも同じ答えが当てはまります。コンパイラがターゲットデバイスの制限を理解し、ユーザーが言語も理解している限り、問題はありません。C ++では、使用した分に対してのみ支払います。Cを使用した場合に得られるであろう正確なasm出力を生成するC ++(オブジェクトとすべてを含む)を書くことは完全に可能です。

現在、PIC32は確実にC ++に対応できます。最大64kBのRAMを搭載し、適切に成長した32ビットプロセッサであるMIPSコアに基づいています。ポインターとスタックだけでなく、PCも処理できます。実際、MIPSに基づくPCが存在します(少なくとも、以前は存在していました)。

悲しいことに、C ++については多くの誤解があります。非常に経験豊富なプログラマーでさえ、この言語がどのように機能するのかまったくわかりません。C ++が組み込みCPUに適している理由についての私の回答を参照しください。

Cの代わりにC ++を使用すると、生成された.hexファイルのサイズとプログラムの実行時間がどれだけ増加しますか?

私が言ったように、違いはないかもしれません。Bjarne Stroustrupは、多数のC / C ++コンパイラを比較して、いくつかの操作の時間とスペースのパフォーマンスを比較しました。結果は大きく異なりました。場合によっては、C ++が遅くて大きくなったり、遅くて小さくなったり、速くて大きくなったり、さらに速くて小さくなったりすることもあります。したがって、あなたの質問に対する答えは、コンパイラに大きく依存しているということですが、一般的に、それはまったく違いを生じる必要はありません。詳細については、C ++パフォーマンスに関するテクニカルレポートを参照してください。

これに関する将来の計画や進行中の開発はありますか?

わからない。Microchip C32コンパイラはオープンソースであり、ソースをダウンロードできます。また、私が一緒に働いた人が実際にオンラインでいくつかの命令を見つけ、コンパイラにC ++コードをコンパイルさせることができたことも知っています。しかし、適切なツールチェーンを設定する前に、彼は会社を辞めました。


更新

Microchipは、PIC32の組み込みMCUの範囲で利用可能なC ++コンパイラを備えています。



IAR Webページから:「レガシー製品:dsPICのIAR Embedded Workbenchはレガシー製品です。IARシステムはそれをアップデートせず、サポートおよびアップデート契約を購入することはできません。」
Jason S

IAR製品は素晴らしいですが、残念ながら非常に高価で、「古い」ようです。すべての機能を使用しない限り、どのプラットフォームでもC ++が実行可能であることは知っています。ただし、クラスによる抽象化のレイヤーが追加される可能性があります。私はテンプレートを頻繁に使用せず、動的メモリ割り当てもまったく使用しません。PIC24 / PIC32でC ++を使用する他の競合製品を知っている人はいますか?
ハンス

はい、申し訳ありませんが、それは本当に素晴らしい発見ではありませんでした。私の答えにいくつかのことを追加しましょう。
Rocketmagnet 2012

1
私はCをマイクロコントローラー上のC ++の競合相手と見なします。C ++でやりたいことをCではできないことについて考えることができず、目に見えない関数呼び出し(コンストラクター、デストラクターなど)が少なくなっています。コードをより確定的でわかりやすくします。C ++のどの機能は、Cで混乱させることができない必須の機能ですか?
AngryEE 2012

1
「ASMで混乱させることができないCのどの機能が必要ですか?」「何もない」と答えてください。利点は、設計者が設計を指定する能力が向上し、実装が正しいことをコンパイラにチェックさせることです。この点に関するC ++の実際の直接的な利点のリストについては、私の回答electronics.stackexchange.com/questions/3027/…を参照してください。
Rocketmagnet 2012

5

Cの代わりにC ++を使用すると、生成された.hexファイルのサイズとプログラムの実行時間がどれだけ増加しますか?

使用する機能によって異なります。コアのオブジェクト指向機能(クラス+メソッド)を使用する場合、ほとんど効果がありません(マングルされた変数/関数名が長くなるため、シンボルテーブルが多少増える可能性があります)。テンプレートは、優れたコンパイラーでもあまり追加すべきではありません。

夢中になって標準テンプレートライブラリなどを取り込み、動的メモリ割り当てと例外を使用すると、コードが膨大になる可能性があります。


OPへの警告を念頭に置いて、小さなメモリアーキテクチャでのメモリ割り当てと組み込みの常に実行中のシステムについては、非常に注意してください。
ケニー

「-1」は彼/彼女が同意しない理由についてコメントしていただけますか?
Jason S

私は-1erではありませんが、テンプレートはコードの肥大化を避けるために細心の注意を払って使用する必要がある機能です。1つで十分な場合は、アルゴリズムの多くのコピーを簡単に作成できます。
Peter Green

あなたが実際にしなければならないことを行うために使用し、複数の異なるデータ型のテンプレートを、1コピーでしょう否定あなたが共通の基底クラスを持つポリモーフィックコードを使用していない限り、十分では。(この場合、ランタイムコストが発生します。)テンプレートは、コードを不自然に膨らませることはありません。結果を認識していない場合、テンプレートを複数のデータ型で使用すると膨らんだコードが生じるだけです。
Jason S


1

質問を少し一般化すると、組み込み市場向けに構築されたMMU(メモリ管理ユニット)を含むARMプロセッサがあります。メモリサイズと割り当てにより、JavaやC ++などの言語は埋め込みの選択肢が不十分でした。組み込みプロセッサがより高速で強力になるにつれて、またメモリがより高密度で安価になるにつれて、組み込みエンジニアが利用できる言語の選択肢は劇的に変化します。MMUと64Gフラッシュカードを備えた32ビット600MHz ARMプロセッサは、c ++アプリケーションの優れた候補です。それが古典的な組み込みプロセッサの定義に適合するかどうかは、別の問題です。


0

たぶんそうですが、とにかくそうすべきではありません... Cは組み込み言語であり、C ++を使用する利点はありません。むしろ、Cの利点は組み込み用のC ++の利点をはるかに上回ります。時間を無駄にしないでください。

  • 関数ポインタなどの使い方を知っていれば、C ++のようにコーディングできますが、問題ありません。

5
失礼ですが同意できません。C ++の多くの機能(クラス、テンプレート、演算子のオーバーロード、参照)を、ほとんどまたはまったく実行時のコストなしで使用できます。はい、ハックな構成でプレーンCでこれらすべてのことを行うことができますが、それはあなたの頭のドラッグであり、私はむしろC ++を使用したいと思います。(もちろん、私はむしろより優れた言語を使用したいと思いますが、プレーンCよりもハートビートでC ++コンパイラを選択します。)
Jason S

1
クラス=構造体(組み込みのメソッドはありませんが、必要に応じて、構造体に関数ポインタを格納して呼び出すことができます)。テンプレート=あなたはそれらを使用しますか?演算子のオーバーロード=はい私もそれが欲しいです。参照=ポインタ、いいえ?少なくともCを使用すると、過剰なコード生成を心配したり、コンパイルするものを取得するためだけにランダムな大規模なライブラリを含める必要なく、必要なC ++の「機能」のみを使用できます。
AngryEE 2012

1
私も違うことを頼みました。
Rocketmagnet

3
はい、テンプレートは信頼性が高く高性能なコードを生成するための非常に強力な方法です。参照はより信頼できるポインタです。C ++では、使用した機能の料金のみを支払います。C ++についてもっと理解する必要があると思います。
Rocketmagnet

3
「Cは組み込みの言語」という意味がわかりません。もちろん、とても人気があります。最高の言語だと言ってるの?きっとそうではない。
Rocketmagnet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.