4

ベアメタルクロスコンパイラの入力制限は何ですか...ポインタやmallocを使用してプログラムをコンパイルしません...または、基礎となるハードウェア以上のものを必要とするものは何もありません....また、どうすれば見つけることができますかこれらの制限..

また、質問したかった...ターゲットmips用のクロスコンパイラを構築しました..このクロスコンパイラを使用してmips実行可能ファイルを作成する必要があります...しかし、実行可能ファイルがどこにあるかを見つけることができません...そこにあるようにコンパイル、アセンブル、リンクして a.out を生成するはずの mipsel-linux-cpp を見つけましたが、そうしていません...

ただし、./cc1 は mips アセンブリを提供します.......

i386アセンブリを使用してexeを提供するgcc実行可能ファイルを含むインストールフォルダーがあります...ターゲットをmipsとして指定したときに、gcc exeがmipsアセンブリではなくi386を提供する方法がわかりません....

何が起こっているのか本当に理解できない私を助けてください...

私は次の手順に従いました.. 1. binutils 2.19 をインストールしました 2. mips 用に gcc を構成しました..(g++,core)

4

2 に答える 2

4

2 つの別々の質問を開始することをお勧めします。

GNU ツールチェーンには OS への依存関係はありませんが、GNU ライブラリには依存関係があります。GCC のほとんどのベアメタル クロス ビルドは、自分でターゲットにマップする必要がある一連のsyscallスタブを提供する Newlib C ライブラリを使用します。これらのスタブには、ストリーム I/O とヒープ管理を実装するために必要な低レベルの呼び出しが含まれています。必要に応じて、非常に単純なものにも非常に複雑なものにもできます。I/O サポートが標準入力/標準出力/標準エラー出力への UART だけである場合、それは簡単です。すべてを実装する必要はありませんが、I/O スタブを実装しないと、たとえば printf() を使用できなくなります。malloc() を機能させるには、sbrk()/sbrk_r() システムコールを実装する必要があります。

GNU C++ ライブラリは、その基礎となるライブラリとして Newlib を使用して正しく動作します。C++ を使用する場合、C ランタイムの起動 (通常は crt0.s) に静的初期化ループを含めて、コードに含まれる可能性のある静的オブジェクトのコンストラクターを呼び出す必要があります。もちろん、実行時の起動では、プロセッサ、クロック、SDRAM コントローラ、タイマー、MMU なども初期化する必要があります。それはあなたの責任であり、コンパイラの責任ではありません。

私は MIPS ターゲットの経験はありませんが、原則はすべてのプロセッサで同じです。「Building Bare Metal ARM with GNU」という非常に役立つ記事があり、参考になるかもしれません。その多くは関連しています - 特にパーツの移植Newlib スタブの実装について。

他の質問に関しては、コンパイラが mipsel-linux-cpp と呼ばれている場合、それは「ベアメタル」ビルドではなく、Linux ビルドです。また、この実行可能ファイルは実際には「コンパイル、アセンブル、およびリンク」ではなく、プリプロセッサ、コンパイラ、アセンブラ、およびリンカを個別に呼び出すドライバです。ホストツールではなくクロスツールを呼び出すように正しく構成する必要があります。どの標準ライブラリをリンクするか (-nostdlib) を強制的に決定するために、また、アプリケーションが複数の実行ユニットで構成されている場合に、より意味があるため、通常はリンカーを個別に呼び出します。私は常に、私よりも明らかに忍耐力のある人々によって構築された GNU-ARM ツールを使用しており、さらに Windows でホストされているため、ここでそれ以外に多くの支援を提供することはできません。

于 2009-09-14T09:25:52.087 に答える
1

EDIT より多くの時間を利用できるようになったので、より便利なものを提供するために元の回答を書き直しました。

あなたの質問に対して具体的な答えを提供することはできません。MIPS マシンでコードを実行しようとしたことはありません。私が持っているのは、さまざまな「ベアメタル」ボードを立ち上げて実行する豊富な経験です。あらゆる種類の CPU、あらゆる種類のコンパイラ、クロス コンパイラ。そのため、私はそのようなすべての状況に適用される原則を理解しています。このような仕事で成功する前に吸収する必要がある知識の種類を指摘し、その知識の学習を開始するためのリソースへのリンクをいくつか挙げることができれば幸いです.

ポインターがまさにベア メタル コンパイラーが処理できる種類のものであり、基本的なマシン プリミティブであることをあなたが知らないことを心配しています。これは、あなたがおそらく、この特定のシナリオに行き詰まっているエキスパートの組み込み開発者ではないことを示しています。どうでも。組み込みシステムのプログラミングに魔法はなく、知っておくべきことを学ぶことができます。

最初のステップは、C とコードを実行したいマシンとの関係を理解することです。基本的に、C は移植可能なアセンブリ言語です。これは、マシンの基本操作を操作するには C が適していることを意味します。この意味で、マシンの基本的な操作は、メモリ位置の読み取りと書き込み、メモリから読み取ったデータに対する算術演算とブール演算の実行、およびそのデータに基づく分岐とループの決定です。特に、ポインターの C の概念により、指定したメモリ内の場所でデータを操作できます。

ここまでは順調ですが、通常、メモリ内で生の計算を行うだけでは十分ではありません。メモリからデータを入出力する方法が必要です。そのためには、ボード上のハードウェア ペリフェラルを操作する必要があります。ハードウェア ペリフェラルがメモリ マップされている場合次に、周辺機器を制御するために使用されるマシン レジスタはメモリ位置とまったく同じように見え、C はそれらを直接操作できます。その場合でも、有用な I/O を実行するには、その目的のためだけに提供されたルーチンのライブラリを使用して C コア言語を拡張することによって最も適切に処理される可能性が高くなります。これらのライブラリ ルーチンは、ボード上のペリフェラル ハードウェアの操作に関連する厄介な詳細 (タイマー、割り込み、メモリ マップされていない I/O) をすべて処理し、便利な C 関数呼び出しインターフェイスでそれらをラップします。アイデアは、単純に printf("hello world"); に行くことができるということです。ライブラリ呼び出しは、文字列の表示の詳細を処理します。

適切なスキルを持つ開発者は、既存の I/O ライブラリを新しいボードに適合させる方法、または非標準のカスタム ハードウェアへのアクセスを提供する新しいライブラリ ルーチンを開発する方法を知っています。これらのスキルを開発する古典的な方法は、単純なものから始めることです。通常は、出力デバイス用の LED と入力デバイス用のスイッチです。予測可能な方法で LED をパルスする、またはスイッチを読み取って LED に反映するプログラムを作成します。初めてこれを機能させると、非常に満足のいくものになります。

さて、私は十分にとりとめのないことをしました。学習するためのリソースをさらに提供する時が来ました。幸いなことに、ハードウェアとソフトウェアの間のインターフェイスで物事がどのように機能するかを学ぶのに、今ほど良い時期はありません。自由に利用できるコードとドキュメントが豊富にあります。ご存じのとおり、Stackoverflow は優れたリソースです。幸運を!リンクは次のとおりです。

組み込みシステムの概要

C言語をよく知っていることは基本です

実際のハードウェアを試す前に、シミュレーターでコードを動作させてみませんか?

別のエミュレート環境

Linux デバイス ドライバー - 重複するテーマ

ベアメタルプログラミングに関する別の本

于 2009-09-13T07:01:38.183 に答える