[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 メーリングリストの案内