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書き込むデータ(バイト)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_IOPORT I/Oポートアクセスをサポート

解説

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

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

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書き込むデータ(ハーフワード)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_IOPORT I/Oポートアクセスをサポート

解説

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

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

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書き込むデータ(ワード)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_IOPORT I/Oポートアクセスをサポート

解説

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

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

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書き込むデータ(ダブルワード)

利用可能なコンテキスト

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

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

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

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_d()in_d() の仕様は実装できないことになり、このAPIの本来の目的から言えば、out_d()in_d() を未実装とするか、実行時にエラーを返すのが望ましい。しかしながら、実行時にバス構成等を判断してエラーを検出するのは現実的ではないし、64ビットのデータの書込みを32ビット以下の単位に分割して処理しても、問題にならないケースも多い。

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

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。

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読み込んだデータ(バイト)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_IOPORT I/Oポートアクセスをサポート

解説

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

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

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読み込んだデータ(ハーフワード)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_IOPORT I/Oポートアクセスをサポート

解説

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

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

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読み込んだデータ(ワード)

利用可能なコンテキスト

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

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

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

TK_SUPPORT_IOPORT I/Oポートアクセスをサポート

解説

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

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

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読み込んだデータ(ダブルワード)

利用可能なコンテキスト

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

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

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

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

解説

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

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

μT-Kernel 1.0との差異

T-Kernel 2.0仕様に基づき新たに追加されたAPIである。

微小待ち

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

C言語インタフェース

#include <tk/tkernel.h>

void WaitUsec (UW usec );

パラメータ

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

利用可能なコンテキスト

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

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

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

TK_SUPPORT_MICROWAIT 微小待ちをサポート

解説

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

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

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

T-Kernel 2.0との差異

パラメータusecの型がUINTからUWに変更されている。

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。

WaitNsec - 微小待ち(ナノ秒)

C言語インタフェース

#include <tk/tkernel.h>

void WaitNsec (UW nsec );

パラメータ

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

利用可能なコンテキスト

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

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

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

TK_SUPPORT_MICROWAIT 微小待ちをサポート

解説

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

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

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

T-Kernel 2.0との差異

パラメータnsecの型がUINTからUWに変更されている。

μT-Kernel 1.0との差異

本APIは過去のμT-Kernelの仕様では除外されていたが、サービスプロファイルの導入によりプロファイルで許容される場合に利用が可能となった。