ALTIMA Corp. Nios II IDE によるソフトウェア 開 発 セクション 1 ver.1.0 2010 年 8 月 ELSENA,Inc.
目 次 1. はじめに... 3 2. HAL を 用 いたプログラミング... 3 2-1. HAL (Hardware Abstraction Layer)... 3 2-2. Nios II IDE プロジェクトの 構 造... 4 2-3. HAL API の 使 用 例... 5 2-3-1. システム クロック... 6 2-3-2. アラーム 機 能... 7 2-3-3. システムスタンプ タイマ... 8 2-4. HAL ファイル システム... 9 2-4-1. HAL ファイル システム API... 9 2-4-2. アプリケーション 例... 10 2-4-3. ファイル アクセス 関 数... 11 2-4-4. デバイスへのダイレクト アクセス... 11 3. ペリフェラルへのアクセス 方 法... 12 3-1. データ キャッシュのバイパス... 12 ver. 1.0 2010 年 8 月 2/14 ALTIMA Corp. / ELSENA,Inc.
1. はじめに この 資 料 では Nios II IDE を 用 いたソフトウェア 開 発 について 紹 介 します Nios II の HAL を 用 いたプログラミング HAL (Hardware Abstraction Layer) Nios II IDE プロジェクト 構 造 HAL API の 例 (タイマとアラームの 設 定 について) HAL ファイル システム ペリフェラルへのアクセス 方 法 2. HAL を 用 いたプログラミング この 章 では Nios II プログラムで 使 用 する HAL について 説 明 します 2-1. HAL (Hardware Abstraction Layer) HAL システム ライブラリはデバイス ドライバ インターフェースを 提 供 します プログラムはこのインター フェースを 使 用 してハードウェアにアクセスすることができます HAL システム ライブラリは 以 下 のサービスを 提 供 します 標 準 のインターフェースを 使 用 可 能 にする HAL を 使 用 することによって デバイス ドライバが 抽 象 化 されますので アプリケーションとデバイ ス ドライバ ソフトウェアを 明 確 に 区 別 することができ ハードウェアに 依 存 しない 標 準 関 数 によるア クセスを 提 供 します newlib ANSI C 標 準 ライブラリとの 統 合 HAL アプリケーション プログラム インターフェース(API)は ANSI C 標 準 ライブラリと 統 合 されて いるため printf() や fopen() 等 の 一 般 的 な C 標 準 関 数 を 使 用 することができます デバイス ドライバ HAL システム ライブラリは 特 定 の SOPC システム 上 に 構 築 されます PTF ファイルにしたがっ て 生 成 され SOPC システム 内 に 組 み 込 まれているペリフェラルのデバイス ドライバ ソフトウェアを リンクし 構 成 されます HAL API デバイス アクセス 割 り 込 み 処 理 アラーム 機 能 などの HAL サービスへの 標 準 インターフェース を 提 供 します ver. 1.0 2010 年 8 月 3/14 ALTIMA Corp. / ELSENA,Inc.
HAL ベースシステムのレイヤ 標 準 C ライブラリ ユーザ アプリケーション HAL API Nios II プロセッサ システム ハードウェア デバイス ドライバ デバイス ドライバ デバイス ドライバ デバイス ドライバ HAL API _exit() sbrk() open() ioctl() close() isatty() opendir() stat() closedir() kill() read() usleep() fstat() lseek() readdir() wai() getpid() write() rewinddir() settimeofday() 2-2. Nios II IDE プロジェクトの 構 造 HAL システム ライブラリをベースとしたソフトウェア プロジェクトの 作 成 と 管 理 は Nios II 統 合 開 発 環 境 (IDE)に 統 合 されています 下 図 は HAL システム ライブラリの 組 み 込 み 方 法 に 重 点 を 置 いた Nios II プログラム ブロックを 示 しま す HAL ベースのシステムは 図 に 示 すように 2 つの Nios II IDE プロジェクトから 成 ります ユーザが 開 発 するすべてのプログラムはユーザ アプリケーション プロジェクトに 含 まれ もう 一 方 のシステム ライブラリ プロジェクト(HAL システム ライブラリ プロジェクト)には プロセッサ ハードウェアとのインターフェースに 関 連 するすべての 情 報 が 含 まれます HAL ベースのソフトウェア アプリケーション ユーザ アプリケーション プロジェクト 種 別 ファイル 種 別 作 成 者 ユーザのプログラムやプロジェクト.c.s.h ファイル ユーザ HAL システム ライブラリ プロジェクト 種 別 ファイル 種 別 作 成 者 HAL system library プロジェクト Nios II IDE プロジェクト 設 定 ファイル Nios II IDE SOPC Builder システム 種 別 Nios II プロセッサ システム ハードウェア ファイル 種 別.ptf ファイル 作 成 者 SOPC Builder ver. 1.0 2010 年 8 月 4/14 ALTIMA Corp. / ELSENA,Inc.
2-3. HAL API の 使 用 例 タイマを 例 にして HAL API の 使 用 方 法 を 説 明 します SOPC Builder 内 の Interval timer コアを 使 用 しま す HAL API は 2 種 類 のタイマ デバイス ドライバを 提 供 します システム 内 に 複 数 のタイマ ペリフェラルを 組 み 込 むことが 可 能 です ひとつのタイマ ペリフェラルはどちらか 一 方 のみ 動 作 可 能 で 両 方 同 時 に 動 作 す ることはできません Nios II IDE の System Library Properties のページで 使 用 するタイマ ペリフェラルを 選 択 します システム クロック タイマ : アラーム 機 能 を 実 現 します タイムスタンプ タイマ : 高 精 度 の 時 間 測 定 を 可 能 にします SOPC Builder Nios II IDE System Library Properties ページ ver. 1.0 2010 年 8 月 5/14 ALTIMA Corp. / ELSENA,Inc.
2-3-1. システム クロック システム クロック タイマはシステム 時 刻 の 基 本 単 位 ティック を 提 供 します ティックで 指 定 した 単 位 時 間 ごとにシステム クロックをカウントアップし 指 定 した 時 間 に 関 数 の 実 行 や 時 間 の 測 定 を 行 うことができま す 下 記 の 関 数 HAL API を 使 用 して 制 御 することが 可 能 です alt_nticks() : リセット 以 降 の 経 過 時 間 をシステム クロックのティック 数 で 取 得 します alt_ticks_per_second() : システム クロック レート(ティック/ 秒 )を 取 得 します 下 記 の 例 では 測 定 したい 部 分 (func() 関 数 )の 前 後 で alt_nticks() 関 数 を 使 用 して ティックのカウント 数 を 取 得 し ティック 数 の 差 分 から 実 行 時 間 を 測 定 しています 例 ) 簡 易 的 な 時 間 計 測 方 法 alt_nticks () リセット 後 からのティック 数 を 取 得 alt_ticks_per_second () システム カウンタのカウントのレート を 取 得 差 分 でモニタしたい 部 分 の 実 行 時 間 を 測 定 ver. 1.0 2010 年 8 月 6/14 ALTIMA Corp. / ELSENA,Inc.
2-3-2. アラーム 機 能 HAL アラーム 機 能 を 利 用 して 指 定 した 時 間 に 実 行 する 関 数 を 登 録 することができます アラームは 下 記 HAL を 使 用 して 登 録 キャンセルを 行 います alt_alarm_start() : アラームの 登 録 int alt_alarm_start ( alt_alarm* alarm, // アラームを 表 す 構 造 体 へのポインタ alt_u32 nticks, // callback を 呼 ぶまでの 時 間 (ティック 数 で 指 定 ) alt_u32 (*callback) (void* context), // callback 関 数 へのポインタ void* context ); // callback 関 数 への 入 力 引 数 alarm はこのアラームを 表 す 構 造 体 へのポインタです このポインタはユーザが 作 成 する 必 要 があ り 作 成 した 構 造 体 はアラームが 有 効 になっている 間 よりも 長 い 間 有 効 である 必 要 があります alarm が 指 し 示 す 構 造 体 の 内 容 をユーザが 初 期 化 する 必 要 はありません alt_alarm_stop() : 以 前 に 登 録 されたアラームのキャンセル void alt_alarm_stop (alt_alarm* alarm); // 引 数 は 呼 び 出 しに 使 用 したアラーム 構 造 体 へのポインタ 例 ) 周 期 的 なアラーム コールバック 関 数 の 使 用 コールバック 関 数 戻 り 値 で 次 回 callback 呼 び 出 しまでのティック 数 を 指 定 この 場 合 は 5 秒 間 隔 で my_alarm_callback 関 数 が 呼 び 出 される コールバック 関 数 の 登 録 callback 関 数 を 呼 び 出 すまでの 時 間 この 場 合 は 10 秒 ver. 1.0 2010 年 8 月 7/14 ALTIMA Corp. / ELSENA,Inc.
2-3-3. システムスタンプ タイマ HAL システム クロックのティックで 得 られるサンプリング 周 期 以 上 の 精 度 での 時 間 間 隔 の 測 定 が 必 要 な 場 合 には タイムスタンプ タイマを 使 用 することができます タイムスタンプ タイマは 単 調 に 増 加 するカウン タを 提 供 するため このカウンタをサンプリングして 時 間 計 測 に 使 用 することができます HAL はシステム 内 に 1 つのタイムスタンプ タイマのみサポートします タイムスタンプ タイマは alt_timestamp.h ファイルで 定 義 されます タイムスタンプ ドライバを 使 用 する 場 合 には 必 ず Nios II IDE システム ライブラリ プロパティのページ にて Timestamp Timer が 設 定 されている 必 要 があります デフォルトでは 設 定 されていません タイムスタンプ タイマが 存 在 すれば 下 記 の HAL API を 使 用 することができます alt_timestamp () : カウンタが 動 作 を 開 始 します この 関 数 を 呼 び 出 すたびにタイムスタンプ タイマの 値 はゼロにリセットされます タイマ コアは 32 ビット もしくは 64 ビット(コアのオプション 設 定 にて 変 更 可 能 )がサポートされ カウンタの 値 は 2 32-1 もしくは 2 64-1 までカウントすることができ それ 以 降 は 0 で 停 止 します alt_timestamp() : タイムスタンプ タイマの 現 在 の 値 を 返 します alt_timestamp_freq() : タイムスタンプ カウンタの 増 加 レートを 取 得 します このレートは Timestamp timer に 指 定 した Interval Timer の 動 作 周 波 数 です 例 ) コード 実 行 時 間 を 測 定 するためのタイムスタンプ タイマの 使 用 alt_timestamp_start () でタイムスタンプ タイマを 起 動 alt_timestamp () でカウント 値 を 取 得 し 差 分 でモニタ したい 部 分 の 実 行 時 間 を 測 定 alt_timestamp_freq () でタイムスタンプ タイマのカウントの レートを 取 得 します ver. 1.0 2010 年 8 月 8/14 ALTIMA Corp. / ELSENA,Inc.
2-4. HAL ファイル システム HAL はキャラクタ モードのデバイスおよびデータ ファイル システムを 扱 うためにファイル システムの 概 念 を 持 ちます newlib が 提 供 する C 標 準 ライブラリのファイル I/O 関 数 ( fopen() fread() 等 ) または HAL システム ライブラリが 提 供 する UNIX 形 式 のファイル I/O を 使 用 して キャラクタ デバイスにアクセ スできます / /dev /mnt /dev/jtag_uart0 /dev/lcd0 /mnt/rozip /mnt/rozip/myfile1 /mnt/rozip/myfile2 ファイル システムは 自 身 をグローバル HAL ファイル システム 内 のマウント ポイントとして 登 録 します マウント ポイントの 下 にあるファイルにアクセスを 試 みると アクセスはそのファイル サブシステムに 対 して 実 行 されます 例 えば zip ファイル サブシステムが / mnt / rozip として 登 録 されている 場 合 / mnt / rozip / myfile1 を 対 象 とした fopen() のコールは 関 連 付 けされた zipfs ファイル サブシステムによって 処 理 さ れます 同 様 にキャラクタ モード デバイスは HAL ファイル システム 内 のノードとして 登 録 します 慣 例 的 に system.h ファイル 内 では デバイス ノード 名 は プリフィックス / dev に 続 いて SOPC Builder でハードウェ ア コンポーネントに 割 り 当 てられた 名 前 を 付 加 して 定 義 されます 例 えば SOPC Builder での JTAG UART ペリフェラルが jtag_uart0 という 名 前 で 割 り 当 てられていると system.h ファイルでは /dev/jtag_uart0 と 定 義 されます HAL ファイル システムではカレント ディレクトリという 概 念 はなく すべてのファイルは 絶 対 パスを 通 して アクセスする 必 要 があります 2-4-1. HAL ファイル システム API Newlib 標 準 C ライブラリ I/O 関 数 を 用 いたファイル システム デバイス(ファイル)へのアクセス fopen() fclose() fread() etc HAL UNIX スタイルのファイル I/O close() open() fstat() read() ioctl() stat() isatty() write() lseek() ver. 1.0 2010 年 8 月 9/14 ALTIMA Corp. / ELSENA,Inc.
2-4-2. アプリケーション 例 標 準 入 力 標 準 出 力 標 準 エラー シンプルなコンソール I/O を 実 装 するには 標 準 入 出 力 ( stdin stdout stderr )を 使 用 する 方 法 がもっ とも 簡 単 な 方 法 です HAL システム ライブラリは 背 後 で stdin stdout stderr を 管 理 するため ファイ ル ディスクリプタを 明 示 的 に 管 理 することなく これらのチャンネルを 介 してキャラクタを 送 信 受 信 するこ とが 可 能 になります Nios II IDE のシステム ライブラリ プロパティにて 特 定 のハードウェア デバイスへの 関 連 付 けを 行 いま す Nios II IDE System Library Properties ページ 例 ) Hello World 定 番 の Hello World プログラム Nios II IDE でビルドした 際 に stdout に 関 連 付 けられるデバイスにキャラク タが 送 信 されます キャラクタ デバイスへの 汎 用 アクセス キャラクタ モード デバイス( stdin stdout stderr を 除 く)へのアクセスは ファイルを 開 いたり ファイル に 書 き 込 んだりするのと 同 様 です 例 ) JTAG UART へのキャラクタの 書 き 込 み Hello World の 文 字 を JTAG UART に 送 信 します デバイスは SOPC Builder でのコンポーネント 名 で 定 義 されます system.h ファイル 内 で #define JTAG_UART_NAME "/dev/jtag_uart" のように 定 義 されています ver. 1.0 2010 年 8 月 10/14 ALTIMA Corp. / ELSENA,Inc.
2-4-3. ファイル アクセス 関 数 使 い 慣 れたファイル アクセス 関 数 を HAL / Newlib が 提 供 します ANSI C fd = fopen ( / dev / lcd0, w ); fprintf ( fp, %s, msg ); UNIX スタイル fd = open ( / dev / / lcd0, 0_WRONLY ); write ( fd, msg, strlen ( msg ) ); Newlib は C++ ストリームもサポート ofstream ofp ( / dev / lcd0 /, ios ; : out ); ofp <<,sg ; その 他 の UNIX スタイル 関 数 int usleep ( int us ); int settimeofday ( const struct timeval *t, const struct timezone *tz); int gettimeofday ( struct timeval *ptimeval. struct timezone *ptimezone ); 2-4-4. デバイスへのダイレクト アクセス 特 定 のデバイスには 汎 用 API では 補 足 できない 使 用 条 件 を 持 つハードウェア 固 有 の 機 能 があります HAL システム ライブラリは UNIX 形 式 の ioctl () 関 数 を 提 供 することによって ハードウェア 固 有 の 機 能 に 対 応 しています ハードウェアの 機 能 はペリフェラルごとに 異 なるため 各 ペリフェラルがサポートする ioctl 機 能 の 詳 細 は ペリフェラルのドキュメントを 確 認 する 必 要 があります ver. 1.0 2010 年 8 月 11/14 ALTIMA Corp. / ELSENA,Inc.
3. ペリフェラルへのアクセス 方 法 この 章 では Nios II から 接 続 されている 各 ペリフェラルへのアクセスについて 説 明 します 3-1. データ キャッシュのバイパス Nios II プロセッサ コアはインストラクション キャッシュとデータ キャッシュを 搭 載 することができます イ ンストラクション キャッシュのみを 持 つのか インストラクション キャッシュとデータ キャッシュ 両 方 持 つのか はそれぞれのコアによって 異 なります Nios II / Fast コアはインストラクション キャッシュとデータ キャッシュ Nios II / Standard コアはインストラクション キャッシュ Nios II / Economy コアはキャッシュを 搭 載 すること はできません Nios II のアドレス 空 間 は 2GByte のミラーリングになっています 下 位 2GByte がキャッシュ 領 域 上 位 2GByte は 非 キャッシュ 領 域 で 最 上 位 の Bit 31 が 制 御 ビットとなっています Fast コアを 使 用 した 場 合 すべての 変 数 データはデフォルトでキャッシュされます データ キャッシュはダイレクト マップ ライト バック 方 式 です ハードウェアへアクセスする 場 合 には ソフトウェアでキャッシュをバイパスする 操 作 が 必 要 です データ キャッシュをバイパスするためのマクロが 用 意 されています IOWR IORD を 使 用 してハードウェ アに 直 接 アクセスする 記 述 をします 使 用 方 法 は 以 下 のようになります IOWR は stwio に IORD は ldwio 命 令 のアセンブリ 命 令 に 展 開 されます マクロ IORD (BASE, REGNUM) IOWR (BASE, REGNUM, DATA) IORD_32DIRECT (BASE, OFFSET) IOWR_32DIRECT (BASE, OFFSET, DATA) IORD_16DIRECT (BASE, OFFSET) IOWR_16DIRECT (BASE, OFFSET, DATA) IORD_8DIRECT (BASE, OFFSET) IOWR_8DIRECT (BASE, OFFSET, DATA) 用 途 ベース アドレス BASE のデバイス 内 部 のオフセット REGNUM のレジスタの 値 を 読 み 込 みます レジスタはバスのアドレス 幅 だけオフセットされていると 仮 定 されます ベース アドレス BASE のデバイス 内 部 のオフセット REGNUM のレジスタに DATA の 値 を 書 き 込 みます レジスタはバスのアドレス 幅 だけオフセットされて いると 仮 定 されます アドレス BASE+OFSET の 位 置 で 32 ビットの 読 み 込 みアクセスを 行 います アドレス BASE+OFSET の 位 置 で 16 ビットの 読 み 込 みアクセスを 行 います アドレス BASE+OFSET の 位 置 で 8 ビットの 読 み 込 みアクセスを 行 います アドレス BASE+OFSET の 位 置 で 32 ビットの 書 き 込 みアクセスを 行 います アドレス BASE+OFSET の 位 置 で 16 ビットの 書 き 込 みアクセスを 行 います アドレス BASE+OFSET の 位 置 で 8 ビットの 書 き 込 みアクセスを 行 います IOWR IORD マクロと volatile 宣 言 ポインタを volatile として 宣 言 し この volatile ポインタを 使 用 してアクセスしてもデータ キャッシュ をアクセスできないことに 注 意 してください volatile 宣 言 はコンパイラに 対 してアクセスを 最 適 化 しな いようにするための 指 示 です IORD / IOWR マクロは データ キャッシュのバイパスと volatile 宣 言 を 両 方 行 ったものと 同 様 の 効 果 です ver. 1.0 2010 年 8 月 12/14 ALTIMA Corp. / ELSENA,Inc.
SOPC Builder に 提 供 されているコンポーネントにはハードウェア インターフェースを 定 義 するヘッダ ファ イルが 提 供 されています 各 ヘッダ ファイルは<コンポーネント 名 >_regs.h の 名 前 で 各 コンポーネントの inc ディレクトリに 保 存 されています 例 えば PIO のコンポーネントの 場 合 には 以 下 のファイルが 保 存 されてい ます <インストールパス> ip altera sopc_builder_ip altera_avalon_pio inc に altera_avalon_pio_regs.h <コンポーネント 名 >_regs.h ファイル 内 では 以 下 の 内 容 が 定 義 されています 各 レジスタにアクセスするための 読 み 取 りマクロや 書 き 込 みマクロ IOWR_<コンポーネント 名 >_<レジスタ 名 > IORD_<コンポーネント 名 >_<レジスタ 名 > レジスタ 内 の 個 々ビット フィールドへのアクセスを 可 能 にする ビット フィールド マクロとオフセット フィールド ビット マスク <コンポーネント 名 >_<レジスタ 名 >_<フィールド 名 >_MSK フィールド 先 頭 のビット オフセット <コンポーネント 名 >_<レジスタ 名 >_<フィールド 名 >_OFST ペリフェラル 用 ヘッダ ファイルの 例 altera_avalon_dma.h ver. 1.0 2010 年 8 月 13/14 ALTIMA Corp. / ELSENA,Inc.
免 責 及 び ご 利 用 上 の 注 意 弊 社 より 資 料 を 入 手 されましたお 客 様 におかれましては 下 記 の 使 用 上 の 注 意 を 一 読 いただいた 上 でご 使 用 ください 1. 本 資 料 は 非 売 品 です 許 可 無 く 転 売 することや 無 断 複 製 することを 禁 じます 2. 本 資 料 は 予 告 なく 変 更 することがあります 3. 本 資 料 の 作 成 には 万 全 を 期 していますが 万 一 ご 不 明 な 点 や 誤 り 記 載 漏 れなどお 気 づきの 点 がありましたら 本 資 料 を 入 手 されました 下 記 代 理 店 までご 一 報 いただければ 幸 いです 株 式 会 社 アルティマ : 222-8563 横 浜 市 港 北 区 新 横 浜 1-5-5 マクニカ 第 二 ビル TEL: 045-476-2155 HP: http://www.altima.co.jp 技 術 情 報 サイト EDISON : https://www.altima.jp/members/index.cfm 株 式 会 社 エルセナ : 163-0928 東 京 都 新 宿 区 西 新 宿 2-3-1 新 宿 モノリス 28F TEL: 03-3345-6205 HP: http://www.elsena.co.jp 技 術 情 報 サイト ETS : https://www.elsena.co.jp/elspear/members/index.cfm 4. 本 資 料 で 取 り 扱 っている 回 路 技 術 プログラムに 関 して 運 用 した 結 果 の 影 響 については 責 任 を 負 いかねますのであらかじめご 了 承 ください 5. 本 資 料 は 製 品 を 利 用 する 際 の 補 助 的 な 資 料 です 製 品 をご 使 用 になる 場 合 は 英 語 版 の 資 料 もあわせてご 利 用 ください ver. 1.0 2010 年 8 月 14/14 ALTIMA Corp. / ELSENA,Inc.