3

組み込み開発のためにどの言語を学ぶべきかという前に、私は質問をしました。ほとんどの組み込みエンジニアは、cとc ++は必須であると述べましたが、チップに依存することも指摘しました。

誰かが明確にすることができますか?それはコンパイラの問題ですか、それとも何ですか?チップには独自のコンパイラ(acコンパイラやc ++コンパイラなど)が付属していますか?そのため、コンパイラが知っている言語を使用する必要がありますか?他の場所でコーディングしてコンパイルし、コンパイルされた状態で直接チップに書き込むことはできませんか?(知人がこの趣旨で何か言っているのを聞いたと思います)

組み込みシステムやその仕組みについてはよくわからないので、これがどのように機能するかはわかりません。知っている人にとっては、おそらく簡単な答えでしょう。

4

8 に答える 8

6

おそらく、それらはいくつかのツールチェーンがC++をサポートしていないことを意味しました。はい、多くのチップとボードには独自のツールチェーンが付属しています。プロセッサが異なれば命令セットも異なります。つまり、コンパイラも異なります(より具体的にはバックエンドも異なります)。それはあなたが常にすべてを再学習しなければならないという意味ではありません。これらの多くはGCCに基づいています(多くの場合、最も移植されたコンパイラと見なされます)。最終的な実行可能ファイル/画像形式も異なるため、特定のリンカーが必要です。ほとんどの場合、「通常の」コンピューターでチップを(クロス)コンパイルしてから、チップに焼き付けます。ただし、これは、デスクトップオペレーティングシステムを対象とした一般的なコンパイラとリンカを使用できるという意味ではありません。

于 2010-07-18T05:49:08.290 に答える
4

これは、次の3つの方法で「チップに依存」します。

  1. 一部の非常に制約のあるアーキテクチャはC++に適していないか、少なくともC ++はそのようなアーキテクチャに適さない構造を提供するため、Cに勝る利点はありません。ほとんどの8ビットデバイスはこのカテゴリに分類されますが、すべてではありません。たとえば、MegaAVRに実装された便利なC++コードを見てきました。

  2. 一部のデバイスは、C++コンパイラでサポートされていません。たとえば、MicrochipのdsPIC / PIC24コンパイラはCのみです(サードパーティのツールはC ++をサポートしている場合があります)。

  3. チップアーキテクチャは、特定の言語用に特別に設計されています。たとえば、INMOSトランスピュータは常にOCCAMを実行していました。

C、C ++の他に、アセンブラー、Forth、Ada、Pascalなど多くの可能性がありますが、Cはほぼ遍在しています。初日からCコンパイラを利用できなくても、新しいアーキテクチャやデバイスをリリースするチップベンダーはほとんどありません。他の言語の場合、通常、サードパーティが開発を決定するまで待つ必要があり、その待機はニッチなアーキテクチャにとって永遠に続く可能性があります。

他の場所でコーディングしてコンパイルし、コンパイルされた状態で直接チップに書き込むことはできませんか?

これはクロスコンパイルまたはクロス開発と呼ばれ、組み込みシステムの通常の開発方法です。ほとんどの組み込みシステムには、コンパイラをセルフホストするためのOS、ファイル、パフォーマンス、およびメモリリソースが不足しており、ほとんどの開発者は、使い慣れたユーザー指向のデスクトップOSでIDEやデバッガなどを使用した洗練された開発環境の快適さを望んでいます。

組み込みシステムやその仕組みについてはよくわからないので、これがどのように機能するかはわかりません。

これらのいくつかでスピードを上げてください:

于 2010-07-20T22:42:06.023 に答える
3

はい、Cコンパイラが存在するアーキテクチャはたくさんありますが、C++コンパイラは存在しません。選択するプロセッサが小さく、機能が不十分であるほど、この状況が発生する可能性が高くなります。

組み込み開発の場合、ほとんどの場合、「他の場所」でコードをコンパイルしてから、実行/デバッグのためにチップに送信します。コンパイラ自体が構築されているのとは異なるアーキテクチャのコードをコンパイルするプロセスは、「クロスコンパイル」と呼ばれます。

于 2010-07-18T05:49:07.100 に答える
3

正解です。チップにはコンパイラのバリエーションがあります。ほとんど/多くの最新のチップにはgccポートがあります。すべてではありません。

于 2010-07-18T05:54:16.057 に答える
1

「組み込み」という用語は、さまざまなハードウェアを表すために使用されます。ほとんどの組み込みソフトウェアエンジニアリングは、ターゲットマイクロプロセッサ用のバイナリを生成するためのC / C ++コードの記述で構成されますが、コンパイルされたバイナリでコード化されていないデバイスもあります。

一例として、プログラマブルロジックコントローラー(PLC)があります。これらのデバイスは、「ラダーロジック」と呼ばれる言語を使用します。それは素晴らしい言語です。私は過去にそれを使って作業するのを楽しんだ。

私が過去に経験したように、あなたが遭遇するかもしれないもう一つのことは、BASICエミュレーターを解釈したデバイスです。うまくいけば、それは今日ではまれです。

于 2010-07-18T13:15:06.233 に答える
1

C / C ++は、ファームウェア開発に非常に適しています。したがって、作成するソフトウェアは組み込みCPU/マイクロコントローラーで実行されます。デバイスを適切にプログラマーにするには、言語とデバイスアーキテクチャを知っている必要があります。

同じコードは、おそらく異なるデバイスでは機能しません。したがって、言語とデバイスアーキテクチャを学ぶ必要があります。

もう1つのオプションは、マイクロコントローラーではないFPGAです。FPGAは、マイクロコントローラーを含むあらゆるタイプの同期回路でそれ自体を変換できる特殊なセルを備えたデバイスです。FPGAは、VerilogやVHDLなどのハードウェア記述言語でプログラムされています。ソフトウェアの「コンパイル済み」(合成)バージョンは、ゲートウェアと呼ばれます。

HDLは、ASICの設計にも使用されるのと同じ言語です。言語を正しく学ぶための道は長いです。したがって、低コストで広く受け入れられているマイクロコントローラーであるPIC形式のMicrochipを使用したC /C++から始めることをお勧めします。

FPGA開発を行う場合、FPGAにはCPU /マイクロコントローラーが組み込まれている必要があるため、C / C ++/picで得られた知識は有用で重要です。

于 2010-07-30T21:34:58.067 に答える
1

それには直接的な科学的理由はありません。多くの場合、それは特定の会社の経営と政治に関係しています。

一部の企業は、ターンキーシステムを作成し、そのシステムを購入してメンテナンスの費用を支払うように強制されています。個々の開発者を締め出しますが、サポートがはるかに優れていることが多く、ニーズに合わせて製品の方向性を決めることができるため、このモデルを好む多くの企業や政府機関があります。

他の企業にはスタッフや才能がなく、ソリューションをアウトソーシングし、時には彼らが得ることができるものは何でも取ります。そして、請負業者が去った後は二度と更新または修正されない、または修正された場合は他の誰かによるパッチジョブである、一度だけ開発されたツールになってしまう可能性があります。お金を稼ぐにはお金がかかりますが、製品を売る前にお金が足りなくなっても失敗します。

社内にツールを購入しなければならないスタッフがいて、gccのようなオープンツールにも貢献している個人がいる会社がある場合があります。

会社の政治や経営陣には、世界がどうあるべきかについて強い意見を持ち、特定の言語用のツールの開発のみを許可する個人がいる場合があります。あるいは、特定の言語を使用する会社が所有または提携している、あるいはそのような会社であり、このチップ製品は単にその言語をサポートするようになったのかもしれません。

これらすべてに加えて、メモリスペース、命令セットの品質と効率、およびコンパイラの使いやすさという非常に現実的な技術的な問題があります。一部のアーキテクチャはアセンブラに適している場合がありますが、高レベルのコンパイル済みコードは、限られたメモリリソースをすぐに消費します。

特にGccには、内部的に多くの問題があります(人としてではなく、ソフトウェア/ソースコード自体)。そこにあるチュートリアルでも、バックエンドを書くようにあなたに挑戦します。会社は、毎年gccバックエンドを作成して維持するために、専門的な才能を必要とします。そうしないと、あなたは捨てられてしまいます。チップアーキテクチャが32ビット以上でない場合、すでにgccとの敗戦を戦っています。チップアーキテクチャはコンパイラに対応している可能性がありますが、一般的なコンパイラの設計には対応していません。

近い将来、llvmはgccと比較してクロスコンパイラとして輝きを放ちます。これは、この内部バルクがまだ構築されていないためです。おそらく、内部ガット自体が定義された言語/システムであるため、gccに起こったことに苦しむことはないでしょう。より多くの人々がllvmに慣れてくると、それに移植された多くのアーキテクチャが見られるでしょう。msp430バックエンドは、午後に文字通りターゲットを追加できることを示すために特別に作成されました。来月末までに、やる気のある個人の中には、私たちのほとんどがこれまで聞いたことのあるすべてのターゲットをllvmに移植できるようになる可能性があります。そして、クロスコンパイラを構築する必要はありません。それは常にクロスコンパイラです。llvmについてのみ言及します。これは、悪いツールで回復するのに苦しんでいるターゲットに対してドアが開いているためです。

一部の企業、特にマイクロコントローラーは、プログラミングインターフェイスを独自仕様にすることができ、今後もそうするため、プログラミングツールを使用する必要があります(または、ハッキングして、結果を公開したり、猫とマウスで変更して自分を打ち負かしたりする必要があります)。 。そして、彼らはWindows用のツールを作っただけで、LinuxとAppleの人々は風にぶら下がっていたのかもしれません。または、ロードするバイナリがツールによって生成されたものだけになるようにします。ここでも、代替コンパイラを許可するバイナリ形式をハックすることができ、それらはあなたを打ち負かすために機能する場合と機能しない場合があります。

技術的な問題にもかかわらず、最大のものは、企業の政治、管理、マーケティングチーム、およびエンジニアリングスタッフの人材の供給または不足です。結論として、テクノロジーや科学ではなくドルをたどって、なぜこの言語がサポートされているのか、それがサポートされていないのか、またはこの言語のサポートが良い、悪い、または限界である理由を理解してください。

これらすべての結果として、どの言語を学ぶべきでしょうか?少なくとも3つの異なるアーキテクチャでアセンブラから始めます。次にC、そして本当に必要だと感じたらC++です。Cとアセンブラーは、組み込みの主要言語です(組み込みの定義によって異なります)。いいえ、主に初期ブートコード用にアセンブラを記述し、コンパイラが作成できないC、割り込み、または特別な命令をサポートします。マイクロコントローラーのように、ツールや限られたチップリソースなど、さまざまな理由でアセンブラーを使用することが非常に理にかなっている場所があります。アセンブラーを使用しない場合でも、アセンブラーを使用すると、はるかに優れた高レベルのプログラマーになります。

埋め込みの定義を決定する必要があります。それは、(n組み込み)Linuxシステム上のアプリケーションのAPIおよびライブラリ呼び出しですか(デスクトップシステム上の同じプログラム/呼び出しと区別できません)。または、スペクトルの反対側で、おそらく256バイトまたは1024バイト(メガまたはギガではなくバイト)のプログラムスペースを備えたマイクロコントローラーについて話しているのでしょうか。または途中で何か?そこにある「埋め込まれた」人々の大多数は、深く埋め込まれたものよりも、オペレーティングシステム(rtos、linux、winceなど)上のアプリケーションのAPI呼び出しに近いので、C、おそらくC ++(常に落ちることができます)を意味しますC)に戻り、リソースを大量に消費するPythonやその他のスクリプト言語を避けようとします。

于 2010-07-31T04:56:55.700 に答える
0

一部の8ビットパーツは、スタックからのデータに効率的にアクセスできません。スタックを使用してパラメーターを渡す代わりに、自動変数とパラメーターが静的に割り当てられます。通常、リンカはメモリの一方の端でmain()に自動変数を割り当て、次にmainだけで呼び出される関数に変数を割り当て、次にそれらの関数だけで呼び出される関数に変数を割り当てます。など。これにより、いくつかの注意事項がありますが、最適な割り当てがかなり簡単に得られます。

  1. 再帰は、変数をある種のスタック配置に明示的にコピーするコードを追加することによってのみサポートできます。多くのコンパイラでは、まったくサポートされていません。
  2. 関数が別の関数を「呼び出す可能性がある」ように見える場合、リンカはすべての場合に呼び出すことができると想定します(たとえば、「foo」が「bar」を呼び出す場合、そのパラメータの1つは常に次のような値を持つ可能性があります。 「bar」は「boz」を呼び出しませんが、リンカーはそれを認識しません)。
  3. 特定のシグニチャを持つ関数ポインタへの呼び出しは、アドレスが取得された同じシグニチャを持つすべての関数への呼び出しと見なされます。
  4. 関数に対する複数のパラメーターの評価で追加の関数呼び出しを行う必要がある場合、パラメーターストレージの最適な配置で回避できたとしても、通常、追加の一時ストレージを悲観的に割り当てる必要があります。

上記の制限がまったく問題にならないCプログラムには多くの種類がありますが、多くの種類のCプログラムでは、迷惑ではありますが大きなものではありません(たとえば、ダミーパラメータや戻り値を追加して、間接的に呼び出される関数のさまざまなクラスを確保するなど)。異なる署名があります)。残念ながら、C ++からCへのプリコンパイラによって生成されるコードには、ほとんどの場合、コールグラフを合理的に分割できない関数ポインタが含まれるため、このようなプラットフォームでC++を使用することは不可能ではないにしても困難になりがちです。

于 2010-08-02T16:03:31.700 に答える