[Armadillo:06858] Re: Armadillo-300 拡張バスについて

TFC 小林 email@hidden
2011年 3月 4日 (金) 22:16:20 JST


お世話になります TFC小林です。

> >   data=reg[0];
> リードで16bitアクセスが2回発生する件は、ここで発生しているものと思い
> ます。

unsigned shortに変更しましたが、2回出力されてしまいました。
厳密にはまずい構文ですので直しました。ご指摘ありがとうございます。

> ハーフワード単位での入出力インストラクションは、armv4から使えますので、
> コンパイルオプションに -march=armv4 を付けることで対処できると思います。

-march=armv4オプションをつけたところ、
リード及び、ライトとも希望通りの1回出力にすることが出来ました。

しかし、makeでコンパイルを行うと2回でてしまいました。
なにか、間違いがあるでしょうか?

<コンパイル lftpで転送すると希望通りの動きになる>
arm-linux-gcc MacProgram.c command.c sub.c App.c -lm -lrt -march=armv4 -o
App

<Makefile Flashに焼いて動作させると以前のままでNG>
LDFLAGS = -lm -lrt -march=armv4
EXEC = App
OBJS = sub.o command.o MacProgram.o App.o
all: $(EXEC)
$(EXEC): $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
clean:
	-rm -f $(EXEC) *.elf *.gdb *.o
romfs:
	$(ROMFSINST) /bin/$(EXEC)
%.o: %.c
	$(CC) -c $(CFLAGS) -o $@ $<




> -----Original Message-----
> From: email@hidden
> [mailto:email@hidden] On Behalf Of
> Takenoshita Koyo
> Sent: Friday, March 04, 2011 7:01 PM
> To: Armadillo series general discussion list
> Subject: [Armadillo:06857] Re: Armadillo-300 拡張バスについて
>
> 竹之下です。
>
> インラインでご回答します。
>
> 東海ファームウェア(株) さんは書きました:
> > お世話になります、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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo




armadillo メーリングリストの案内