適用範囲:DS-5, RealView Development Suite (RVDS), ARM Developer Suite (ADS)
C++ライブラリは、ターゲット固有のC ライブラリのサポートに依存します。 C++ライブラリにターゲットへの依存性はありません。
C++ストリームI/Oをリターゲットするために、我々は_sys_xxxドライバレベル関数をリターゲットすることを推奨します。これらは、C及びC++ライブラリに使用される関数であり、ターゲット固有のI/Oに影響があります。デフォルト実装では、ホストマシン上のI/Oを扱うためにセミホスティングを使用します。
ARM Compiler toolchain C and C++ libraries documentationおよびRVDS Compiler and Libraries Guide は、どの関数が再実装されなければならないか論じています。 要約すると以下の通りです。
_sys_open()
_sys_close()
_sys_read()
_sys_write()
_sys_ensure()
_sys_flen()
_sys_seek()
_sys_istty()
_sys_tmpnam()
_sys_exit()
_ttywrch()
C++ストリームI/OをUART(Terminal Emulatorへ接続された)へリダイレクトするために 使用されるファイル(retarget.c)が例として、以下のページよりダウンロードできます。
http://infocenter.arm.com/help/topic/com.arm.doc.faqs/attached/3844/retarget.c
標準入出力関数の入出力先を変更するには、fgetc()やfputc() のような低レベルライブラリ関数が再実装されなければなりません。
ADSv1.2、RVDSv3.x、RVDS 4.xおよびDS-5では、fgetc()やfputc()といった関数のみが再実装が必要です。RVDSv2.xでは追加のライブラリ関数(cinで使われる)__fread_bytes_avail()も再実装が必要です。
デフォルトの__fread_bytes_avail()はfgetc()を呼び出すことによって、 バッファがいっぱいになるかEOFを検出するまでバッファを埋めます。従って、入出力先が変更されたfgetc()は、ただ単にUART(EOFを返さない)からの文字列を返します。__fread_bytes_avail()は、fgetc()をコールすることによって、1文字を読み出すよう再実装されなければなりません。
#ifdef __cplusplus
extern "C"
#endif
size_t __fread_bytes_avail(void *buf, size_t nbytes, FILE *stream)
/* Read a single character into buf[] using fgetc() */
{
*(char *)buf = (char)fgetc(stream);
return 1;
}
この関数を、"Application Note 107のコードembeddedswSourceに追加してください。
ADSユーザに対しては、一般的なI/O関数のリターゲットの方法についてApplication Note 107に記載されています。RVDSユーザについては一般的なI/O関数のリターゲットの方法はRVDSのマニュアルに、DS-5のユーザにはARM Compiler toolchainのマニュアルにそれぞれ記載があります。