[NiosII]キャッシュバイパスしてデバイスレジスタへアクセスする方法
LEDチカチカさえ出来ない事に苦戦。
失敗した時の現象は、
①NiosII EDSのRun As NiosII Hardwareでダウンロード試みても、System IDミスマッチエラーになる。
②System IDミスマッチエラーは出ないが、ダウンロード中にエラーで終わる。
③①も②のエラーも無く、ダウンロード完了しても、LEDがチカチカしない。
①、②はおそらくSSRAM用外部ポートのタイミング制約を変えたりすると、上手く行ったり、行かなかったり。
まあ、SSRAM関連の設定を見直そう。
③は、なぜこうなるか理由が分からなかった。が、以下資料読んでたら、これまで使ってたNiosII /eと
/fの違いとして、キャッシュの有無に着目。
参照: http://www.altera.co.jp/literature/hb/nios2/n2sw_nii52007_j.pdf
ページ7-4
C プログラマの場合、ポインタをvolatile として宣言し、このvolatile
ポインタを使用してアクセスしても、データ・キャッシュをバイパスで
きないことに注意してください。volatile キーワードは単に、コンパ
イラがポインタを使用したアクセスを最適化しないようにするためのも
のです。
こんな説明があったので、説明に従い、キャッシュをバイパス出来る命令「IOWR_32DIRECT」を使う。
以下修正をすると、やっとチカチカ出来た。
・io.hをプロジェクトへコピーして置く。
・#include "io.h" をソース先頭に追加。
・アクセスコマンドを以下の通り変更。
修正前: *((volatile unsigned int *)0x00001050) = 0xffffffff;
修正後: IOWR_32DIRECT(0x00001050, 0, 0xffffffff);
なるほど、キャッシュバイパスするコマンドを使う必要があるのか。
もしくは、このコマンドを使わなくても、都度、キャッシュストアすれば良いのかな?
または、このアドレスをキャッシュ対象外にすれば良いのかな?
[NiosII]SBT for Eclipseの手順を覚える
プロジェクト名(例:hoge)を書いて、BPSのcreateボタン実行。
起動したウィンドウで、BSPプロジェクト名(例:hoge_bsp)入力。
> SOPC Info選択。 > Finish > [BSP Build complete]と出る。
Use default locationのチェック外す。 > プロジェクトDIRをブラウズ。 > Finish
> 何やら実行され、Windows7の場合、変更してOK or NGの確認ウィンドウ出るのでOK。
ここで以下出てエラー終了。まだmain含んだCソース置いてないから?
c:/・・・/hogehoge_bsp/HAL/src/alt_main.c:154: undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [hogehoge.elf] Error 1
(2011/4/5追記)
エラーは消えて、buildは成功したのだが、Run As > NiosII Hardwareからダウンロード
しようとすると、エラーとなる。
SystemIDが無いとか言われているような。でも設定でIgnore SystemIDっていうのをチェック
したのだが。Webエディションだから、Win7 64bit未対応とか?
(NiosII IDEは64bitでバグッた画面だったけど、Eclipseの方は正常動作に見えるが)
!ENTRY com.altera.sbtgui.launch 2 0 2011-04-05 22:00:50.532
!MESSAGE Expected base address of system ID component is undefined.
!ENTRY com.altera.sbtgui.launch 2 0 2011-04-05 22:00:50.532
!MESSAGE Expected base address of system ID component is undefined.
!ENTRY com.altera.sbtgui.launch 2 0 2011-04-05 22:00:56.434
!MESSAGE Expected base address of system ID component is undefined.
!ENTRY com.altera.sbtgui.launch 2 0 2011-04-05 22:00:56.435
!MESSAGE Expected base address of system ID component is undefined.
!ENTRY com.altera.sbtgui.launch 4 0 2011-04-05 22:00:56.517
!MESSAGE No Byte Stream Services found for Nios II Console View
!ENTRY com.altera.sbtgui.launch 1 0 2011-04-05 22:00:56.518
!MESSAGE Executing: [C:\Windows\system32\cmd.exe, /C, C:/altera/10.1/quartus\bin\cygwin\bin\bash.exe, -c, nios2-download '--cable=USB-Blaster on localhost [USB-0]' --device=1 --instance=0 --stop --accept-bad-sysid]
!ENTRY com.altera.sbtgui.launch 4 0 2011-04-05 22:01:01.140
!MESSAGE Failed Executing: [nios2-download, '--cable=USB-Blaster on localhost [USB-0]', --device=1, --instance=0, --stop, --accept-bad-sysid] return code: 4, 'other error'
!ENTRY com.altera.sbtgui.launch 1 0 2011-04-05 22:01:01.141
!MESSAGE Executing: [C:\Windows\system32\cmd.exe, /C, C:/altera/10.1/quartus\bin\cygwin\bin\bash.exe, -c, nios2-download '--cable=USB-Blaster on localhost [USB-0]' --device=1 --instance=0 --go --accept-bad-sysid --reset-target /cygdrive/c/user/work/neek/c_test/software/hello_world/hello_world.elf]
!ENTRY com.altera.sbtgui.launch 4 0 2011-04-05 22:01:06.391
!MESSAGE Failed Executing: [nios2-download, '--cable=USB-Blaster on localhost [USB-0]', --device=1, --instance=0, --go, --accept-bad-sysid, --reset-target, /cygdrive/c/user/work/neek/c_test/software/hello_world/hello_world.elf] return code: 4, 'other error'
!ENTRY com.altera.sbtgui.launch 4 0 2011-04-05 22:01:06.392
!MESSAGE Downloading ELF Process failed
(2011/4/20追記)
なんともエラーが直らない。Ignore System IDにチェック入れても結局同じエラーだし。
諦めてとりあえず、LEDチカチカの最小構成をSOPC Builderで組み直した。
結果、Ignore System IDにチェック入れて、無事SWダウンロード出来た。
ちゃんとLEDチカチカするし、WAIT時間によって点滅が変わるから、上手く行ってる証拠。
そうすると、NiosII SBTの手順は正しくて、システム構成のどこかにエラー原因があると。
少しづつ回路を追加していって、ダウンロードがエラーになる原因を探る。
それにしても、NiosII+PIO+プログラムRAMという小さい構成であるものの、
コンパイル時間が38秒って(Win7 64bit)。やたら早いな。
Quartusでは、SOPC Builder内の各IPはハードIPとかでタイミングMET済みのデータを
ツール内部で持ってるとか?だったら納得だけど。
ソフトCPU(=NiosII)をコンパイルするにも関わらず1分以内って早過ぎだな。
Xilinxとは大違いって感じたけど、実はISEのSystem Builder?でも同じくらいなのかな・・・?
[NiosII]IDEからSBT(Software Build Tools) for Eclipseへの移行
Windows 7が入ったノートが夏前に買ったきり、ほったらかしになっている。
ソフト開発環境には、Legacy IDEと、SBT for Eclipseと2つあるようだ。
Eclipseの方はWindows 7で動くのでは?と期待して、ちょっといじってみた。
■ソフトのビルド
・SBT起動時に出てくるプロジェクト場所指定で適当な場所にして、
サンプルプロジェクトをhello_worldで決定すると、何やら実行されて
指定したPRJ名
指定したPRJ名 + _bsp
のフォルダができる。
IDEでビルド成功してるデータ一式をそのままコピーしてSBTでビルド
すると、いろいろエラー。IDEでは読んでくれたincludeファイルのパス
の解釈が違う?ようで、「not found」的なエラー発生。
ファイル移動して対処。
■シミュレーション
・SBTでビルドしただけでは、hexやdatが生成されなかった。
IDEではビルドすると、SOPC Builderプロジェクト場所に、
PRJ名 + _sim
というフォルダへdatとhexが生成される仕組み。
これを読み込んでシミュレーション成功していた。
・何となく以下手順でやってみたら、hexが生成された。
SBTでビルド > 左側のProject Explorer内のelf上右クリック > Run As
> Run Configurations > NiosII ModelSimでダブルクリック
> 最上段のNameにテキトーな名前入力(今回はPRJ名+_conf)
> ModelSim Pathにツールexeまでのパス名入力。
> RUNで実行。
すると以下エラーでSTOPしたがem_init内にhexが生成された。
mem_init/hdl_simというフォルダもあるがこちらは空。
**** Build of configuration Nios II for project hoge_eclipse ****
make mem_init_install
Info: Building ../hoge_eclipse_bsp
make --no-print-directory -C ../hoge_eclipse_bsp
[BSP build complete]
Post-processing to create mem_init/prog_mem.hex...
elf2hex hoge_eclipse.elf 0x02008000 0x02008fff --width=32 \
--create-lanes=0 mem_init/prog_mem.hex
Post-processing to create mem_init/sgdma_desc.hex...
elf2hex hoge_eclipse.elf 0x02014000 0x02014fff --width=32 \
--create-lanes=0 mem_init/sgdma_desc.hex
Post-processing to create mem_init/sgdma_mmc_desc.hex...
elf2hex hoge_eclipse.elf 0x00002000 0x00002fff --width=32 \
--create-lanes=0 mem_init/sgdma_mmc_desc.hex
Post-processing to create cfi_flash.flash...
elf2flash --input=hoge_eclipse.elf --outfile=cfi_flash.flash --sim_optimize=0 --base=0x06000000 --end=0x06ffffff --reset=0x06000000 --boot="C:\altera\91\nios2eds/components/altera_nios2/boot_loader_cfi.srec"
2010/11/30 21:57:10 - (致命的) elf2flash: Boot copier overlaps data in flash
2010/11/30 21:57:10 - (致命的) elf2flash: Error generating Flash file, exiting
make: *** [cfi_flash.flash] Error 5
現構成では外付Flashへプログラム格納していて、IDEだと「cfi_flash.dat」が生成されて、
シミュレーションに使っているが、Flashに関するデータが生成されない。
まだ何かやる事があるのかな?
ちなみにIDEの方のシミュレーション用ファイル作成については以下に書いてあるみたい。
Simulating Nios II Embedded Processor Designs
http://www.altera.co.jp/literature/an/an351.pdf
(2010/12/1追記)
■Flash Programmer
参考資料
http://www.altera.com/literature/ug/ug_nios2_flash_programmer.pdf
・SBT起動 > NiosII > Flash Programmer > File > New
> BSP or SOPC INFOを選択。
> Flash Programmer画面起動後 > Hardware Connectionsボタン
> 以下2つにチェック。
そうしないと、回路内に2つ共入ってないためエラーMSG出て、焼き込み出来ない。
Ignore mismatched System ID
Ignore mismatched System timestamp
> Files for Flash conversionの欄へ、sofとelfを追加。
> 右下のStartで焼き込み開始。すると以下エラーで失敗。
Error code: 8 for command: $SOPC_KIT_NIOS2/bin/nios2-flash-programmer
"C:/user/work/neek ..../_cfi_flash.flash" --base=0x4000000
--accept-bad-sysid --device=1 --instance=0 '--cable=USB-Blaster [USB-0]'
--program --verbose
何が悪いのか・・・もう少し参考資料を熟読する必要ありそうだ。
[NiosII][割り込み]メモ
http://www.altera.co.jp/literature/hb/nios2/n2sw_nii5v2_03_j.pdf
NiosII例外の概要
・NiosII例外処理は、従来からのRISC形式、すなわちすべての例外タイプが1つの例外ハンドラで処理される形式で実装。
したがって、すべての例外(ハード、ソフト)は、「例外アドレス」と呼ばれる1つの位置に存在するコードによって処理。
・以下の例外タイプが利用可能。
- ハードウェア割り込み例外。
- ソフトウェア例外(以下カテゴリに分類)
未実装命令
ソフトウェア・トラップ
その他の例外
・例外が生成されるとプロセッサは以下のステップを自動的に実行。
- statusレジスタ(ctl0)の内容をestatusレジスタ(ctl1)にコピーして、例外発生前のプロセッサ状態を保存。
- statusレジスタのPIEビットをクリアして、以降のハードウェア割り込みをディセーブル。
- 例外発生後の命令のアドレスをeaレジスタ(r29)に格納して、例外ハンドラが戻るリターン・アドレスを提供。
- 例外アドレスへのベクタ・ジャンプ。