[Armadillo:06857] Re: Armadillo-300 拡張バスについて
Takenoshita Koyo
email@hidden
2011年 3月 4日 (金) 19:00:52 JST
竹之下です。
インラインでご回答します。
東海ファームウェア(株) さんは書きました:
> お世話になります、TFC小林です。
>
> 抜粋したので、つじつまが合わないところがあるかもしれません。
>
> ご指摘どおり、/dev/memを使用しています。
>
> 2つのアドレス空間をアクセスしたいので、
> mmapが2つあります。
>
> #define NS_MEM_MODULE_BASE_PA 0xA0700000
> #define NS_MEM_MODULE_SIZE 0x00100000
>
> #define PARAM_SIZE_MASK 0xffffff
> #define EXT_FPGA_BASE_ADDR 0x70000000
> #define PARAM_SIZE 0x1000000
>
> unsigned short *mapadrs;
> unsigned int *mapadrs2;
>
> char *dev = "/dev/mem";
> unsigned int data;
>
> // レジスタアクセス空間の指定
> fd = open(dev, O_RDWR);
> if (fd < 0){
> return -1;
> }
>
> mapadrs = (unsigned short*)mmap(0, PARAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, EXT_FPGA_BASE_ADDR);
> mapadrs2 = (unsigned int*)mmap(0, NS_MEM_MODULE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, NS_MEM_MODULE_BASE_PA);
>
> if(mode==0){
> volatile unsigned short* reg = (volatile unsigned short*)mapadrs;
> data=reg[0];
リードで16bitアクセスが2回発生する件は、ここで発生しているものと思います。
ここで、左辺の変数dataはunsigned int型なので、右辺もunsigned int型に暗黙的な型変換(キャスト)
されているので、32bitアクセスになっているのではないでしょうか?
変数dataの型をunsigned shortに変更すると、挙動はどのように変化しますか?
> reg[0]=(unsigned short)data;
ライトで8bitアクセスが2回発生する件は、ここで発生しているものと思います。
これは、arm用のgccが標準ではハーフワード単位での入出力インストラクションを
使わずに、バイト単位でアクセスするようになっているためだと思います。
(後方互換性のため)
ハーフワード単位での入出力インストラクションは、armv4から使えますので、
コンパイルオプションに -march=armv4 を付けることで対処できると思います。
以下に簡単な説明を書いていますので、ご参照ください。
http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-2.0.0/ch06.html#sec_gcc_machine_depend_options
> }else{
> volatile unsigned int* reg = (volatile unsigned int*)mapadrs2;
> data=reg[0];
> reg[0]=data;
> }
>
> 以上、よろしくお願いします。
>
>
--
Koyo Takenoshita
armadillo メーリングリストの案内