OS がサポートされていない Arm ボードで作業しています。デスクトップ コンピュータで C++ コードをテストしました。正常に動作しています。arm-elf-g++ を使用してコードをクロス コンパイルした後に生成された bin ファイルをダンプする必要があります。私のコードは fopen コマンドを使用してファイルを開いてその内容を読み取りますが、OS がなく、ファイル システムがないため、これはボードで機能しますか?
ありがとう vid09
ターゲットライブラリには、おそらくfopen()スタブがあります。動作しているバージョンと置き換える必要がある、機能していない空の関数定義。これは、リターゲティングとして知られています。再ターゲットしないと、コードはコンパイルおよびリンクされる可能性がありますが、fopen()呼び出しや、たとえばprintf()を含むその他の標準I/O呼び出しは何もしません。
リターゲットの方法は、コンパイラの標準Cライブラリによって異なります。Keil / RealViewでは、提供されているretarget.cの例の1つを変更して、プロジェクトにリンクできます。Newlib(ベアメタルGNUツールチェーンで一般的に使用される)を使用している場合は、syscallsスタブを変更または再実装する必要があります。他のツールチェーンにも同様の方法があります。
ただし、ファイルを開くにはファイルシステムが必要であり、ファイルとして読み取ることができるデータを含む何らかの形式のメディアが必要になるため、これはかなり学術的なことです。これらはすべてベアメタルシステムで実行できますが、追加のハードウェアとソフトウェアの両方が必要です。たとえば、FatFを参照してください。たとえば、SPIインターフェイスを介してSDまたはMMCカードを追加することは、ハードウェアの観点からは比較的簡単です。もちろん、RAMディスクまたはファイルシステムをオンチップフラッシュに実装することもできますが、そもそもそのようなファイルシステムにデータを取り込む方法を検討する必要があります。
ファイルを開いて読み取るのはなぜですか?そのデータは何ですか?
他の方法で埋め込みコードに提供することもできます。例えば
ベアメタルでファイルI/Oを使用する一般的な方法は、デバッグ用です。この場合、通常はセミホスティングを使用して実装されます。
CS3は、オペレーティングシステムなしでボードをサポートするように設計されています。オペレーティングシステムをサポートせずになどの機能を使用できるよう
open
にするために、デバッガーと組み合わせてセミホスティング機能がサポートされています。write
セミホスティングを有効にすると、これらのシステムコールは、ホストシステムで同等の関数呼び出しに変換されます。これらの関数呼び出しは、デバッガーに接続している間のみ使用できます。デバッガーから切断されたときにそれらを使用しようとすると、ハードウェア例外が発生します。
明らかに、これはスタンドアロン設定では機能しません。
ただし、必要な呼び出しを自分で実装することを選択できます。これは、使用しているCランタイムライブラリによって異なります。Newlibでそれを行う方法のチュートリアルは次のとおりです:http ://www.embedded.com/electronics-blogs/industry-comment/4023922/Embedding-GNU-Newlib-Part-2