100715

|


VFC304Aサイクロン装着時にどの程度部屋を負圧にできるか試してみた。SPFの
1x4材にVU40が通る穴を開けて外の扉に狭んで目張り。

サイクロン側は直結にしたのだけれど、気持ち昨日より吸引力が弱い感じ。吸 気も多少直管部分を入れた方がいいのかな。あとエルボの曲げがきついのが ちょっと気になる。

試してみると、やっぱり静圧は稼げても流量が少ないのでほとんど空気の流れ なし。隙間だらけの部屋なのでいろいろな部分から吸ってしまう分でまかなわ れてしまっている感じ。

今のシロッコファンならびゅーびゅー空気が入ってくる。排気は今のシロッコ ファンのままが安牌だ。

トーションボックスは周りにSPF材を貼りつけて完成。ちょっと手抜きして箱の 高さと同じにして貼りつけたのだけど、長辺は微妙に反ってしまい失敗。ちょっ と大き目で貼りつけて後でトリミングカッターで面一に仕上げるべきだった。

久々にSH2A続き。いつのまにか一ヶ月も経ってしまった。割り込みまで終わっ たとこだった。次はキャッシュ。SH7262は高速内蔵RAM64KBと大容量内蔵RAM1MBが あり
高速内蔵RAM64KB :0xfff80000-0xfff8ffff,
大容量内蔵RAM1MB:0x1c000000-0x1c0fffff(cached) 0x3c000000-0x3c0fffff(uncached)
になっている。本来プログラムは高速内蔵RAMに置いて大容量内蔵RAMはフレー ムバッファとして使うのが筋だけれど、今は大容量内蔵RAMにプログラムを置い ている。キャッシュ自体はいつものSH。キャッシュ自体がメモリマップされて いるちょっと独特な形態。これはこれでとても便利。キャッシュを扱う命令は PREF(プリフェッチ)しかないのでメモリマップのキャッシュエリアを直接操作 することになる。
これを操作するプログラムはキャッシュ無効空間からでないとだめで、さらに 命令キャッシュをいじる時はその前と後に二回以上、内蔵周辺モジュールある いは外部アドレス空間(キャッシュ無効)へのアクセスをしないといけない。
まずはキャッシュ無効エリアと有効エリアを行ききする。これはSH4Aの時に書 いたのをそのまま。この他、インラインアセンブラでMOVA使うやり方だと、PC はMOVA実行時の4バイト先なのだけど、MOVAのアドレス計算は4バイト整列なの で、きちんと整列する必要がある。
このやり方だとPRに下駄をはかせているのでそういうイヤらしさとは無縁。
FUNC (_cpu_run_P2)
	sts	pr,	r0
	mov.l	.L_P2,	r1
	or	r1,	r0
	lds	r0,	pr
	rts
	 nop
.L_P2:	.long	0x20000000

FUNC (_cpu_run_P1)
	sts	pr,	r0
	mov.l	.L_P1,	r1
	and	r1,	r0
	lds	r0,	pr
	rts
	 nop
.L_P1:	.long	0xdfffffff
テスト。例えばこのCPU_GET_PCのマクロだと、このMOVAの位置が4バイト整列か そうでないかで返り値の差すPCは、ずれる。後MOVAのオペランドはR0固定なの でgccが自動に割り付けないように固定。
#define	CPU_GET_PC(r)					\
{							\
  /* MOVA destitination register is R0 only.*/		\
  register uint32_t r0 __asm ("r0");			\
  __asm volatile ("nop;mova @(0, pc), %0" : "=r"(r0));	\
  (r) = r0;						\
}
  uint32_t pc;

  CPU_GET_PC (pc);
  printf ("ohayo0 %x\n", pc);
  cpu_run_P2 ();
  CPU_GET_PC (pc);
  printf ("ohayo1 %x\n", pc);
  cpu_run_P1 ();
  CPU_GET_PC (pc);
  printf ("ohayo2 %x\n", pc);

user> test
ohayo0 1c00142c
ohayo1 3c001444
ohayo2 1c001458
user> 

4バイト整列にMOVAがくれば

1c001420 <_test>:
1c001420:	2f 86       	mov.l	r8,@-r15
1c001422:	2f 96       	mov.l	r9,@-r15
1c001424:	4f 22       	sts.l	pr,@-r15
1c001426:	00 09       	nop	
1c001428:→	c7 00       	mova	1c00142c <_test+0xc>,r0
1c00142a:	d8 10       	mov.l	1c00146c <_test+0x4c>,r8	! 1c003040 <_data_end>
1c00142c:←ここ	d9 10       	mov.l	1c001470 <_test+0x50>,r9	! 1c0006e

4バイト整列ではないところにMOVAがくれば

#define	CPU_GET_PC(r)					\
{							\
  /* MOVA destitination register is R0 only.*/		\
  register uint32_t r0 __asm ("r0");			\
  __asm volatile ("mova @(0, pc), %0" : "=r"(r0));	\
  (r) = r0;						\
}

user> test
ohayo0 1c001428
ohayo1 3c001440
ohayo2 1c001450
user> 

1c001420 <_test>:
1c001420:	2f 86       	mov.l	r8,@-r15
1c001422:	2f 96       	mov.l	r9,@-r15
1c001424:	4f 22       	sts.l	pr,@-r15
1c001426:→	c7 00       	mova	1c001428 <_test+0x8>,r0
1c001428:←ここ	d8 0f       	mov.l	1c001468 <_test+0x48>,r8	! 1c00303c <_data_end>
1c00142a:	d9 10       	mov.l	1c00146c <_test+0x4c>,r9	!