090920

|



ゆっくりとガレージの掃除。掃除機のホースを交換したり、水漏れするホース
リールを修理したりとペンディング事項の処理に。まだまだいっぱいある。

今日もまた大根が一本やられてしまった。残り4本しかない。危機を感じてやら れた大根のまわりをスコップで掘り起こしてみたところ、ヨトウムシ見つけた。 一回でもやられたらなんとかして探して殺さないとだめだ。
ヤフオクで落としたキャリパーはマジックリンでゴシゴシ洗った後にガラスビー ズでサンドブラスト。

ピストンはエアだけで軽くポンッととれた。内側も綺麗。これならホーニング しないでOKだ。
ピストン、シールは新品にします。NSR50のリアブレーキと共通なので供給に不 安はない。

うちのサンドブラストはワールドインポートツールズのLサイズ。左右が開いて 大きな物も入れれるし、メディアはエアを使って、上のサンドボックスに循環 できる。密閉性も高いです。ただこれをフルに動かすにはかなりの容量のコン プレッサーが必要。うちのコンプレッサーは小さいので、フルには活用できな い。
メディアの吸い込みを掃除機+サイクロンにして...すれば最強なのだけど、そ こまでする時間もなく。そもそもそんなに使わないし。とはいえ、「あーちょっ とブラストしたい」って時にこれがあるとないとじゃ幸せ度が格段に違う。

手を入れる部分が劣化して穴が空いてきてしまった。しかし穴が空いても、こ のブラストキャビネットの場合、メディアの循環で機内が負圧になるので外に は漏れない。

SH4A続き。-m2(SH2)でudivsi3_i4iがundefined referenceになってしまう解決
法はgcc-4.3.2/gcc/config/sh/embed-elf.hに書いてあった。

/* While the speed-optimized implementations of udivsi3_i4i / sdivsi3_i4i
   in libgcc are not available for SH2, the space-optimized ones in
   libgcc-Os-4-200 are.  Thus, when not optimizing for space, link
   libgcc-Os-4-200 after libgcc, so that -mdiv=call-table works for -m2.  */

-lgcc-Os-4-200すればよい。
他にgccのオプションで

  -mdivsi3_libfunc= Specify name for 32 bit signed division function

というのもあるのだけど、ちょっとうまくいかなかった。

これでFPU関連の例外もテスト。

uint32_t
exception (int32_t argc __attribute__((unused)),
     const char *argv[] __attribute__((unused)))
{
  // __asm volatile (".short 0xfffd");	// 0x180
  // __asm volatile ("trapa #33");	// 0x160
  //  __asm volatile ("1: nop; bra 1b; mov.l 2f, r0;.align 2;2: .long 0xaa");//0x1a0
  //  __asm volatile (".byte 0xff"); // 0x100
  //  __asm volatile ("mov r15, r0;add #1, r0;mov.l @r0, r1");// 0xe0
  //  __asm volatile ("mov r15, r0;add #1, r0;mov.l r1, @r0"); //0x100
FPU無効化してあれば、一般FPU抑止例外
  //  __asm volatile ("fneg fr0");	// 0x800
FPU無効化してあれば、スロットFPU抑止例外
  //  __asm volatile ("bra 1f;fneg fr0;1:");// 0x820
  extern void fpu_exception_init (void);
  uint32_t r;
  __asm volatile ("sts	fpscr, %0" : "=r" (r));
  printf ("%x\n", r);
ここでFPU例外を出すようにします。
  fpu_exception_init ();

  __asm volatile ("sts	fpscr, %0" : "=r" (r));
  printf ("%x\n", r);
FPU例外 (これはゼロ割り)
  float i = 0.;
  __asm volatile ("fmov.s %0, fr0;fdiv fr0, fr1":: "m"(i)); // 0x120
  printf ("skip instruction\n");

  return 0;
}

FPUに全部の例外を出すように設定。
FUNC (_fpu_exception_init)
	sts	fpscr,	r0
	mov.l	.L_FPU_EN, r1
	or	r1,	r0
	lds	r0,	fpscr
	rts
	 nop
	.align 2
.L_FPU_EN:
	.long	0xf80


レジスタバンクをうまく使う方法を考えていたのだけど、どうもない。割り込
みの終了でコンテキストスイッチするとなると、結局全部退避することになる。
コンテキストスイッチなしの割り込みを設定したとしても割り込みは全て同じ
入口から入るので、INTEVTを調べてからでないと処理ができない。

これがベクタ型の割り込みならベクタごとに設定できるのだけど、それが
できない。

この点、ARMはFIQとIRQと入口を分けることで、うまくやっている。IRQ入り口
なら全退避、FIQ入口ならバンクを利用と、切り分けできるから。そしてIRQの
時はR14とR15のみのバンク、FIQはR0-R15のバンクと必要最小限にとても効率的
だ。

そしてARMの割り込みコントローラはVIC(Vectored Interrupt Controller)が標
準なのだけど、これがよくできていて、最初にベクタテーブルを設定しておけ
ば該当割り込みのベクタをレジスタに設定してくれる。これによって割り込み
入ってからはそのレジスタの値にジャンプすればいいだけなのだ。