===================================================================== Nios2プロセッサ依存部 Last Modified: 09 Sep 2008 12:01:04 ===================================================================== ○概要 Nios2プロセッサ依存部(以下,Nios2依存部)は,Altera社のNios2プロセッ サ をターゲットとしている.サポートしている NiosII エンベデッド・デザ イン・スイート のバージョンは,8.0sp1 である.これ以降のバージョンに関 しては,プロセッサやコンパイラに大きな変更がなければ,動作させることが 可能である. Nios2は,ソフトコアプロセッサであるため,コアの構成や周辺回路の構成や アドレス等を変更することが可能である.Nios2依存部では,プロセッサコア とタイマ(Avalon Timer)とUART(JTAG UART)のみをサポートしている.ア ドレス等の設定に関しては,ターゲット依存部で設定する. ○開発環境 カーネルのコンパイルは,NiosII エンベデッド・デザイン・スイート に付属 している,GCC を用いる.動作確認を行なったバージョンは,3.4.6 である. ○コア構成 ASPカーネルは,Nios2 コアの標準の構成で動作する.その他の追加命令(div やmulti)は使用していない.これらの追加命令を使用する場合は,ターゲッ ト依存部で適切にコンパイルオプションを設定する必要がある.なお,FPU MMU MPU はサポートしていない. 例外に関しては,未定義命令以外の例外を用いる場合(MMUやMPUの追加時等) は,ターゲット依存部で NIOS2_USE_EXTRA_EXCEPTION を定義すること. 割込み応答時間を高速化したい場合は,カスタム命令として,Interrupt Vector Instruction を追加することで高速化可能である. ○周辺回路 ASPカーネルを動作させるためには,周辺回路として,UART(JTAG UART),タ イマ(Avalon Timer)をそれぞれ1個ずつ必要となる.Avalon Timerの設定は, Presets は Custom とし、Registers は全て有効とする.また,それぞれ割込 みを使用するように設定する. ○CPU例外ハンドラ番号 CPU例外番号としては,exception レジスタのCAUSEフィールドにセットされる 値を用いる. ○CPU例外フレーム CPU例外ハンドラの引数に渡す,CPU例外フレームの構成を次に示す. 内容 オフセット 例外番号 0 statusレジスタ 4 割込み・例外ネストカウント 8 戻りアドレス 12 割込み優先度マスク(ipm) 16 ○Trap例外 Trap例外のハンドラは,prc_support.S で,trap_handler として用意してい る.ディフォルトでは,単にリターンする. ○未登録の例外の発生 未登録の例外が発生した場合は,prc_config.c で定義されている. default_exc_handler() が呼び出される.default_exc_handler() は,発生し た例外の,CPU例外フレームの内容を表示した後,target_exit() を呼び出す. ○割り込みハンドラ番号と割込み番号 割込みハンドラ番号(inhno)と割込み番号(intno)は,SOPC Builder で指定し た,割込み番号を用いる. ○カーネル管理内/外の割込み Nios2依存部では,カーネル管理外の割込みはサポートしない. ○割込み優先度 CFG_INTに指定可能な割込み優先度としては,-1 から -7 までの値を設定可能 である. ○割込み属性 CFG_INTでサポートしている割込み属性はない. ○未登録の割込み 未登録の割込みが発生した場合は,prc_config.c で定義されている, default_int_handler() を呼び出す.default_int_handler() は,発生した割 り込みの割込み番号をコンソールに出力した後,target_exit() を呼び出す. ○デバイスアクセス関数 Nios2では,メモリ空間とI/O空間を区別していないが,データキャッシュを有 効とした場合,キャッシュをスルーしてデバイスにアクセスする命令を用いて デバイスをアクセスする必要がある.そのため,Nios2依存部では,キャッシ ュをスルーしてアクセスするI/O空間アクセス関数を用意している. sil_reb_iop sil_wrb_iop sil_reh_iop sil_wrh_iop sil_rew_iop sil_wrw_iop ===================================================================== ターゲット依存部開発者向けの情報 ===================================================================== ○概要 ターゲット依存部では,ペリフェラルのベースアドレスや割込み番号,キャッ シュ設定等を設定する必要がある. ○割込み応答時間の高速化 割込み応答時間を高速化するためには,Interrupt Vector Instruction をカ スタム命令として追加して以下のマクロを定義する. #define NIOS2_USE_INT_VEC_INST /* Interrupt Vector Instruction を使う */ #define NIOS2_INT_VEC_INST_NO x /* 命令番号 */ ○コンパイルオプションとCライブラリ(Makefile.target) Nios2 にハードウェア除算器等やを追加して,カーネルでこれらを使用するよ うにコンパイルするためには,COPTSにコンパイルオプションを指定する必要がある. ○未定義命令例外以外の例外のサポート(target_kernel.h) 未定義命令例外以外の例外をサポートする場合は, NIOS2_USE_EXTRA_EXCEPTION を定義する. ○タイマ関連 ●ベースアドレス(target_kernel.h) #define AVALON_TIM_BASE xxx ●タイマクロック(target_timer.h) タイマ値の内部表現とミリ秒単位との変換を指定する. #define TIMER_CLOCK xxxx ●割込み関連(target_timer.h) #define INHNO_TIMER xx /* 割込みハンドラ番号 */ #define INTNO_TIMER xx /* 割込み番号 */ #define INTPRI_TIMER xx /* 割込み優先度 */ #define INTATR_TIMER xx /* 割込み属性 */ ○UART関連 Nios2 依存部の JTAG UART ドライバでは,最大3ポートのUARTをサポートして いる. ●コンパイル/リンク指定(Makefile.target) JTAG UART を使用する場合は,Makefile.target で,SYSSVC_COBJS に, jtag_uart.o を追加する. SYSSVC_COBJS := $(SYSSVC_COBJS) jtag_uart.o ●ベースアドレス(target_kernel.h) #define JTAG_UART_PORT1_BASE xxx #define JTAG_UART_PORT2_BASE xxx #define JTAG_UART_PORT3_BASE xxx ●割込み番号等(target_serial.h) #define INHNO_SIO_PORT1 xx /* 割込みハンドラ番号1 */ #define INTNO_SIO_PORT1 xx /* 割込み番号1 */ #define INTPRI_SIO_PORT1 xx /* 割込み優先度1 */ #define INTATR_SIO_PORT1 xx /* 割込み属性1 */ #define INHNO_SIO_PORT2 xx /* 割込みハンドラ番号2 */ #define INTNO_SIO_PORT2 xx /* 割込み番号2 */ #define INTPRI_SIO_PORT2 xx /* 割込み優先度2 */ #define INTATR_SIO_PORT2 xx /* 割込み属性2 */ #define INHNO_SIO_PORT3 xx /* 割込みハンドラ番号3 */ #define INTNO_SIO_PORT3 xx /* 割込み番号3 */ #define INTPRI_SIO_PORT3 xx /* 割込み優先度3 */ #define INTATR_SIO_PORT3 xx /* 割込み属性3 */ ●ポート数(target_serial.h) #define TNUM_PORT xx ○カーネル低レベル出力用UART関連 Nios2依存部で用いる,カーネル低レベル出力用UARTの定義を行う.用いる UART としては,JTAG UART を用い,通常のログ出力と同じポートを使用可能 である. ●ベースアドレス(target_kernel.h) #define KENEL_LOW_JTAG_UART_BASE xxx ○リンカスクリプト(Makefile.target) ターゲット依存部部でリンカスクリプトを用意して,Makefile.target で, LDSCRIPT に指定する. ○非タスクコンテキスト用のスタックサイズの定義(target_config.h) 非タスクコンテキスト用のスタックサイズを, target_config.h で定義する. サイズは,4Byte単位で指定する. #define DEFAULT_ISTKSZ xxxx 例えば 4KByte を指定する場合は,次のように定義する. #define DEFAULT_ISTKSZ (0x1000U/4U) ○sil関連(target_sil.h) 微少時間待ちのための定義を target_sil.h で定義する.値の決定方法は, porting.txt を参照のこと. #define SIL_DLY_TIM1 xxx #define SIL_DLY_TIM2 xxx ○データセクションの初期化(target_kernel.h) データセクションのLMAとVMAを別のアドレスとして,ROM化をしない場合には, ターゲット依存部で,NIOS2_OMIT_DATA_INIT を定義する.定義することで, スタートアップルーチンは,データセクションのROMからRAMへのコピーを行わ ない. ○キャッシュサイズ(target_kernel.h) インストラクションキャッシュとデータキャッシュのサイズとラインサイズを 指定する. #define NIOS2_ICACHE_SIZE xxx /* 命令キャッシュサイズ */ #define NIOS2_ICACHE_LINE_SIZE xxx /* 命令キャッシュラインサイズ */ #define NIOS2_DCACHE_SIZE xxx /* データキャッシュサイズ */ #define NIOS2_DCACHE_LINE_SIZE xxx /* データキャッシュラインサイズ */ ===================================================================== バージョン履歴 ===================================================================== 2009/09/10 ・非依存部 Release 1.4.0 に対応 ・SIO割込みハンドラsio_isrの引数の型をintptr_tに変更(jtag_uart.*) 2008/09/09 ・最初のリリース 以上.