2.3.3. 非セミホスティング環境向けのアプリケーションの作成

セミホスティング機能をまったく使用しない場合は、セミホスティング機能に対するすべての呼び出しを削除するか、非セミホスティング機能を使用してこれらの関数を再実装する必要があります。

セミホスティング機能を使用しないアプリケーションを作成するには

  1. セミホスティング呼び出しを使用する関数やターゲットメモリマップに依存する関数など、ターゲット依存機能を実装するソースファイルを作成します。

  2. __use_no_semihosting シンボルをソースに追加します。 セミホスティングの無効化を参照して下さい。

  3. 新しいオブジェクトをアプリケーションにリンクします。

  4. ターゲット依存アプリケーションの作成時に新しいコンフィグレーションを使用します。

C ライブラリをターゲット依存関数から分離するときに使用される関数を再実装する必要があります。 例えば、printf() を使用する場合は、fputc() を再実装する必要があります。 printf() のような高レベル入出力関数を使用しない場合は、fputc() などの低レベル関数を再実装する必要はありません。

異なる実行環境向けのアプリケーションを作成する場合は、ターゲット依存関数を再実装できます。 例えば、セミホスティング呼び出しを使用する関数やターゲットメモリマップに依存する関数を再実装できます。 C++ ライブラリにはターゲット依存関数はありませんが、C++ 関数の中には、ターゲット依存関数である、基礎となる C ライブラリ関数を使用するものがあります。

ホステッド環境を使用しない組み込みアプリケーションのサンプルは、...\emb_sw_dev のメインサンプルディレクトリにあります。

組み込みアプリケーションの作成例については、『デベロッパガイド』を参照して下さい。

非セミホステッド環境における C++ 例外

C++ 標準では、abort() を呼び出すには、デフォルトの C++ std::terminate() ハンドラを使用するように規定されています。 abort() のデフォルトの C ライブラリ実装は、セミホスティングのサポートを必要とする関数を使用します。 したがって、非セミホステッド環境で例外を使用する場合は、abort() に代わる関数実装を指定する必要があります。

セミホスティング依存関数の概要

Table 2.3 に、セミホスティングに直接依存する関数を示します。

Table 2.3. 直接セミホスティング依存関数

関数説明
__user_initial_stackheap()ランタイムメモリモデルのカスタマイズを参照して下さい。 分散ロードを使用している場合は、この関数の再実装が必要になる場合があります。
_sys_exit() _ttywrch()エラー通知、エラー処理、プログラム終了処理のカスタマイズを参照して下さい。
_sys_command_string(),
_sys_close(), _sys_ensure(),
_sys_iserror(), _sys_istty(),
_sys_flen(), _sys_open(),
_sys_read(), _sys_seek(),
_sys_write(), _sys_tmpnam()
入出力関数のカスタマイズを参照して下さい。
clock(),
_clock_init()remove(),
rename()system(), time()
その他の C ライブラリ関数のカスタマイズを参照して下さい。

Table 2.4 に、Table 2.3 に示した関数に間接的に依存する関数を示します。

Table 2.4. 間接セミホスティング依存関数

関数使用法
__raise()C シグナルサポートなしで C ライブラリ例外をキャッチ、処理、または診断します。 エラー通知、エラー処理、プログラム終了処理のカスタマイズを参照して下さい。
__default_signal_handler()C シグナルサポートを使用して C ライブラリ例外をキャッチ、処理、または診断します。 エラー通知、エラー処理、プログラム終了処理のカスタマイズを参照して下さい。
__Heap_Initialize()メモリ割り当てを選択または再定義します。 ストレージ管理のカスタマイズを参照して下さい。
ferror(), fputc(), __stdoutprintf ファミリを再実装します。 入出力関数のカスタマイズを参照して下さい。
__backspace(), fgetc(),
__stdin
scanf ファミリを再実装します。 入出力関数のカスタマイズを参照して下さい。
fwrite(), fputs(), puts(),
fread(), fgets(), gets(),
ferror()
ストリーム出力ファミリを再実装します。 入出力関数のカスタマイズを参照して下さい。

セミホスティングの無効化

C 言語でアプリケーションを記述する場合には、C ライブラリ関数を直接使用しない場合でも、そのアプリケーションを C ライブラリにリンクする必要があります。 C ライブラリには、コンパイラヘルパ関数と初期化コードが含まれています。 C ライブラリ関数の中には、セミホスティングを使用するものもあります。

セミホスティングを使用しないようにするには、以下のいずれかの手順を実行します。

  • アプリケーションに関数を再実装します。

  • セミホステッド関数をまったく呼び出さないようなアプリケーションを記述します。

セミホスティングを使用する関数がアプリケーションに存在しないことを確実にするには、以下のいずれかを使用します。

  • アセンブリ言語の IMPORT __use_no_semihosting

  • C 言語の #pragma import(__use_no_semihosting)

ライブラリ関数を使用してセミホスティングを使用する関数をインクルードし、__use_no_semihosting も参照している場合、ライブラリによって競合するシンボルが検出され、リンカによってエラーが報告されます。 どのオブジェクトがセミホスティングを使用しているかを確認するには、--verbose --list=out.txt を指定してリンクし、出力でシンボルを検索し、どのオブジェクトがこのシンボルを参照しているのかを確認します。 詳細については、『リンカ / ユーティリティガイド』リンカの診断の制御 (ページ 2-41)を参照して下さい。

API 定義

Table 2.3Table 2.4で示したセミホステッド関数の他に、異なる環境用にアプリケーションを構築する際に役立つ関数とファイルをTable 2.5 に示します。

Table 2.5. 最新の API 定義

ファイルまたは関数説明
__main()
__rt_entry()
ランタイム環境を初期化し、ユーザアプリケーションを実行します。
__rt_lib_init()
__rt_exit() 
__rt_lib_shutdown()
ランタイムライブラリを初期化または終了します。
LC_CTYPE ロケールその地域の文字体系の文字プロパティを定義します。 アセンブラマクロによるロケールと CTYPE のカスタマイズを参照して下さい。
rt_sys.hデフォルト(セミホステッド)実装がセミホスティング呼び出しを使用する関数をすべて記述した C ヘッダファイルです。
rt_heap.hストレージ管理の抽象データ型を記述した C ヘッダファイルです。
rt_locale.h5 つのロケールカテゴリのファイルシステムを記述し、ロケールカテゴリの内容の記述に役立つ複数のマクロを定義している C ヘッダファイルです。
rt_misc.h多様で無関係な、C ライブラリへのパブリックインタフェースを記述した C ヘッダファイルです。
rt_memory.sコードがなくコメントのみを含む、メモリモデルのプロトタイプ実装です。 このファイルの説明については、独自のメモリモデルの記述を参照して下さい。

標準 ARM ライブラリ内にある関数を再実装する場合、リンカは、標準 ARM ライブラリではなくユーザのプロジェクトのオブジェクトまたはライブラリを使用します。 プロジェクトに追加するライブラリの名前は、ARM ライブラリの命名規則に従う必要はありません。

Caution

ARM Limited によって提供されたライブラリを置き換えたり削除したりしないで下さい。 また、提供されているライブラリファイルの上書きも行わないで下さい。 再実装関数は、別のライブラリ内に配置する必要があります。

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential