I/Oポートアクセスサポート機能

I/Oポートアクセスサポート機能は、入出力デバイスへのアクセスや操作をサポートするための機能である。アドレスを指定したI/Oポートに対して、バイト単位やワード単位で読込みや書込みを行う機能、入出力デバイスの操作時などに使う短い時間の待ち(微小待ち)を実現する機能が含まれる。

I/Oポートアクセスサポート機能は、ライブラリ関数またはC言語のマクロで提供され、これらはタスク独立部およびディスパッチ禁止・割込み禁止の状態から呼び出すことができる。

I/Oポートアクセス

I/O空間とメモリ空間が独立しているシステムでは、I/Oポートアクセス関数はI/O空間のアクセスとなる。メモリマップドI/Oのみのシステムでは、I/Oポートアクセス関数はメモリ空間のアクセスとなる。メモリマップドI/Oのシステムにおいても、これらの関数を利用することにより、ソフトウェアの移植性や可読性が向上する。

out_b - I/Oポート書込み(バイト)

C言語インタフェース

#include <tk/tkernel.h>

void out_b(INT port, UB data);

パラメータ

INT port I/O Port AddressI/Oポートアドレス
UB data Write Data書き込むデータ(バイト)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_IOPORT I/Oポートアクセス機能のサポート

解説

port のアドレスで示されるI/Oポートに、バイト(8ビット)単位で data を書き込む。

out_h - I/Oポート書込み(ハーフワード)

C言語インタフェース

#include <tk/tkernel.h>

void out_h(INT port, UH data);

パラメータ

INT port I/O Port AddressI/Oポートアドレス
UH data Write Data書き込むデータ(ハーフワード)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_IOPORT I/Oポートアクセス機能のサポート

解説

port のアドレスで示されるI/Oポートに、ハーフワード(16ビット)単位で data を書き込む。

out_w - I/Oポート書込み(ワード)

C言語インタフェース

#include <tk/tkernel.h>

void out_w(INT port, UW data);

パラメータ

INT port I/O Port AddressI/Oポートアドレス
UW data Write Data書き込むデータ(ワード)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_IOPORT I/Oポートアクセス機能のサポート

解説

port のアドレスで示されるI/Oポートに、ワード(32ビット)単位で data を書き込む。

out_d - I/Oポート書込み(ダブルワード)

C言語インタフェース

#include <tk/tkernel.h>

void out_d(INT port, UD data);

パラメータ

INT port I/O Port AddressI/Oポートアドレス
UD data Write Data書き込むデータ(ダブルワード)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のすべてのサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_IOPORT I/Oポートアクセス機能のサポート
TK_HAS_DOUBLEWORD 64ビットデータ型(D, UD, VD)のサポート

解説

port のアドレスで示されるI/Oポートに、ダブルワード(64ビット)の data を書き込む。

なお、ハードウェアの制約により、ダブルワード(64ビット)単位でI/0ポートを一括アクセスできないシステムにおいては、ダブルワード(64ビット)よりも短い単位に分割されて処理される。

仕様決定の理由

I/O用のデータバスが32ビット以下の場合など、ハードウェア構成の制約により、ダブルワード(64ビット)単位でのI/0ポートアクセスができないシステムも多く存在する。このようなシステム上には、指定のビット幅のデータを一括して処理するという意味での厳密な out_din_d の仕様は実装できないことになり、このAPIの本来の目的から言えば、out_din_d を未実装とするか、実行時にエラーを返すのが望ましい。しかしながら、実行時にバス構成等を判断してエラーを検出するのは現実的ではないし、64ビットのデータの書込みを32ビット以下の単位に分割して処理しても、問題にならないケースも多い。

このような状況から、out_din_d の仕様においては、64ビットのデータを一括して処理できないケースについても許容している。したがって、out_din_d で64ビットI/Oポートの一括アクセスが保証できるかどうかは実装依存である。64ビットI/Oポートの一括アクセスが必要であれば、システムのハードウェア構成および out_din_d の処理方法の確認が必要である。

in_b - I/Oポート読込み(バイト)

C言語インタフェース

#include <tk/tkernel.h>

UB data = in_b(INT port);

パラメータ

INT port I/O Port AddressI/Oポートアドレス

リターンパラメータ

UB data Read Data読み込んだデータ(バイト)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_IOPORT I/Oポートアクセス機能のサポート

解説

port のアドレスで示されるI/Oポートから、バイト(8ビット)単位で読み込んだデータを、リターンパラメータ data として返す。

in_h - I/Oポート読込み(ハーフワード)

C言語インタフェース

#include <tk/tkernel.h>

UH data = in_h(INT port);

パラメータ

INT port I/O Port AddressI/Oポートアドレス

リターンパラメータ

UH data Read Data読み込んだデータ(ハーフワード)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_IOPORT I/Oポートアクセス機能のサポート

解説

port のアドレスで示されるI/Oポートから、ハーフワード(16ビット)単位で読み込んだデータを、リターンパラメータ data として返す。

in_w - I/Oポート読込み(ワード)

C言語インタフェース

#include <tk/tkernel.h>

UW data = in_w(INT port);

パラメータ

INT port I/O Port AddressI/Oポートアドレス

リターンパラメータ

UW data Read Data読み込んだデータ(ワード)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_IOPORT I/Oポートアクセス機能のサポート

解説

port のアドレスで示されるI/Oポートから、ワード(32ビット)単位で読み込んだデータを、リターンパラメータ data として返す。

in_d - I/Oポート読込み(ダブルワード)

C言語インタフェース

#include <tk/tkernel.h>

UD data = in_d(INT port);

パラメータ

INT port I/O Port AddressI/Oポートアドレス

リターンパラメータ

UD data Read Data読み込んだデータ(ダブルワード)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルがすべて有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_IOPORT I/Oポートアクセス機能のサポート
TK_HAS_DOUBLEWORD 64ビットデータ型(D, UD, VD)のサポート

解説

port のアドレスで示されるI/Oポートから、ダブルワード(64ビット)のデータを読み込み、リターンパラメータ data として返す。

なお、ハードウェアの制約により、ダブルワード(64ビット)単位でI/0ポートを一括アクセスできないシステムにおいては、ダブルワード(64ビット)よりも短い単位に分割されて処理される。

微小待ち

WaitUsec - 微小待ち(マイクロ秒)

C言語インタフェース

#include <tk/tkernel.h>

void WaitUsec(UW usec);

パラメータ

UW usec Micro Seconds待ち時間(マイクロ秒)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_MICROWAIT 微小待ち機能のサポート

解説

指定された時間分(マイクロ秒)の微小待ちを行う。

この待ちは通常ビジーループで実装される。すなわちカーネルの待ち状態ではなく、実行状態のまま微小待ちは行われる。

RAM上で実行する場合、ROM上で実行する場合、メモリキャッシュがオンの場合、オフの場合など、実行環境の影響を受けやすい。したがって、これらの待ち時間はあまり正確ではない。

WaitNsec - 微小待ち(ナノ秒)

C言語インタフェース

#include <tk/tkernel.h>

void WaitNsec(UW nsec);

パラメータ

UW nsec Nano Seconds待ち時間(ナノ秒)

利用可能なコンテキスト

タスク部準タスク部タスク独立部

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_MICROWAIT 微小待ち機能のサポート

解説

指定された時間分(ナノ秒)の微小待ちを行う。

この待ちは通常ビジーループで実装される。すなわちカーネルの待ち状態ではなく、実行状態のまま微小待ちは行われる。

RAM上で実行する場合、ROM上で実行する場合、メモリキャッシュがオンの場合、オフの場合など、実行環境の影響を受けやすい。したがって、これらの待ち時間はあまり正確ではない。