1.20 C ライブラリでのターゲットに依存するシステム入出力関数の再定義

デフォルトのターゲットに依存する入出力関数は、セミホスティングを使用します。これらの関数のいずれかが再定義される場合は、これらの関数のすべてが再定義される必要があります。

関数プロトタイプは rt_sys.h に収録されています。これらの関数は、C 標準入出力ライブラリ関数によって呼び出されます。例えば、_sys_open() は、fopen() および freopen() によって呼び出されます。_sys_open() は、C ライブラリの初期化中に文字列 __stdin_name__stdout_name、および __stderr_name を使用して、返す標準 I/O デバイスハンドルを特定します。_sys_open() がこれらの関数を使用しない場合、これらの値をデフォルト(:tt)として保持できます。
以下の例では、デバイスで必要な関数を再定義する方法を示します。このデバイスでは、書き込みはサポートされますが読み取りはサポートされません。

システム入出力関数のターゲット変更の例

/*
 * これらの名前はライブラリ初期化中に
 * stdin、stdout、および stderr に対して開かれたファイル名として使用されます。
 * 同じファイルハンドルを返すように _sys_open() を定義すると、
 * これらはデフォルト値のまま保持されます。
 */
const char __stdin_name[] =  ":tt";
const char __stdout_name[] =  ":tt";
const char __stderr_name[] =  ":tt";

FILEHANDLE _sys_open(const char *name, int openmode)
{
  return 1; /* すべて同じ出力になります */
}
int _sys_close(FILEHANDLE fh)
{
  return 0;
}
int _sys_write(FILEHANDLE fh, const unsigned char *buf,
               unsigned len, int mode)
{
  your_device_write(buf, len);
  return 0;
}
int _sys_read(FILEHANDLE fh, unsigned char *buf,
              unsigned len, int mode)
{
  return -1; /* not supported */
}
void _ttywrch(int ch)
{
  char c = ch;
  your_device_write(&c, 1);
}
int _sys_istty(FILEHANDLE fh)
{
  return 0; /* バッファ処理された出力 */
}
int _sys_seek(FILEHANDLE fh, long pos)
{
  return -1; /* not supported */
}
long _sys_flen(FILEHANDLE fh)
{
  return -1; /* not supported */
}
rt_sys.h では FILEHANDLE 型が定義されています。FILEHANDLE の値は _sys_open() によって返され、ホストシステム上で開いているファイルの識別に使用されます。
システム入出力関数が再定義された場合は、通常の文字の I/O とワイドキャラクタの I/O が両方とも動作します。つまり、これらの関数ではワイドキャラクタの I/O のために追加の操作は必要ありません。
関連する概念
1.14 C ライブラリ printf ファミリ関数
1.15 C ライブラリ scanf ファミリ関数
1.16 C ライブラリで高レベルライブラリ関数の直接使用を有効化するための低レベルライブラリ関数の再定義
1.17 C ライブラリ関数 fread()、fgets()、および gets()
1.18 C ライブラリでの __backspace() の再実装
1.19 C ライブラリでの __backspacewc() の再実装
関連する参考文書
1.12 C および C++ ライブラリでの入出力関数のカスタマイズ
1.13 C および C++ ライブラリ内での低レベル関数のターゲット依存関係
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.