再ターゲット — ターゲットシステムへの適合
ターゲットシステムでアプリケーションを実行する前に、ランタイム環境の一部(通常はシステムの初期化とDLIB 低レベルI/O インタフェース関数)を適応させる必要があります。
システム初期化を適応させます。
アプリケーションが割り込み処理やI/O処理、ウォッチドッグタイマなどを初期化しなければならないときなどに、システムの初期化を適応しなければならないことがよくあります。これを行うには、
__low_level_initルーチンを実装します。このルーチンはデータセクションの初期化の前に実行されます。システムの起動と終了およびシステム初期化を参照してください。注記
これについてデバイス固有の例が製品のインストールに付属のサンプルプロジェクトにあります。インフォメーションセンタを参照してください。
ターゲットシステムに合わせてランタイムライブラリを適応させます。こうした関数を実装するには、DLIB低レベルインタフェースを十分に理解してください(再ターゲットの概要を参照)。
通常はアプリケーションが以下を使用する場合に、自身の関数を実装する必要があります。
標準I/Oストリーム
これらのストリームのいずれかが、たとえば
printfおよびscanfなどの関数に使用される場合、独自バージョンの低レベル関数__readと__writeを実装する必要があります。低レベル関数は、開かれたファイルなどのI/Oストリームを、ファイルハンドル(固有の整数)を使用して識別します。通常、
stdin、stdout、stderrに関連付けられているI/Oストリームは、それぞれ0、1、2のファイルハンドルを持ちます。ハンドルが-1の場合、すべてのストリームがフラッシュされます。ストリームはstdio.hで定義されます。ファイルI/O
このライブラリには、
fopenやfclose、fprintf、fputsなど、ファイルのI/O処理のための数多くの強力な関数が含まれています。これらの関数はすべて、いくつかの低レベル関数を呼び出し、それぞれ特定のタスクを1 つ実行するように設計されています。たとえば、__openはファイルを開き、__writeは文字を出力します。これらの低レベル関数の独自のバージョンを実装してください。signalとraiseこれらの関数のデフォルトの実装から必要な機能が得られなければ、独自のバージョンを実装できます。
timeとdate
time関数およびdate関数を機能させるには、関数
clock、__time32、__time64、__getzoneを実装する必要があります。__time32と__time64のどちらを使用するかは、time_tでどのインタフェースを使用するかによって決まります(time.hを参照)。アサート(__aeabi_assertを参照)。
環境の操作
systemやgetenvのデフォルトの実装から必要な機能が得られなければ、独自のバージョンを実装をできます。
関数の情報については、DLIB低レベルI/Oインタフェースを参照してください。
自作モジュールでオーバライドできるライブラリファイルは、
arm\src\libディレクトリにあります。低レベルI/Oインタフェースの関数を実装したら、これらの関数の独自のバージョンを自分のプロジェクトに追加する必要があります。これについては、ライブラリモジュールのオーバライドを参照してください。
注記
IDLIB低レベルI/Oインタフェース関数を実装し、C-SPYエミュレートI/Oのサポート付きで構築されたプロジェクトを追加する場合、C-SPYエミュレートされたI/O関数ではなく、低レベル関数が使用されます。たとえば、独自のバージョンの
__writeを実装すると、C-SPY[ターミナルI/O]ウィンドウへの出力はサポートされません。C-SPYによりエミュレーションされたI/Oの概要を参照してください。ターゲットシステムでアプリケーションを実行する前に、Release ビルド構成を用いてプロジェクトをリビルドする必要があります。つまり、リンカはC-SPYによりエミュレーションされたI/Oメカニズムと、それにより提供される低レベルI/O関数をインクルードしません。直接または間接的に、標準I/Oインタフェースの低レベル関数のいずれかをアプリケーションが呼び出し、プロジェクトにこれらが含まれない場合、リンカは低レベル関数を持たないものすべてについてエラーを表示します。
注記
デフォルトでは、
NDEBUGシンボルはリリースビルド構成で定義される点に注意してください。つまり、アサートは確認されません。詳細については、__aeabi_assertを参照してください。