モニタ内関数の使い方

備考

関数一覧

各関数の説明

void wait_msec(long int msec); (ミリ秒待機)
msecミリ秒の間CPUをアイドリングさせる。
この関数の実行中に割り込みが発生した場合、 この関数からの復帰は割り込みにかかった時間だけ遅れる
※この関数はマクロで実装されている。

使用例:1秒待つ

wait_msec(1000);                                      

void wait_usec(long int usec); (マイクロ秒待機)
usecマイクロ秒の間CPUをアイドリングさせる。
インラインアセンブラで実装されており,usecがある程度大きければ精度は非常に高い。
この関数の実行中に割り込みが発生した場合、 この関数からの復帰は割り込みにかかった時間だけ遅れる

使用例:1ミリ秒待つ

wait_usec(1000);
char hgetc(void); (シリアルポートから一文字入力)
シリアルポートから一文字分のデータを受け取る。
この関数の返り値は受け取ったデータである。
この関数はエコーバックを行なわない。 つまり、入力された一文字は端末の画面上に表示されない。

使用例:cに一文字入力してその文字を表示する。

   char c;
   c = hgetc();
   hputc(c);
void hputc(char data); (シリアルポートに一文字出力)
シリアルポートへ data を出力する。

使用例:cに一文字入力してその文字を表示する。

   char c;
   c = hgetc();
   hputc(c);
void hputstr(const char *s); (シリアルポートへ文字列を出力)
シリアルポートへ s が示す文字列を出力する。

使用例:bufの内容を表示する。

   char buf[]="This is hputstr.\r\n";
   hputstr(buf);
void hgetstr(char *s); (シリアルポートから文字列を入力)
シリアルポートから文字列を読み取り、s を先頭とするメモリの領域に格納する。
s が指し示すメモリの領域は, 文字列を格納するのに十分な大きさである必要がある。
この関数はメモリリークを起こす危険性がある。
この関数はエコーバックを行なう。
即ち、入力中の文字列は端末に表示される。
不都合な場合はhgetstr_no_echo()を用いること。

使用例:bufに入力した文字列を格納する。

   char buf[80];
   hgetstr(buf);
void int_enable(void);(割り込み許可)
void int_disable(void); (割り込み禁止)
これらの関数は割り込みを許可/禁止する。
実際にはコンディションコードレジスタ(CCR)の割り込みマスクビット(I)が操作される。

実際のコードは

void int_enable(void)
{
    asm volatile ("andc.b #0x7f,ccr");
}

void int_disable(void)
{
    asm volatile ("orc.b #0x80,ccr");
}

のように短いので、速度が必要な場合は関数呼び出しのオーバーヘッドを避ける為、 直接このように書くべきである。

モニタのシリアル通信機能は割り込みを使用して実装されているので、割り込みを禁止するとシリアル通信が停止することに注意しなければならない。

int int_regist(int num,void (*func)()); (割り込みハンドラの登録)
機能
割り込みハンドラを登録する。
引数
int num---割り込みベクタ番号
void (*func)()---割り込み関数
返り値
成功なら0,失敗なら-1を返す。
割り込みベクタ番号が既定の範囲にない時、この関数は失敗を返して 何も行なわない。
備考
ベクタ番号と割り込み要因との対応関係は, H8のハードウェアマニュアルの割込みコントローラの章にある表にしたがう。
int int_unregist(int num); (割り込みハンドラの登録解除)
機能
割り込みハンドラを登録解除する。
引数
int num---割り込みベクタ番号
返り値
成功なら0,失敗なら-1を返す。
割り込みベクタ番号が既定の範囲にない時、この関数は失敗を返して 何も行なわない。
備考
ベクタ番号と割り込み要因との対応関係は, H8のハードウェアマニュアルの割込みコントローラの章にある表にしたがう。

int_unregistは、実際にはモニタで定義されている既定のハンドラを登録する。
現時点では、既定のハンドラは呼び出されると警告を出して何もしない。
この動作はあまり好ましくないので、近い将来に変更される可能性が高い。

void hprintf(char *fmt, ...); (書式つき出力)
シリアルポートに書式付き出力を行なう。

使い方はprintfとほぼ同じであるが、使える書式文字は%d,%l,%s,%c,%A,%Bであり、 %Aはアドレスを表示する際に使われるlong型6桁16進、%Bはデータを表示するchar型2桁16進 %lはlong型10進である。桁数の制御などの機能は一切実装されていない。

void monitor_set_heap_end(char *new_heap_end); (sbrkの設定)
機能
sbrk用にヒープ領域の終端位置を教える。
引数
new_heap_end -- ヒープ領域の終端位置
使い方
サンプルプログラム中に含まれているservice.cを見る事
備考
sbrk及びそれを利用する標準関数(printf,scanf等)は モニタと共にROMに格納されるが、sbrkによって確保 されるべきメモリの領域は、ユーザープログラムがロード されるまで知る事が出来ない。この関数はsbrkによって 確保されるべきメモリの開始位置、すなわちヒープ領域の 終端位置をsbrkに通知する。
void log_set_mem(char *ptr, int s); (ログ用メモリ領域の設定)
機能
ログ用のメモリ領域を指定する。
引数
ptr--メモリ領域先頭へのポインタ
s--メモリ領域のサイズ
使い方
サンプルプログラム中のservice.cを参照の事。
備考
メモリ領域のサイズは、log.c中で定義されている MINIMUM_BUFFER_SIZEよりも大きくなくてはならない。
void log_putc(char c);
void log_putstr(const char *s);
void log_printf(char *fmt, ...);
これらの関数はログに対して出力を行なう事以外はhputc,hputstr,hprintfと同等である。 これらの関数を呼び出す前にlog_set_memによってバッファを確保しなければならない。 サンプルプログラム中ではservice.c内で既にバッファが確保されている。
char hinkey(void); (シリアルポートから一文字入力(入力待ちなし))
シリアルポートから一文字分のデータを受け取る。ただし、入力待ちを行なわない。 呼び出された時点で、文字が入力されていればその文字を、されていなければ'\0'を返す。
void hflush(void); (出力バッファが空になるまで待機)
出力バッファが空になるまで待機する。
hputc等で出力された文字は一旦送信待ちバッファに格納された後に順次SCIへと送られるが、 この関数を使うと全ての文字が実際にSCIに送られるまで待機することが出来る。

機械研データライブラリに戻る