FC2ブログ

[NiosII]キャッシュバイパスしてデバイスレジスタへアクセスする方法

uClinuxをNiosIIへ搭載するためzImage作成まで行ったが、NiosII /fを初めて使ったら、
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);

なるほど、キャッシュバイパスするコマンドを使う必要があるのか。
もしくは、このコマンドを使わなくても、都度、キャッシュストアすれば良いのかな?
または、このアドレスをキャッシュ対象外にすれば良いのかな?
スポンサーサイト



コメントの投稿

非公開コメント

カレンダー
09 | 2019/10 | 11
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード