IOCP (I/Oコントロールプログラム)

IOCP の使用

I/O制御プログラム(IOCP)は基本的にブートローダーです。スタンドアロンで動作することも、アプリケーション起動の第一段階として動作することもできます。設定によっては、シリアル接続経由で基本的なメモリ検査とブートストラッピングのための低レベルモニタを提供します。

本書執筆時点では、以下の機能とメモリマップが build.sh スクリプトおよび IOCP / zOS / ZPUTA / RTL のパラメータ設定に定義されていますが、パラメータを調整することで他の設定も可能です。

  • Tiny - SDカードからのブートに必要な最小サイズの IOCP。BRAMが制限されたSoCで、SDカードからロードされるアプリが外部RAMで動作する場合に有用です。
  • Minimum - Tiny に加えて以下を追加:IOCP バージョン表示、割り込みハンドラ、起動メッセージ、SDエラーメッセージ。
  • Medium - Minimum に加えて以下を追加:コマンドラインプロセッサ(下記コマンド)、キー押下で無効化可能な自動起動タイマ。

    コマンド 説明
    1 アプリケーション領域 BRAM からアプリを起動
    4 BRAM(ブート)メモリをダンプ
    5 スタックメモリをダンプ
    6 アプリケーション RAM をダンプ
    C BRAM のアプリケーション領域をクリア
    c アプリケーション RAM をクリア
    d SDカードのディレクトリ一覧を表示
    R システムをリセットして電源投入時と同様に起動
    h 有効なコマンドのヘルプを表示
    i バージョン情報を表示
  • Full - Medium に加えて以下のコマンドを追加。

    コマンド 説明
    2 シリアルポートからバイナリ形式で BRAM アプリ領域にアップロード
    3 シリアルポートからバイナリ形式で RAM にアップロード
    i 詳細な SoC 設定を表示

技術的詳細

このセクションでは、IOCP ブートローダーの内部詳細を説明します。この情報の多くは zOS/ZPUTA のドキュメントにも記載されていますが、ここでは IOCP に特化したより細かい詳細を提供することを目的としています。

メモリ構成

IOCP メモリマップ

IOCP は、コンパイル時に選択されたメモリモデルに応じて 4 種類のメモリマップが定義されています。現在定義されている IOCP のメモリマップは以下のとおりです:

IOCP メモリマップ

IOCP は zOS/ZPUTA またはその他の適切にコンパイルされたプログラムの第一段階ローダーとして設定することも、実際のエンドアプリケーション自体として機能するよう拡張することもできます。zOS/ZPUTA は IOCP なしで「スタンドアロン」でコンパイルして、電源投入時のファームウェアとして直接起動することもできます。

zOS と ZPUTA は SD カードを使用するようにビルドでき、アプレット(SD カード上の専用実行ファイルとして作成された機能の一部)を持つことができます。ZPUTA の場合は、すべての機能を内蔵したスタンドアロンとしてビルドすることも可能です。後者はメモリが制限されている場合や、ロード可能なプログラムのセットが必要な場合に使用されます。


ソフトウェアビルド

このセクションでは、基本的な IOCP ビルドの方法を説明します。IOCP(または zOS / ZPUTA / アプリケーション)ビルドの開始点は、必要なすべてのロジックを含む build.sh スクリプトです。このプログラムはナレッジダンプとして始まり、ソフトウェアの進化に伴って機能が拡張されました。最終的にはこのスクリプトを再設計して Python や Java で実装したいですが、現時点ではこのソフトウェアのビルドに機能しています。

パス

読みやすさのため、以下の短縮名はこの章内の対応するパスを示します。

短縮名 パス 説明
[<ABS PATH>] このリポジトリを展開したシステム上のパス  
<apps> [<ABS PATH>]/zsoft/apps アプリケーションディレクトリ。すべての zOS/ZPUTA アプリケーションとそのメイクファイルが格納されます。
<build> [<ABS PATH>]/zsoft/build コンパイルされたソフトウェアのターゲット出力ディレクトリ(例:<z-build>/SD はSDカードに書き込むすべてのファイルを含む)。
<common> [<ABS PATH>]/zsoft/common ライブラリに組み込まれていない共通 C/C++ メソッド。
<libraries> [<ABS PATH>]/zsoft/libraries C/C++ ライブラリ。通常は C/C++ インストールの一部ですが、組み込み開発(特にZPU)では別途作成が必要。
<teensy3> [<ABS PATH>]/zsoft/teensy3 K64F ベースの Teensy 3.5 ソフトウェア。豊富なライブラリを持ち、K64F プログラムに容易に追加可能。
<include> [<ABS PATH>]/zsoft/include 共通インクルードヘッダファイル。
<startup> [<ABS PATH>]/zsoft/startup 組み込みプロセッサのスタートアップファイル(主にアセンブラ)。テンプレートとマクロを使用して各ターゲットのメモリモデル対応スタートアップコードを生成。
<iocp> [<ABS PATH>]/zsoft/iocp IOコントロールプログラム。ZPUのアプリケーションブートストラップ用の初期ブートローダー。
<zOS> [<ABS PATH>]/zsoft/zOS zOS ソースコード。各ターゲット CPU 向けにパラメータ設定可能。
<zputa> [<ABS PATH>]/zsoft/zputa ZPUTA ソースコード。各ターゲット CPU 向けにパラメータ設定可能。
<rtl> [<ABS PATH>]/zsoft/rtl レジスタ転送レベルファイル。ZPUターゲットプロジェクトビルド時に必要な生成メモリ定義・初期化ファイル。
<docs> [<ABS PATH>]/zsoft/docs ソフトウェアに関する関連ドキュメント。
<tools> [<ABS PATH>]/zsoft/tools コンパイルとターゲットファイル作成を補助するツール。

ツール

すべての開発は Linux(特に Debian/Ubuntu)環境で行われています。標準的な Linux ビルドチェーンに加えて、以下のソフトウェアが必要です。

   
ZPU GCC ToolChain ZPU 開発用 GCC ツールチェーン。/opt などの共通領域にインストールしてください。
Arduino Arduino 開発環境。豊富な Arduino ライブラリから K64F 版 zOS に機能を追加する場合のみ必要。基本的に参考用。
Teensyduino Arduino レベルで Teensy3.5 ボードを扱うための Teensy3 Arduino 拡張。基本的に参考用。

IOCP はまだ K64F に移植されていません(必要性が低いため)。完全性と参考のため、Teensy3.5/K64F 用 ARM 互換ツールチェーンはリポジトリのビルドツリー内に格納されています。

ビルドツリー

ソフトウェアは以下のツリー/フォルダ構造で整理されています:

フォルダ ソースファイル 説明
apps   zOS/ZPUTA アプリケーションアプレットツリー。zOS/ZPUTA で動作する独立したディスクベースのアプレット。すべてのアプレットがこのフォルダに格納されます。
build   SDカードに直接コピー可能なビルドツリー出力。初期ブートローダーおよびアプリケーションは devices/sysbus/BRAM フォルダに BRAM プリロード用 VHDL ファイルとしてコンパイルされます。
common   Elm Chan の優れた Fat ファイルシステムなど、共通 C モジュール。
docs   このプロジェクトに関連するすべてのドキュメント。
libraries   コードライブラリ(umlibc および FreeRTOS を収録予定)。
rtl   レジスタ転送レベルのテンプレートと生成ファイル。ZPU ベース RAM/ROM の BRAM プリロード VHDL 定義を含みます。
teensy3   K64F プロセッサターゲットのビルドに必要な Teensy 3.5 ファイル。
include   C インクルードヘッダファイル。
iocp   ZPU 初期化用の小型ブートローダー/モニタアプリケーション。設定により SD カードまたはシリアルラインからアプリケーションを起動し、メモリ検査などの基本ツールを提供します。
startup   ZPU アプリケーション生成用アセンブラおよびリンカファイル。GCC によるバイナリイメージの生成・リンク方法を定義し、ハードウェア未実装の ZPU 命令のマイクロコードを提供します。
tools   バイナリイメージを VHDL 初期化データに変換するツール。
zputa   ZPU テストアプリケーション。ZPU と SoC コンポーネントのテスト用アプリケーション。VHDL 経由で BRAM にプリロードする単一イメージとして、または IOCP ブートローダーで SD カードからロードするスタンドアロンアプリケーションとしてビルド可能。
zOS   z-オペレーティングシステム。ZPUTA から派生した軽量 OS で、ZPU または K64F プロジェクト内でアプリケーションビルドとランタイム制御のフレームワークを提供します。ディスクベースサービス、共通ハードウェアアクセス API、シリアル VT100 コンソール経由の自律・インタラクティブアプリ実行をサポートします。
  build.sh IOCP、zOS、ZPUTA、および特定のデザイン向けアプリをビルドする Unix シェルスクリプト。
build.sh

Build.sh

IOCP は build.sh スクリプトを使用してビルドされます。このスクリプトは多数のフラグとオプションを持つ Makefile システムをカプセル化します。スクリプトの概要は以下のとおりです:

NAME
    build.sh - ZPU/K64F プログラムまたは OS をビルドするシェルスクリプト。

SYNOPSIS
    build.sh [-CIOoMBAsTZdxh]

DESCRIPTION

OPTIONS
    -C <CPU>      = Small, Medium, Flex, Evo, EvoMin, K64F - デフォルトは Evo。
    -I <iocp ver> = 0 - Full, 1 - Medium, 2 - Minimum, 3 - Tiny(ブートストラップのみ)
    -O <os>       = zputa, zos
    -o <os ver>   = 0 - スタンドアロン, 1 - IOCP ブートローダー付きアプリ,
                    2 - Tiny IOCP ブートローダー付きアプリ, 3 - RAM 内アプリ
    -M <size>     = ブート ROM/BRAM の最大サイズ(スタック設定に必要)。
    -B <addr>     = <os> のベースアドレス。デフォルト: -o == 0 の場合 0x00000、それ以外 0x01000
    -A <addr>     = <os> のアプリアドレス。デフォルト 0x0C000
    -N <size>     = ヒープの必要サイズ
    -n <size>     = アプリケーションヒープの必要サイズ
    -S <size>     = スタックの必要サイズ
    -s <size>     = アプリケーションスタックの必要サイズ
    -a <size>     = アプリの最大サイズ。デフォルト: (BRAM SIZE - App Start Address - Stack Size)
    -T            = tranZPUter 専用ビルド(初期化・セットアップコードを追加)。
    -Z            = Sharp MZ シリーズ ZPU ビルド(zOS が Sharp MZ ハードウェア上でホスト OS として動作)。
    -d            = デバッグモード。
    -x            = シェルトレースモード。
    -h            = このヘルプ画面。

EXAMPLES
    build.sh -O zputa -B 0x00000 -A 0x50000

EXIT STATUS
     0    コマンドが正常に実行されました

     >0   エラーが発生しました。

適切なデフォルト値がスクリプトに設定されています。オーバーライドフラグの説明は以下のとおりです。

フラグ 説明
-C <CPU> 完成イメージのターゲット CPU。ZPU ごとに設定が異なりスタートアップコードと設定の選択が必要なため必須フラグです。選択肢:Small - 多くの命令をマイクロコードで実装した絶対最小 ZPU ハードウェア設計。Medium - より多くのハードウェアと優れたパフォーマンスを持つ中間 ZPU 設計。Flex - ZPU Small ベースながら多くの拡張機能を持つ設計。Evo - ZPU の最新進化版。すべての命令をハードウェアで実装。K64F - Freescale の ARM Cortex-M4 プロセッサ。Evo がデフォルト。
-I <iocp ver> ビルドのメモリモデルを設定。0 - Full、1 - Medium、2 - Minimum、3 - Tiny(ブートストラップのみ)。デフォルトは 3。
-O <os> ターゲット OS を設定。zputa - ZPU テストアプリケーション(K64F でも動作)。zos - zOS オペレーティングシステム。デフォルトなし。OS をビルドする場合は必須。
-o <os ver> OS ターゲットモデルを設定。0 - スタンドアロン。1 - IOCP ブートローダー付きアプリ(IOCP はメモリ常駐)。2 - Tiny IOCP ブートローダー付きアプリ。3 - RAM 内アプリ。デフォルトは 2。 K64F では意味なし。
-M <size> ブート ROM/BRAM の最大サイズを指定(スタック設定に必要)。K64F では意味なし。
-B <addr> <os> のベースアドレス。デフォルト: -o == 0 の場合 0x00000、それ以外 0x01000。K64F では意味なし。
-A <addr> <os> のアプリ開始/ロードアドレス。デフォルト: ZPU 0x0C000、K64F 0x1FFF0000
-N <size> <os> ヒープの必要サイズ。OS とアプリのヒープは現在独立しています。
-n <size> アプリケーションヒープの必要サイズ。アプリが管理する専用ヒープ。
-S <size> スタックの必要サイズ。通常 <os> がスタックを管理し、アプリでも共有されます。
-s <size> アプリケーションスタックの必要サイズ。アプリが安全でない場合のみ設定。
-a <size> アプリケーションの最大サイズ。ZPU の場合のデフォルト: (BRAM SIZE - App Start Address - Stack Size)(BRAM 内の場合)、その他は 0x10000。
-T tranZPUter 専用ビルド。初期化・セットアップコードを追加して tranZPUter ボード用組み込み OS としてビルドします。
-Z Sharp MZ シリーズ ZPU ビルド。ZPU/NIOSII をホストプロセッサとして動作する Sharp MZ シリーズコンピュータ用ホスト OS としてビルドします。
-d デバッグモード。スクリプトの状態と決定内容について詳細な出力を有効化します。
-x シェルトレースモード。シェル実行の非常に低レベルな行単位トレース。デバッグ時のみ使用。
-h このヘルプ画面。


Flex CPU 用 Tiny メモリモデル IOCP ブートローダーを 32K BRAM、アプリ 0x1000 ロードでビルドするには以下のコマンドを実行します:

<ABS PATH>/build.sh -C Flex -I 3 -M 0x8000 -B 0x1000

注:App という用語は <os> がデプロイされている場合(zOS + App など)にのみ使用されます。0x1000 で開始するプログラムをビルドして BOOTTINY.ROM として SD カードに配置する場合、これはアプリケーションではなくベースアドレスにロードされるブートストラップされたプログラムです。

ブートストラップされたファイル名は選択したメモリモデルに依存します。認識されて起動されるには、FAT32 フォーマットの SD カードのルートディレクトリに以下のファイルが存在する必要があります:

  • BOOT.ROM - メモリモデル:Full、Medium、Minimum。
  • TINYBOOT.ROM - メモリモデル:Tiny。


クレジット

サードパーティの設計を使用または参考にした場合は、元の作者の著作権表示をヘッダに含めるか、適切なクレジットを記載しています。私の知る限り、すべてのサードパーティソフトウェアはオープンソースで自由に使用可能です。ライセンス制限のあるコンポーネントが見つかった場合は、このリポジトリから削除し、適切なリンク/設定を提供します。


ライセンス

オリジナルの ZPU は FreeBSD ライセンスを使用しており、Evo も同様に FreeBSD の下でリリースされています。私が作成した SoC コンポーネントとその他の開発成果は現在 GPL でライセンスされています。サードパーティコンポーネントは元の著作権表示を維持します。

FreeBSD ライセンス

ソースコードおよびバイナリ形式での再配布と使用は、以下の条件を満たす場合に変更の有無にかかわらず許可されます:

  1. ソースコードの再配布には、上記の著作権表示、この条件リスト、および以下の免責事項を保持する必要があります。
  2. バイナリ形式の再配布には、上記の著作権表示、この条件リスト、および以下の免責事項を配布に付属するドキュメントやその他の資料に再現する必要があります。

本ソフトウェアは「現状のまま」提供され、商品性および特定目的への適合性の黙示的保証を含む一切の明示的または黙示的保証を否認します。ZPUプロジェクトまたはその貢献者は、直接的、間接的、付随的、特別、典型的または結果的損害に対して一切の責任を負いません。

GNU パブリックライセンス v3

このプロジェクトの GPL v3 とマークされたソースおよびバイナリファイルはフリーソフトウェアです。Free Software Foundation が公表する GNU General Public License(バージョン3、またはそれ以降)の条件の下で再配布および変更することができます。

ソースファイルは有用であることを期待して配布されていますが、商品性や特定目的への適合性の保証を含む、いかなる保証もありません。詳細は GNU General Public License をご覧ください。

このプログラムとともに GNU General Public License のコピーを受け取っているはずです。受け取っていない場合は http://www.gnu.org/licenses/ をご覧ください。