2009年9月アーカイブ
今日は喉の痛みがちょっと収まったけれど、まだ多少熱っぽい。周囲に新型イ
ンフルエンザの感染者も出たし。週末の天気はどうみても望めない。テンショ
ンが海の底より低まっている。
この体調だと特走に行くか、それとも体調回復に努めるかの選択になりそう。 ピストンのナラシが...
岡山の受理書が来た。インフルエンザにかからないといいな。
SH4A続き。実際にキャッシュまわりを実装してみます。
この体調だと特走に行くか、それとも体調回復に努めるかの選択になりそう。 ピストンのナラシが...
岡山の受理書が来た。インフルエンザにかからないといいな。
SH4A続き。実際にキャッシュまわりを実装してみます。
メモリマップドのアドレスアレイ、データアレイをアクセスするには、そのコー
ドがP2(アンキャシュド)で動かさないといけない。カーネルは大概P1(キャッシュ
ド)で動いている。プログラムの進行とともにP1とP2で移動しないといけない。
そこはこのようにしてみた。一度サブルーチンコールすることで、リターンア
ドレスをPRに乗せ、それのエリアを変更して、RTSで元に戻す。
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
実際にPCが変化してるかのチェックには
#define CPU_GET_PC(r) \
{ \
register uint32_t r0 __asm ("r0"); \
__asm volatile ("mova @(0, pc), %0" : "=r"(r0)); \
(r) = r0 - 2; \
}
のようにしてPCをとってきて確認。
CPU_GET_PC (r);
printf ("PC=%x\n", r);
cpu_run_P2 ();
CPU_GET_PC (r);
printf ("PC=%x\n", r);
cpu_run_P1 ();
CPU_GET_PC (r);
printf ("PC=%x\n", r);
test4> test
Privilege-mode, bank 1, Exception enabled, FPU enabled, IMASK=0x0
PC=89001176
PC=a900118e
PC=890011a2
fa8cdcff 0 0 0 0
test4>
まずCPU全体の設定をする必要がある。
void
cpu_init ()
{
SH4までは物理アドレス29bitなのだけど、SH4Aからは32bitに拡張することがで
きる。リセット後は29bit。それと同時に物理アドレス空間0-7のバッファドラ
イトの設定も異なってくる。ここはいずれということで、今回は29bitのまま。
// 29bit physical address.
// CPU doesn't wait for the end of writing bus access and starts
// next bus access
*PASCR = 0;
特定の命令を実行、エリアをアクセスした時に次の命令をフェッチからやり直
すかどうかの設定。ここでIRMCRで常に再フェッチという設定ができるのだけど、
これは今後のSuperHでは保証されない可能性がある。ので使わないようにした。
(パフォーマンス的にもよくない)となると、各種のレジスタの設定の後にRTE、
あるいはICBI命令を入れてやらないといけない。
これは
#define CPU_SYNC_RESOURCE() __asm volatile ("icbi @%0" :: "r"(0x80000000))
にした。
// Don't re-fetch all.
*IRMCR = IRMCR_R2 | IRMCR_R1 | IRMCR_LT | IRMCR_MT | IRMCR_MC;
}
キャッシュの初期化。CCRの設定はP2から行なわないとならず、さらにはキャッ
シュ領域に戻る前の、おまじない(上のCPU_SYNC_RESOURCE)がいる。
void
sh7785_cache_init ()
{
// CCR modifications must only be made by program in the P2(uncached) area.
cpu_run_P2 ();
ここで全部のキャッシュを無効化します。しないとマニュアルリセットの場合、
予想外のものがキャッシュにのってしまう。
// Reset cache. invalidate all.
*SH7785_CCR |= (CCR_ICI | CCR_OCI);
省電力のために2-wayだけのモードもあるけれど、それは使わない。
// I/D-cache 4way, use I-cache way-prediction.
*SH7785_RAMCR = 0;
ここでキャッシュを有効にします。P0,P1,P3,U0、全てライトバックに(パフォー
マンスのため)。
// Enable I/D cache, P0,U0,P3 write-back, P1 write-back.
*SH7785_CCR = CCR_ICE | CCR_OCE | CCR_CB;
// After CCR has been updated, execute the ICBI instruction for any address.
CPU_SYNC_RESOURCE ();
// Return to P1(cacheable) again.
cpu_run_P1 ();
}
それぞれキャッシュの実装。ここからはNetBSDに流用することを考えてインター
フェースを合わせてある。
まずはデータキャッシュの操作。キャッシュシステムにまかせた操作。MMUを使
うでここで指定される仮想アドレスはMMUによって変換されることが前提。キャッ
シュ操作中にTLB例外が起きる。
データキャッシュを書き戻し無効化します。
void
sh7785_dcache_wbinv_range (vaddr_t va, vsize_t sz)
{
操作する範囲がキャッシュサイズより大きければ無駄なループをすることにな
るのでキャッシュエントリ全てを操作します。
if (sz > SH7785_DCACHE_SIZE)
{
sh7785_dcache_wbinv_all (); // Index ops.
return;
}
指定された仮想アドレスをキャッシュラインサイズで切り捨て、丸めます。し
なくてもいいけれど、こうした方が見通しがいい。ラインサイズの中のどこで
も結局ラインサイズで操作されることになるので結果は変わらない。
vsize_t eva = ROUND_CACHELINE_32 (va + sz);
va = TRUNC_CACHELINE_32 (va);
while (va < eva)
{
// Hit write-back-invalidate. this may occur TLB miss.
このラインについて操作。
__asm volatile ("ocbp @%0" :: "r"(va));
次のラインまでスキップします。
va += SH7785_CACHE_LINESZ; // next cache line.
}
バスアクセスの終了を待ちます。
__asm volatile ("synco");
}
データキャッシュを無効化。これはキャッシュドのバッファを用いて機器→
CPUのDMAをする時に、CPUからデータを取り出す時に必要。書き戻してしまった
らDMAからのデータが上書きされてしまうからだ。この際、DMAバッファはキャッ
シュのラインサイズでアラインされてないといけない。アラインされてないと、
DMAバッファのすぐ横のデータはメモリに書き戻されることなく、捨てられてし
まうことになる。
void
sh7785_dcache_inv_range (vaddr_t va, vsize_t sz)
{
vsize_t eva = ROUND_CACHELINE_32 (va + sz);
va = TRUNC_CACHELINE_32 (va);
while (va < eva)
{
// Hit invalidate. this may occur TLB miss.
__asm volatile ("ocbi @%0" :: "r"(va));
va += SH7785_CACHE_LINESZ; // next cache line.
}
バスアクセスがないから終了はいりません。
}
データキャッシュの書き戻し。
void
sh7785_dcache_wb_range (vaddr_t va, vsize_t sz)
{
vsize_t eva = ROUND_CACHELINE_32 (va + sz);
va = TRUNC_CACHELINE_32 (va);
while (va < eva)
{
// Hit write-back. this may occur TLB miss.
__asm volatile ("ocbwb @%0" :: "r"(va));
va += SH7785_CACHE_LINESZ; // next cache line.
}
__asm volatile ("synco"); ここはバスアクセスがあります。
}
次はインデックス操作。皆殺し方。TLB例外が起きないのと、現在のアドレスマッ
プによらないのがこの操作の使い所。
void
sh7785_dcache_wbinv_range_index (vaddr_t va, vsize_t sz)
{
メモリマップドのアドレスアレイ、データアレイを使うにはP2に。
cpu_run_P2 ();
vsize_t eva = ROUND_CACHELINE_32 (va + sz);
va = TRUNC_CACHELINE_32 (va);
if (sz > SH7785_DCACHE_SIZE)
{
sh7785_dcache_wbinv_all (); // Index ops.
return;
}
while (va < eva)
{
指定された仮想アドレスからアレイの場所を指定します。現在のアドレスマッ
プによらないことを期待した関数なので、連想なし。
uint32_t addr = SH7785_CCDA | (va & (CCIA_ENTRY_MASK << CCIA_ENTRY_SHIFT));
このエントリの全てのウェイに操作。
*(volatile uint32_t *)(addr | 0) &= ~(CCDA_U | CCDA_V);
*(volatile uint32_t *)(addr | (1 << CCIA_WAY_SHIFT)) &= ~(CCDA_U | CCDA_V);
*(volatile uint32_t *)(addr | (2 << CCIA_WAY_SHIFT)) &= ~(CCDA_U | CCDA_V);
*(volatile uint32_t *)(addr | (3 << CCIA_WAY_SHIFT)) &= ~(CCDA_U | CCDA_V);
va += SH7785_CACHE_LINESZ;
}
メモリマップドのアドレスアレイ、データアレイの操作の終了にはこれらが必要。
CPU_SYNC_RESOURCE ();
cpu_run_P1 ();
}
データキャッシュ全て、書き戻し無効化。これはインデックスで操作した方が
てっとり早い。
void
sh7785_dcache_wbinv_all ()
{
int entry;
uint32_t addr;
// D-cache writeback invalidate.
for (entry = 0; entry < SH7785_CACHE_ENTRY; entry++)
{
// non-associate. clear valid, dirty bit.
addr = SH7785_CCDA | (entry << CCDA_ENTRY_SHIFT);
// flush all way.
*(volatile uint32_t *)(addr | 0) &= ~(CCDA_U | CCDA_V);
*(volatile uint32_t *)(addr | (1 << CCDA_WAY_SHIFT)) &= ~(CCDA_U | CCDA_V);
*(volatile uint32_t *)(addr | (2 << CCDA_WAY_SHIFT)) &= ~(CCDA_U | CCDA_V);
*(volatile uint32_t *)(addr | (3 << CCDA_WAY_SHIFT)) &= ~(CCDA_U | CCDA_V);
}
}
命令キャッシュについて。
ここでも全てのI-cacheを無効化するのにはインデックス操作で直接いじります。
32KBまわすよりいいし、これならTLBミスが起きないのでどのような状況でも使える。
命令キャッシュの操作には全て、それに先じて該当する領域のデータキャッシュ
を書き戻し無効化する。それはこの操作をするのは、この領域にプログラムを
データキャッシュを経由して、書きこんで、これからその領域を実行すること
を期待した操作だから。
void
sh7785_icache_sync_all ()
{
データキャッシュと同じく32KB以上の領域の操作なら直接アドレスアレイを指
定して操作。
// Memory-mapped cache array must be accessed in the P2 area program.
cpu_run_P2 ();
int entry;
uint32_t addr;
// D-cache writeback invalidate.
sh7785_dcache_wbinv_all (); // Index ops.
// I-cache invalidate
for (entry = 0; entry < SH7785_CACHE_ENTRY; entry++)
{
addr = SH7785_CCIA | (entry << CCDA_ENTRY_SHIFT);
// non-associate. clear valid bit.
*(volatile uint32_t *)(addr | 0) &= ~CCIA_V;
*(volatile uint32_t *)(addr | (1 << CCIA_WAY_SHIFT)) &= ~CCIA_V;
*(volatile uint32_t *)(addr | (2 << CCIA_WAY_SHIFT)) &= ~CCIA_V;
*(volatile uint32_t *)(addr | (3 << CCIA_WAY_SHIFT)) &= ~CCIA_V;
}
CPU_SYNC_RESOURCE ();
cpu_run_P1 ();
}
void
sh7785_icache_sync_range (vaddr_t va, vsize_t sz)
{
// round/truncate with cache line.
vsize_t eva = ROUND_CACHELINE_32 (va + sz);
va = TRUNC_CACHELINE_32 (va);
sh7785_dcache_wbinv_range (va, sz);
while (va < eva)
{
// Hit invalidate. this may occur TLB miss.
__asm volatile ("icbi @%0" :: "r"(va));
va += SH7785_CACHE_LINESZ; // next cache line.
}
}
void
sh7785_icache_sync_range_index (vaddr_t va, vsize_t sz)
{
cpu_run_P2 ();
vsize_t eva = ROUND_CACHELINE_32 (va + sz);
va = TRUNC_CACHELINE_32 (va);
if (sz > SH7785_ICACHE_SIZE)
{
sh7785_icache_sync_all ();
return;
}
sh7785_dcache_wbinv_range_index (va, sz);
while (va < eva)
{
uint32_t addr = SH7785_CCIA | (va & (CCIA_ENTRY_MASK << CCIA_ENTRY_SHIFT));
*(volatile uint32_t *)(addr | 0) &= ~CCIA_V;
*(volatile uint32_t *)(addr | (1 << CCIA_WAY_SHIFT)) &= ~CCIA_V;
*(volatile uint32_t *)(addr | (2 << CCIA_WAY_SHIFT)) &= ~CCIA_V;
*(volatile uint32_t *)(addr | (3 << CCIA_WAY_SHIFT)) &= ~CCIA_V;
va += SH7785_CACHE_LINESZ;
}
CPU_SYNC_RESOURCE ();
cpu_run_P1 ();
}
今日も喉が痛い。多少熱っぽいし。困った。
SH4A続き。キャッシュシステムについておさらいしておこう。
SH4A続き。キャッシュシステムについておさらいしておこう。
SH4Aのキャッシュは仮想インデックス物理タグキャッシュだ。キャッシュのイ
ンデックスは仮想アドレスから生成し、キャッシュのタグにはMMUで変換された
物理アドレスを使用する。
仮想アドレス
[31:10]の22bitはMMUで物理アドレスに変換されてキャッシュのタグになる。
+----------------------------+
|31..................13|12.10|9.....5|4.2|10|
+-------------+
[12:5]の8bitがキャッシュのインデックスになる。
+------+
[4:0]はラインサイズの中の場所。
[31:10]がMMUの変換になるのは最少の1Kページに合わせてある。1Kページの場
合、インデックスの[12:10]はアドレスマッピングによるけれど、[9:0]は物理
アドレスに一致するので、物理タグの[31:10]とインデックスの[9:0]でキャッ
シュシステムがアクセスすべき物理アドレスが確定する。
MMUを4Kページとした場合、MMUの変換になるのは[31:12]
VPN
+-------------------------+
|31..................13|12|11|10|9.....5|4.2|10|
+-------------+
INDEX
キャッシュインデックスの12bit目が変換対象となるので、共有メモリの場合、
二つ以上あるアドレスマップの設定によっては、同じ物理アドレスが二つの異
なるキャッシュインデックスに乗ってしまう可能性もある。(シノニム)
命令キャッシュ、あるいはリードオンリーのデータキャッシュであれば、キャッ
シュエントリが消費されるだけなので問題ない。
しかし書き込むことがあると一貫性に矛盾が生じる。解決方としてはマニュア
ルでは、同じ物理メモリを参照するアドレスマップは12bit目を同じにしろとあ
るけれど、これは結構難しい要求だ。
それができない場合は、
+ 共有されるとわかったところで、そのページをアンキャッシュドにする。
あるいは
+ コンテキストスイッチ(アドレスマップの切り替え)の時には常にキャッシュ
フラッシュする。
共有メモリがなければアドレスマップの切り替えでキャッシュフラッシュの必
要はない。それはキャッシュのタグが物理アドレスだから。
キャッシュのアクセスにはキャッシュ命令として
OCBI @Rn d-cache invalidate
OCBP @Rn d-cache write-back invalidate
OCBWB @Rn d-cache write-back
MOVCA.L R0,@Rn d-cacheにメモリからのロードなしに書き込み。
ICBI @Rn i-cache invalidate
SYNCO 完了待ち
とある。SYNCOを除き、これらのキャッシュ命令は、キャッシュシステムを使っ
てタグを生成するので、物理アドレスを特定するのにMMUを使う。なのでTLB例
外を生じる可能性がある。つまりMMUは該当するアドレスマップを提供すること
が前提だ。
他にメモリマップドのアドレスアレイ、データアレイによるアクセスもでき
る。(これは今後のSuperHシリーズではサポートされない可能性があるという
こと) これは、直接インデックスを指定してキャッシュを操作する。いわゆる
インデックス操作。MIPSでは、この操作もCACHE命令からできる(これは東芝だ
けだったかも?)
何が違うかというと、インデックスを直接指定することでTLBミスが絶対に起き
ないことだ。
TLBミスによるアドレスマップによらないので、いかなるアドレスマップによる
仮想アドレスに対しても操作ができる。
しかしインデックスの指定だけだと、実際にキャッシュにあるかどうかに関わ
らず、可能性のあるインデックスの全てのウェイを操作することになってしま
う。これはちょっと皆殺しだ。
その折衷案として、連想ありのアクセス方法もある。この場合指定したアドレ
スからTLBを経由してヒットしたのだけアクセスする。しかしTLBミスした場合
は例外を発生することなく、ノーオペレーション。つまりこれはカレントのア
ドレスマップに依存する。しかし、TLB例外は起こさずに進行したい時用かな。
朝起きると喉が痛い。不安だ。
そして週末の天気も微妙なことになってきた。
岡山に向けてニューアイテムを購入。このエアマット。今迄直方体のエアマッ トを使っていたのだけど、どうもボヨンボヨンして嫌なのと、エア入れるのに やたら時間がかかるし、たたむのも面倒。
ということでこれを購入。空気を入れるのは電動ポンプより、付属の足押しポ ンプの方が、きっちり入る。
これはなかなかいいかも。
そしてこれもまた岡山の時しか使わない車載冷蔵庫をひっぱり出してきてチェッ ク。
岡山楽しみだ。

そして週末の天気も微妙なことになってきた。
岡山に向けてニューアイテムを購入。このエアマット。今迄直方体のエアマッ トを使っていたのだけど、どうもボヨンボヨンして嫌なのと、エア入れるのに やたら時間がかかるし、たたむのも面倒。
ということでこれを購入。空気を入れるのは電動ポンプより、付属の足押しポ ンプの方が、きっちり入る。
これはなかなかいいかも。
そしてこれもまた岡山の時しか使わない車載冷蔵庫をひっぱり出してきてチェッ ク。
岡山楽しみだ。

SH4A続き。キャッシュに入ります。SH7785はI-cache,D-cacheともに、32KB、ラ インサイズ32B,の4ウェイセットアソシアティブだ。 なので32*1024(サイズ)/32(ライン)/4(ウェイ) = 256エントリ(8bit) エントリ(8bit)+ライン(3bit)+ワード以下(2bit)=13bit MMUで4Kページを使うと1bitだけ、エントリの選択にMMUの変換が入ってしま う...。8ウェイだったら、4Kページで実質物理キャッシュで神!だったのに。 ちょっと残念です。それとも今このCPUが使われてるアプリケーションでは 64KBページ以上が主流だったりするのだろうか? キャッシュのマニュアルにはSuperHywayバスからのPURGE,FLUSHトランザクショ ンが物理アドレスなので、これを使うにはシノニムを回避するために1KBのペー ジサイズを使用するなとあるけれど、4KBもシノニムあるし...。???
今日もCR85整備。ちょっと滲みがあるのでウォーターポンプのシールを交換。
ついでにベアリングも。シャフトもちょっと微妙な感じなので交換。
レース前にここは交換したくないのだけど(アタリがつくまで結構フリクション ロスが大きい)。

昨日からチャンバーの中にセーフティクリーンを原液で入れておいたのを捨て て柄つきタワシでカーボン落とし。この程度じゃあまりカーボンは落ちない気 はするけれど...。
大方、整備終了。暖機チェックもOK。フロントブレーキのパッドピンを交換し たいのだけど、手持ちが切れていたので、部品待ち。

これはこの前(090924)の一本目。配線を間違えてラップしかとれなかったもの。 後半がノイズは二本目で電池切れしてしまったことから、電池不足かな。

25.8-31.5-12.0で1'09.26。7フラで25.1-30.4-11.5くらい。全体的に遅くて如 何ともし難いな。うーん。

ロガーの方もなんとかコンパレータ経由でラップがとれるところまで確認。机 の上で動いたくらいじゃ、まったく動くかどうかわからないのが辛い。ノイズ +振動の攻撃に加えて、サーキットまで行かないと実際のテストができないの が...。
レース前にここは交換したくないのだけど(アタリがつくまで結構フリクション ロスが大きい)。

昨日からチャンバーの中にセーフティクリーンを原液で入れておいたのを捨て て柄つきタワシでカーボン落とし。この程度じゃあまりカーボンは落ちない気 はするけれど...。
大方、整備終了。暖機チェックもOK。フロントブレーキのパッドピンを交換し たいのだけど、手持ちが切れていたので、部品待ち。

これはこの前(090924)の一本目。配線を間違えてラップしかとれなかったもの。 後半がノイズは二本目で電池切れしてしまったことから、電池不足かな。

25.8-31.5-12.0で1'09.26。7フラで25.1-30.4-11.5くらい。全体的に遅くて如 何ともし難いな。うーん。

ロガーの方もなんとかコンパレータ経由でラップがとれるところまで確認。机 の上で動いたくらいじゃ、まったく動くかどうかわからないのが辛い。ノイズ +振動の攻撃に加えて、サーキットまで行かないと実際のテストができないの が...。
今日はタイヤ交換から。一気に2セット新品に。まずはタイヤを外してマジック
リンでジャブジャブ洗い。これが一番綺麗になる。
この2セットで、残り3戦をやる予定。

MJ165じゃもう辛いかなと思ったけど、いいじゃない。

しかしピストンは終了。これは二本目、一周目から全開にしてやっちゃったか な。シリンダ側についたアルミを#400で削り落としました。問題ないレベル。

ゆっくり整備中。

この2セットで、残り3戦をやる予定。

MJ165じゃもう辛いかなと思ったけど、いいじゃない。

しかしピストンは終了。これは二本目、一周目から全開にしてやっちゃったか な。シリンダ側についたアルミを#400で削り落としました。問題ないレベル。

ゆっくり整備中。

キャベツが本葉2つ出てきたので、ポット上げしました。14株。

27φの91以降のキャリパーにNSR50のリアブレーキのピストンを入れるとちょっ と飛びでてしまう。ぎりぎりいける範囲なんだけどね。リード90から引っぱっ てきた方がよかったかも...。

久々に「レーシングバトル -C1 GRAND PRIX-」
をひっぱりだしてきた。
これは岡山が収録されてるんだよね。初参戦の時には大いに役立ってくれた。 はじめてのコースインで予選だからね。
毎回、次こそはライセンスとって前日から走りたいと思うのだけど、いざとな るとな…。今回もいつも通り予選ぶっつけです。
ここは一番の苦手の最終の一つ前。ここを4速で突っこめない。素で走ると 3速に落として走ってしまう。


27φの91以降のキャリパーにNSR50のリアブレーキのピストンを入れるとちょっ と飛びでてしまう。ぎりぎりいける範囲なんだけどね。リード90から引っぱっ てきた方がよかったかも...。

久々に「レーシングバトル -C1 GRAND PRIX-」
をひっぱりだしてきた。
これは岡山が収録されてるんだよね。初参戦の時には大いに役立ってくれた。 はじめてのコースインで予選だからね。
毎回、次こそはライセンスとって前日から走りたいと思うのだけど、いざとな るとな…。今回もいつも通り予選ぶっつけです。
ここは一番の苦手の最終の一つ前。ここを4速で突っこめない。素で走ると 3速に落として走ってしまう。

ツクバセラピーに行ってきました。5時半出発だとすっかり暗くなってきた。
夜明け前くらいの出発の方が気合いが入ってよい。永福登ると綺麗な朝焼け。

夜明け近辺の新宿線上りは絶景です。新宿は眺めてよし、呑んだくれてよし。

代々木のドコモビルもいい。

江北Jct.

C2。フェンスに反射する朝日が綺麗だ。

絶好の日和りだったのだけど、いろいろ大失敗。一本目は何度か引っぱっても らえる機会があったのだけど、なんかぜんぜんだめで、9秒も切れなかった。
走行終了後、ロガーデータを見てみると、ラップしかとれてない。あれ?と 思ってロガー分解して配線調べると...P-LAP線にコンパレータ入れたつもりが スピードセンサの線に入ってた...TT。
仕方ないので二本目はコネクタ交換して出走。しかしロガーの電池切れで データ採れず...。さらにはP-LAPの電池もなくなってきてタイムも見れなく なってしまった。
二本目はコースイン直後にS8群団がいたので、一周目からちょっとがんばり(僕 はいつも最初の3周は流し)。しかしどうもタイヤの滑りがひどい。3,4周で1コー ナーでズリズリ、最終でもズリズリになってしまい、怖くなってしまった。
二本目は荒れ場でずっと白旗、黄旗が出ている状況だったので、リアブレーキ の練習。後半になってやっとクリアになったのだけど、やっぱりタイヤがひど いので5分残して終了しました。

やっぱりタイヤ新品にしてくればよかった。でなければピストンのナラシにす ればよかった。まぁそれでも、もつ定食べれればそれでよしかな。


夜明け近辺の新宿線上りは絶景です。新宿は眺めてよし、呑んだくれてよし。

代々木のドコモビルもいい。

江北Jct.

C2。フェンスに反射する朝日が綺麗だ。

絶好の日和りだったのだけど、いろいろ大失敗。一本目は何度か引っぱっても らえる機会があったのだけど、なんかぜんぜんだめで、9秒も切れなかった。
走行終了後、ロガーデータを見てみると、ラップしかとれてない。あれ?と 思ってロガー分解して配線調べると...P-LAP線にコンパレータ入れたつもりが スピードセンサの線に入ってた...TT。
仕方ないので二本目はコネクタ交換して出走。しかしロガーの電池切れで データ採れず...。さらにはP-LAPの電池もなくなってきてタイムも見れなく なってしまった。
二本目はコースイン直後にS8群団がいたので、一周目からちょっとがんばり(僕 はいつも最初の3周は流し)。しかしどうもタイヤの滑りがひどい。3,4周で1コー ナーでズリズリ、最終でもズリズリになってしまい、怖くなってしまった。
二本目は荒れ場でずっと白旗、黄旗が出ている状況だったので、リアブレーキ の練習。後半になってやっとクリアになったのだけど、やっぱりタイヤがひど いので5分残して終了しました。

やっぱりタイヤ新品にしてくればよかった。でなければピストンのナラシにす ればよかった。まぁそれでも、もつ定食べれればそれでよしかな。
8:25 晴 362m 24.2℃ 65.5% 1017.1hPa 3枚67℃ 13巻 12/8 Max 13500rpm best 9.2 10:20 晴 431m 26.0℃ 59.5% 1016.3hPa 12巻

SH4A続き。
スレッドを実装してみよう。まずはカーネルモードのみ、レジスタバンク1のみ、
多重割込みなしの一番単純な実装。コンテキストスイッチするのは割込みのみ
で例外ではスイッチしない。
例外には3種類ある。フォールト、トラップ、アボートだ。フォールトは例外を
起こした命令の前で例外処理することで、その命令を実行させるので、コンテ
キストスイッチしてしてしまったら意味がない。トラップは例外命令を実行し
て例外処理に入るので、コンテキストスイッチしてもいい。アボートはどうに
もならないのでそこで終了だ。
割込みの場合は任意の命令と命令の隙間に入る。これはトラップが例外命令の
後処理をするか、割り込みの後処理をするかの違いくらい。
退避するレジスタはこのように設定した。これは実際の退避ルーチンで、
mov.l Rn, @-Rmで退避しやすいよう(mov.l Rn, @Rm+はできない)に
してみた。
struct reg
{
uint32_t pc; // 0x
uint32_t sr; // 0x
uint32_t pr; // 0x
// caller-saved(gcc) callee-saved(renesas)
uint32_t mach;
uint32_t macl;
// callee-saved
uint32_t sp; // 0x
uint32_t r14; // 0x
uint32_t r13; // 0x
uint32_t r12; // 0x
uint32_t r11; // 0x
uint32_t r10; // 0x
uint32_t r9; // 0x
uint32_t r8; // 0x
// caller-saved
uint32_t r7; // 0x
uint32_t r6; // 0x
uint32_t r5; // 0x
uint32_t r4; // 0x
uint32_t r3; // 0x
uint32_t r2; // 0x
uint32_t r1; // 0x
uint32_t r0; // 0x
} __attribute__((packed));
割り込みハンドラは(VBR+0x600)
.section .vector_interrupt, "ax" // "A"llocate. e"X"ecute.
ここでr15にいきなり退避できるのは、この実装がカーネルモードのみ、バンク
1 のみと設定しているから。そうでなければどこのスタックを使うか吟味しないと
いけない。
mov.l r1, @-r15
ここでcurrent_threadの退避領域にアクセスできるのは、多重割込みを禁止し
ているから。多重割り込みなら、レジスタはスレッド領域ではなく、スタック
に退避/復帰、復帰後のコンテキストスイッチなしにしないといけない。
mov.l .L_current_thread r1
mov.l @r1, r1
add #0x54, r1 // sizeof (struct reg)
P0,P3のMMUでアクセス領域なら、ここでTLBミスが発生する可能性がある。ここ
は例外がブロックされているのでTLBミスが発生すればリセットだ。今回はMMU
を使わないのでOK。
mov.l r0, @-r1
mov r1, r0
mov.l @r15+, r1 // restore R1 and R15
mov.l r1, @-r0
mov.l r2, @-r0
mov.l r3, @-r0
mov.l r4, @-r0
mov.l r5, @-r0
mov.l r6, @-r0
mov.l r7, @-r0
mov.l r8, @-r0
mov.l r9, @-r0
mov.l r10, @-r0
mov.l r11, @-r0
mov.l r12, @-r0
mov.l r13, @-r0
mov.l r14, @-r0
mov.l r15, @-r0
sts.l macl, @-r0
sts.l mach, @-r0
sts.l pr, @-r0
stc.l ssr, @-r0
stc.l spc, @-r0
// All register saved.
多重割り込みなしなので、全部の割り込みをブロックするように設定した
あとに例外を有効に。(この設定の場合、例外はプログラムの間違い以外では
起こらないので、理論的には有効にする必要はない)
// Set IMASK and Clear BL (Disable all interrupt.)
stc sr, r0
mov.l .L_SR_IMASK, r1
or r1, r0
mov.l .L_SR_BL, r1 // r1 = 0x10000000
neg r1, r1 // r1 = 0xf0000000
add #-1, r1 // r1 = 0xefffffff
and r1, r0
ldc r0, sr
ここで個別の割り込みハンドラをディスパッチ。
mov.l .L_exception_interrupt r0
jsr @r0
nop
スレッドのスケジューリング。
mov.l .L_thread_context_switch, r0
jsr @r0
nop
例外をブロックして新しいコンテキストにスイッチ。多重割り込みじゃないので
本来は例外をブロックしなくてよい。(ここに割り込んでくるものはないので)
// Block exception
stc sr, r0
mov.l .L_SR_BL, r1 // r1 = 0x10000000
or r1, r0
ldc r0, sr
// Restore all register.
mov.l .L_current_thread r0
mov.l @r0, r0
ldc.l @r0+, spc
ldc.l @r0+, ssr
lds.l @r0+, pr
lds.l @r0+, mach
lds.l @r0+, macl
mov.l @r0+, r15
mov.l @r0+, r14
mov.l @r0+, r13
mov.l @r0+, r12
mov.l @r0+, r11
mov.l @r0+, r10
mov.l @r0+, r9
mov.l @r0+, r8
mov.l @r0+, r7
mov.l @r0+, r6
mov.l @r0+, r5
mov.l @r0+, r4
mov.l @r0+, r3
mov.l @r0+, r2
mov.l @r0+, r1
rte
mov.l @r0+, r0
.align 2
.L_current_thread:
.long _current_thread
.L_exception_interrupt:
.long _exception_interrupt
.L_SR_IMASK:
.long 0xf0
.L_SR_BL:
.long 0x10000000
.L_thread_context_switch:
.long _thread_context_switch
プログラム側から明示的にコンテキストスイッチするのは、caller-savedは
既にこのdo_thread_switchを呼ぶ前にスタックに退避されているので、それ
以外を退避するだけでいい。コンテキストスイッチはRTE命令でするので、
スイッチした後はPCとSRをSPC,SSRに設定し、これをRTE命令で戻してもらう。
/* void do_thread_switch (void) */
/* Assume already interrupt disabled */
/* Called from thread context */
FUNC (_do_thread_switch)
mov.l .L_current_thread r0
mov.l @r0, r0
add #0x34, r0 // skip caller saved.
// Save callee-saved registers.
mov.l r8, @-r0
mov.l r9, @-r0
mov.l r10, @-r0
mov.l r11, @-r0
mov.l r12, @-r0
mov.l r13, @-r0
mov.l r14, @-r0
mov.l r15, @-r0
sts.l macl, @-r0
sts.l mach, @-r0
sts.l pr, @-r0
stc.l sr, @-r0
sts.l pr, @-r0 // PC
mov.l .L_thread_context_switch r0
jsr @r0
nop
ここでコンテキストスイッチされたものは割り込みでスイッチされたものかも
しれないので、全レジスタを復帰する。ここで例外をブロックする必要も本当
はないのも前述の通り。
// Block exception
stc sr, r0
mov.l .L_SR_BL, r1 // r1 = 0x10000000
or r1, r0
ldc r0, sr
// Restore all register.
mov.l .L_current_thread r0
mov.l @r0, r0
ldc.l @r0+, spc
ldc.l @r0+, ssr
lds.l @r0+, pr
lds.l @r0+, mach
lds.l @r0+, macl
mov.l @r0+, r15
mov.l @r0+, r14
mov.l @r0+, r13
mov.l @r0+, r12
mov.l @r0+, r11
mov.l @r0+, r10
mov.l @r0+, r9
mov.l @r0+, r8
mov.l @r0+, r7
mov.l @r0+, r6
mov.l @r0+, r5
mov.l @r0+, r4
mov.l @r0+, r3
mov.l @r0+, r2
mov.l @r0+, r1
rte
mov.l @r0+, r0
.align 2
.L_current_thread:
.long _current_thread
.L_thread_context_switch:
.long _thread_context_switch
.L_SR_BL:
.long 0x10000000
タイマ割り込みでスレッド切り替えのテスト。
## Starting application at 0xA9000000 ...
RAM data: 0xa9003a7c-0xa9003eec 1136byte
bss: 0xa9003eec-0xa900510c 4640byte
ohayo
Privilege-mode, bank 1, Exception disabled, FPU enabled, IMASK=0xf
md_thread_setup: [1] a90048c0-a90044c0 {a9004444}
INTC: fffffffe 1f000000
md_thread_setup: [2] a9004444-a9004044 {a9003fc8}
md_thread_create: [2]:test pc=a900023c sp=a9004444 stack=1024byte
thread_start: [2]
thread_priority: [1] pri 1->3 state = 0 (DOWN)
thread_context_switch: {a9004444}: sp=a9004874
thread_context_switch: switch 1->2: sp=a9004444 pc=a900023c
test_thread:1234abcd
hello 0
thread_context_switch: {a9003fc8}: sp=a9004410
thread_context_switch: switch 2->1: sp=a9004874 pc=a9001a44
mon> timer
mon> a900018c b0
tmu0_intr
thread_context_switch: {a9004444}: sp=a9004884
thread_context_switch: 1 preempted by 2
thread_context_switch: switch 1->2: sp=a9004410 pc=a9001caa
hello 1
thread_context_switch: {a9003fc8}: sp=a9004410
thread_context_switch: switch 2->1: sp=a9004884 pc=a9000900
a900018c b0
tmu0_intr
thread_context_switch: {a9004444}: sp=a9004884
thread_context_switch: 1 preempted by 2
thread_context_switch: switch 1->2: sp=a9004410 pc=a9001caa
hello 2
今日はヨトウムシの被害なし。実の成ってないトマトを処分。実がついてるの
も、もう、どうかなと思うのだけど、これは観察に残しておきます。
SH4A続き。割り込みを見てみます。まずはタイマ割り込みを出してみました。
SH7785のタイマは6チャネル。このくらいあると便利だ。32bitのダウンカウン
タ。アンダーフローで割り込み。インプットキャプチャ機能がチャネル2につい
ているだけ。タイマカウンタはは外部入力じゃない場合はカウンタの更新は
PCLKの分周のみ。
割り込みコントローラでは、割り込み要因のマスク、優先度の設定をしない
と割り込みがあがらない。
内部割り込みのマスクの指定はINT2MSKRとINT2MSKCR。それぞれのレジスタの対
応するビットに1を書くことで、マスク/アンマスクを設定する。(0書いても無
効)
#define INT2MSKR ((volatile uint32_t *)0xffd40038)
*INT2MSKR = 1; // mask TMU0-2
#define INT2MSKCR ((volatile uint32_t *)0xffd4003c)
*INT2MSKCR = 1; // unmask TMU0-2
そして、CPUのIMASKにあたる優先度を設定する。IMASKは4bitに対してこの指定
は5bit。下位1bitはINTCの中での優先度に使われる。CPUのIMASKとして使われ
るのは上位4bitになる。優先度は値が小さい程低い。
#define INT2PRI0 ((volatile uint32_t *)0xffd40000)
*INT2PRI0 = 0x1f000000;// TMU0 highest priority.
iprintf ("INTC: %x %x\n", *INT2MSKR, *INT2PRI0);
割り込みハンドラを設定。
// Install default interrupt handler.(place holder)
exception_init ();
// Install TMU0 interrupt handler.
TMU0の割り込みのINTEVCは0x580。INTEVCは0x20ごとの設定で、0x1c0-0xfe0の範囲
なので、8で割った値をインデックスとして配列にしました。
intr_table[0x580 >> 3] = tmu0_intr;
例外を有効に。
exception_enable ();
割り込みを有効に。
intr_enable ();
4段階(INTC mask, INTC priority, SR.IMASK, SR.BL)で割り込みの制御がある。
タイマの設定は
*TSTR0 &= ~1; // Stop TMU0
*TCNT0 = 0xffff;
*TCOR0 = 0xffff;
*TCR0 = 4 | (1 << |="" &="">
菜園状況。ネギはちょっとづつ収穫してます。これは大成功。

大根はついに残り3本に...昨日の夜、懐中電灯でてらしながら探したのだけ ど。。ほじくり返してヨトウムシを殺害。全滅も考えてまた種を蒔いておきま した。

キャベツはこんなところ。ポットあげまであともうちょっと。

ニンジンは放置で、まぁそこそこ。

ロガーは、P-LAPからの信号にコンパレータをかますことにしました。DROの時 と同じくLM339で。スレッショルドの電圧は試しにLPC2388のDAC(D/A converter)からの接続にしてみました。これならスレッショルド電圧をプログ ラム側から制御できる...と思ったのだけど、LPC2388のポートは5Vトレランス だけれど、DACのVREFは3.3Vまで。そもそもInterface 2009/5付録基板はVREFが Vcc直結だ。P-LAPは5V。ちょっと微妙なことになってしまった。

とりあえず、この回路を入れて動作を確認まで。これもH8,H8/Tiny,ARM,SH4Aと 手を拡げ過ぎ。SH4AはちょっとマイOSの設計に迷っている。カーネルモードと ユーザモードがあって、さらにMMUが乗るとなると、実装の自由度が大きい。
マイOSは基本的にはMMUなしのCPU向けだ。H8/3664のROM32KB,RAM2KBで使えるこ とを最低条件としている。
マイOSではカーネルモードではBANK1だけを使ってBANK0はユーザに。そして、 カーネルモードではTLBミスさせない(P3を使わない)。この方針ならTLBミスの 例外はBANK0からBANK1の切り替えだけになるのでレジスタバンクが活かせるは ずだ。

連休、いろいろやろうと思っていたのだけど、どうも気分がすぐれなくて何も できなかった。たぶん筑波欠乏症だ。とはいえ、ここでうっかりテンション上 げてしまうと、レース前に「あと15周走れば、終わりだ...」という状態になり かねないので(残念ながらそんなにレースが好きじゃない)、テンション上げる のはレース直前からだ。その翌周は岡山だしね。

大根はついに残り3本に...昨日の夜、懐中電灯でてらしながら探したのだけ ど。。ほじくり返してヨトウムシを殺害。全滅も考えてまた種を蒔いておきま した。

キャベツはこんなところ。ポットあげまであともうちょっと。

ニンジンは放置で、まぁそこそこ。

ロガーは、P-LAPからの信号にコンパレータをかますことにしました。DROの時 と同じくLM339で。スレッショルドの電圧は試しにLPC2388のDAC(D/A converter)からの接続にしてみました。これならスレッショルド電圧をプログ ラム側から制御できる...と思ったのだけど、LPC2388のポートは5Vトレランス だけれど、DACのVREFは3.3Vまで。そもそもInterface 2009/5付録基板はVREFが Vcc直結だ。P-LAPは5V。ちょっと微妙なことになってしまった。

とりあえず、この回路を入れて動作を確認まで。これもH8,H8/Tiny,ARM,SH4Aと 手を拡げ過ぎ。SH4AはちょっとマイOSの設計に迷っている。カーネルモードと ユーザモードがあって、さらにMMUが乗るとなると、実装の自由度が大きい。
マイOSは基本的にはMMUなしのCPU向けだ。H8/3664のROM32KB,RAM2KBで使えるこ とを最低条件としている。
マイOSではカーネルモードではBANK1だけを使ってBANK0はユーザに。そして、 カーネルモードではTLBミスさせない(P3を使わない)。この方針ならTLBミスの 例外はBANK0からBANK1の切り替えだけになるのでレジスタバンクが活かせるは ずだ。

連休、いろいろやろうと思っていたのだけど、どうも気分がすぐれなくて何も できなかった。たぶん筑波欠乏症だ。とはいえ、ここでうっかりテンション上 げてしまうと、レース前に「あと15周走れば、終わりだ...」という状態になり かねないので(残念ながらそんなにレースが好きじゃない)、テンション上げる のはレース直前からだ。その翌周は岡山だしね。
ゆっくりとガレージの掃除。掃除機のホースを交換したり、水漏れするホース
リールを修理したりとペンディング事項の処理に。まだまだいっぱいある。
今日もまた大根が一本やられてしまった。残り4本しかない。危機を感じてやら れた大根のまわりをスコップで掘り起こしてみたところ、ヨトウムシ見つけた。 一回でもやられたらなんとかして探して殺さないとだめだ。
ヤフオクで落としたキャリパーはマジックリンでゴシゴシ洗った後にガラスビー ズでサンドブラスト。

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

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

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

今日もまた大根が一本やられてしまった。残り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)が標
準なのだけど、これがよくできていて、最初にベクタテーブルを設定しておけ
ば該当割り込みのベクタをレジスタに設定してくれる。これによって割り込み
入ってからはそのレジスタの値にジャンプすればいいだけなのだ。
RS125のE/G積んで(結局RS125にした)、CR85の整備。プラグキャップの摩耗の原
因を探るべく、E/G降ろしました。リアマウントが痩せてしまっている。とはい
え、ここが痩せていても左右から押さえてるし、そう問題はないんじゃないか
とも思うのだけど。左右の押さえは力がE/Gにかかるようになっている。以前、
カラーが長すぎてカラーの上でE/Gが踊ってしまうという失敗もあった。今は
十分に押さえ代がある。

とりあえずカラー作成。YH75(A7075相当品)の丸棒から。これは80mm以上の穴開 けになるのでなかなか手間がかかる。どうがんばってもちょっと偏心してしま う。手頃なガンドリルでも探すかな。切子の排出が大変。

半日かかって完成。プラハンで叩いてちょうどくらいのいいところにできた。

これまたヤフオクで落とした90フレームが到着。これはステアリングレースは 使える。マウントブッシュは、ちょっとくたびれか。フレームごと落として部 品とり戦略です。

岡山からメールが来ていた。携帯を見たら昨日から電話が来ていた。携帯は使っ てないのよ。折り返し電話してみると、エントリー締切過ぎてのエントリーな ので5000円と嘆願書の提出が必要とのこと。わざわざすいません。エントリー をお願いしました。
さんざ迷ってて遅れてしまったのだ。体力的に不安だけど、やっぱり年に一度は 岡山走りたいだろー。ということで。行きますよ! 久々にドライで走りたいところ。

とりあえずカラー作成。YH75(A7075相当品)の丸棒から。これは80mm以上の穴開 けになるのでなかなか手間がかかる。どうがんばってもちょっと偏心してしま う。手頃なガンドリルでも探すかな。切子の排出が大変。

半日かかって完成。プラハンで叩いてちょうどくらいのいいところにできた。

これまたヤフオクで落とした90フレームが到着。これはステアリングレースは 使える。マウントブッシュは、ちょっとくたびれか。フレームごと落として部 品とり戦略です。

岡山からメールが来ていた。携帯を見たら昨日から電話が来ていた。携帯は使っ てないのよ。折り返し電話してみると、エントリー締切過ぎてのエントリーな ので5000円と嘆願書の提出が必要とのこと。わざわざすいません。エントリー をお願いしました。
さんざ迷ってて遅れてしまったのだ。体力的に不安だけど、やっぱり年に一度は 岡山走りたいだろー。ということで。行きますよ! 久々にドライで走りたいところ。
SH4A続き。例外をハンドリングします。例外ハンドラはリセットベクタを除き、
VBRの設定でどこにでも設定できる。いろいろ方法はあるけれど、これはすべて
リンカにまかせて
OUTPUT_FORMAT("elf32-shl")
OUTPUT_ARCH(sh)
MEMORY
{
ram : o = 0xa9000000, l = 0x10000
vector_generic : o = 0xa9010100, l = 0x300
vector_tlbmiss : o = 0xa9010400, l = 0x200
vector_interrupt : o = 0xa9010600, l = 0x1000
}
SECTIONS
{
_stack_start = 0xa9010000;
_VBR = 0xa9010000;
.vector_generic :
{
*(.vector_generic)
} > vector_generic
.vector_tlbmiss :
{
*(.vector_tlbmiss)
} > vector_tlbmiss
.vector_interrupt :
{
*(.vector_interrupt)
} > vector_interrupt
.text :
{
*(.text)
*(.rodata*)
. = ALIGN (4);
} > ram
.data :
{
*(.data)
. = ALIGN (4);
} > ram
.bss :
{
_bss_start = . ;
*(.bss)
} > ram
_bss_end = .;
}
とした。対応するソースは、
#include <asm/asm.h>
.section .vector_generic, "ax" // "A"llocate. e"X"ecute.
// Use interrupted bank stack pointer.
stc spc, r4 // Bank1
stc ssr, r5 // Bank1
stc sgr, r6 // Bank1
mov.l r8, @-r15
mov.l r9, @-r15
mov.l r10, @-r15
mov.l r11, @-r15
mov.l r12, @-r15
mov.l r13, @-r15
mov.l .L_exception_generic r2
jsr @r2
mov.l r14, @-r15
mov.l @r15+, r14
mov.l @r15+, r13
mov.l @r15+, r12
mov.l @r15+, r11
mov.l @r15+, r10
mov.l @r15+, r9
rte
mov.l @r15+, r8
.align 2
.L_exception_generic:
.long _exception_generic
.sectionで、"a"を指定することが重要。勝手に定義したセクション名はこれが
ないとロードされない。このルーチンはバンク0から入ることを想定して、
caller-savedは退避していない。スタックの退避、復帰用のためにプレデクリ
メントストア、ポストインクリメントロードを用意してあるのがいい。ARM
だと、さらに
stmia r0!, {r0-r15}
ldmia r0, {r0-r15}
のように一命令にできてしまうけれど、個人的にはSHくらいがいい落し所だと
思う。MIPSは投げやり過ぎ。
void
exception_generic (uint32_t spc, uint32_t ssr, uint32_t sgr)
{
uint32_t r;
CPU_GET_SR (r);
cpu_dump_sr (r);
iprintf ("EXTEVT=%x, SPC=%x SSR=%x SGR=%x\n", *EXPEVT, spc, ssr, sgr);
ここで例外の起きた命令を飛ばして次にリターンするように設定。これはテス
トだから。
// Skip this instruction.
__asm volatile ("ldc %0, spc" :: "r"(spc + 2));
}
エントリーのルーチンも変更、VBRをldscpritで設定されたところに設定します。
ついでにレジスタバンクも0からスタート。
.align 2
.section .text
.globl start
start:
1: mov.l .L_led, r0
mov #0x4, r1
mov.l r1, @r0
// Set VBR
mov.l .L_VBR, r0
ldc r0, vbr
// Change BANK0
stc sr, r1
mov.l .L_SR_RB0, r0
and r0, r1
ldc r1, sr
// Jump to C routine.
mov.l .L_startup, r0
// Set stack
mov.l .L_stack_start, r15
jmp @r0
nop
/* NOTREACHED */
.align 2
.L_led:
.long 0xa4000008
.L_startup:
.long _startup
.L_stack_start:
.long _stack_start
.L_VBR:
.long _VBR
.L_SR_RB0:
.long 0xdfffffff
いろいろ例外を意図的に発生させてテスト。
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 ("mov r15, r0;add #1, r0;mov.l @r0, r1");// 0xe0
データアドレスエラー(書き込み)
__asm volatile ("mov r15, r0;add #1, r0;mov.l r1, @r0"); //0x100
printf ("skip instruction\n");
return 0;
}
uint32_t
test (int32_t argc __attribute__((unused)),
const char *argv[] __attribute__((unused)))
{
uint32_t r;
CPU_GET_SR (r);
cpu_dump_sr (r);
return 0;
}
U-Boot 2008.10-rc2-00002-g87b4ef5-dirty (Sep 18 2008 - 15:01:39)
CPU: SH4
BOARD: Renesas Technology Corp. R0P7785LC0011RL
DRAM: 128MB
FLASH: 64MB
*** Warning - bad CRC, using default environment
PCI: SH7780 PCI host bridge found.
PCI: Bus Dev VenId DevId Class Int
00 00 10ec 8169 0200 00
00 01 1095 3512 0180 00
In: serial
Out: serial
Err: serial
Net: RTL8169#0
=> bootp
BOOTP broadcast 1
Using RTL8169#0 device
TFTP from server 192.168.33.2; our IP address is 192.168.33.12
Filename 'sh7785.img'.
Load address: 0x9000000
Loading: #####
done
Bytes transferred = 65836 (1012c hex)
=> go 0xa9000000
## Starting application at 0xA9000000 ...
ohayo
Privilege-mode, bank 0, Exception disabled, FPU enabled, IMASK=0xf
mon> test
Privilege-mode, bank 0, Exception enabled, FPU enabled, IMASK=0xf
mon> exception
Privilege-mode, bank 1, Exception disabled, FPU enabled, IMASK=0xf
EXTEVT=100, SPC=a900009c SSR=400000f1 SGR=a900ffb4
skip instruction
mon> test
Privilege-mode, bank 0, Exception enabled, FPU enabled, IMASK=0xf
mon> exception
Privilege-mode, bank 1, Exception disabled, FPU enabled, IMASK=0xf
EXTEVT=100, SPC=a900009c SSR=400000f1 SGR=a900ffb4
skip instruction
mon> test
Privilege-mode, bank 0, Exception enabled, FPU enabled, IMASK=0xf
mon>
FPU disabledは試せなかった。というのもprintfで割り算を使う。通常divsi3
あたりがあればいいのだけれど、SHではudivsi3_i4iという今迄会ったことのな
いものが呼ばれる。ここでFPUのレジスタを使っているのでFPU disabledでは
printfが動かなかった。
SH2モードにすればいいだろうと、libgcc,newlib共にm2を指定すると今度
は___udivsi3_i4iがundefined reference。うーん...。SH4AであえてFPUを無効
にして動すことはないだろうし、まぁいいか。
また一本、大根が食べられてしまった。ここまで大きくなったのに。直蒔きは
ちょっと多めにしておかないと。全滅の危険。

枯れはじめたトマトを裏にもっていくと、びっくりする量の芽が。なんだ!と思っ て見てみると、これチンゲンサイだ。自家採種して、蒔いてはみたものの芽が 出ないから、適当に捨てたのから突然一気に芽が出た。なんでだ。

プラグキャップは30720-KV3-771にしてみることに。これはキャップが鉄なので いいかなと。これは88NSR250Rの後バンクの型番だけれど、このパッケージから して今も継続で使われてるくさい。本当はフロントバンクの60度くらいに曲がっ たやつが欲しかったのだけど(納まりがいいので)、そっちはゴソウダンになっ ていた。いいのないかな。

CR85も整備。いいとこだ。MJ165で筑波じゃもうそろそろきついかと思ったけれ ど、いいとこか。ピストンもまったく問題なし。

RS125の方は89フレームから取り出したブッシュを取りつけ。さてこれにRS125 を乗せるか、予備E/GのCR85を乗せるか。あまりブッシュに負担かけたくないか らCR85の方がいいかとも思いつつ、もうちょっとRS125に乗りたい気も。

ヤフオクで落とした93のFキャリパー。これオコして使う予定。RS125にはパ フォーマンスの対向4ポッドのキャリパーがついているのだけど、CR85と同じ仕 様にしたい。Tカーとしても。

SH4A続き。例外処理について、日立の歴史を見よう。ここ一年H8を使ってみて なんでSHがこうなのかがわかった。H8からの流れがあるんだね。SH-1の頃はコ アだけRISCのH8のようなスタイルだったのが、徐々に進化してきた。

枯れはじめたトマトを裏にもっていくと、びっくりする量の芽が。なんだ!と思っ て見てみると、これチンゲンサイだ。自家採種して、蒔いてはみたものの芽が 出ないから、適当に捨てたのから突然一気に芽が出た。なんでだ。

プラグキャップは30720-KV3-771にしてみることに。これはキャップが鉄なので いいかなと。これは88NSR250Rの後バンクの型番だけれど、このパッケージから して今も継続で使われてるくさい。本当はフロントバンクの60度くらいに曲がっ たやつが欲しかったのだけど(納まりがいいので)、そっちはゴソウダンになっ ていた。いいのないかな。

CR85も整備。いいとこだ。MJ165で筑波じゃもうそろそろきついかと思ったけれ ど、いいとこか。ピストンもまったく問題なし。

RS125の方は89フレームから取り出したブッシュを取りつけ。さてこれにRS125 を乗せるか、予備E/GのCR85を乗せるか。あまりブッシュに負担かけたくないか らCR85の方がいいかとも思いつつ、もうちょっとRS125に乗りたい気も。

ヤフオクで落とした93のFキャリパー。これオコして使う予定。RS125にはパ フォーマンスの対向4ポッドのキャリパーがついているのだけど、CR85と同じ仕 様にしたい。Tカーとしても。

SH4A続き。例外処理について、日立の歴史を見よう。ここ一年H8を使ってみて なんでSHがこうなのかがわかった。H8からの流れがあるんだね。SH-1の頃はコ アだけRISCのH8のようなスタイルだったのが、徐々に進化してきた。
例外について。 SH3以降ではSRのBLビットで例外/割り込みをブロックできる。IMASKビットでは 3bitの割込みマスクで割り込みをレベルでマスクできる。例外は現実にはブロッ クできない(CPUの実行によって生じるものだから)ので、BLビットでブロックさ れている時に例外が発生するとリセットベクタにとぶことになる。 SH1,SH2では割り込み処理がH8に似た形式のベクタ型だった。BLビットはなく、 割り込みに入る時にCPUがSRのIMASKを、受けつける割りこみのマスクに設定し、 PCとSRはスタックに積み、ベクタテーブルを参照して処理を開始した。 SH1,SH2まではMMUがなかったのでスタックでも問題なかった。SH3からはMMUが 塔載されたので、スタックに積もうとしたらTLBミスのの状況を回避するため、 PCとSRはスタックではなく、専用のSPCとSSRレジスタに退避される。SH4以降は さらにR15がSGRレジスタに退避される。そしてSH3から割り込みと同時に切り替 わるレジスタバンクが導入された。 SH3以降はSRのIMASKの設定をCPUはやらなくなったので、ユーザがIMASKを設定 することになる。その設定までがBLビットによるブロックになる。 SH4AはCPUOPM.INTMUビットの設定によって、自動的にSR.IMASKの設定をするこ ともできるようになった。 ベクタ型じゃなくなりINTEVT,EXPEVTレジスタからユーザが分岐する。SH3の一 部(7709とか)はINTEVT とINTEVT2。INTEVTには優先順位が入った。これはきめ こまかい制御をしたい時用に設定したのか? SH4Aからは内蔵モジュールの割り 込みは30レベル設定可能になった。
ネギはそろそろ収穫の時期。小さいのから収穫して食べてます。まめに土寄せ
した甲斐あって、30cm以上ある。こんなネギが一年かかって収穫するものとは
思ってなかったよ。

そしてすぐに納豆に入れて食べます。これが僕の至福の朝食。納豆と、とろろ 昆布汁。納豆食べないとどうもエンジンかからないんだよね。

SH4A続き。ちょっとブチ切れました。基板のマニュアルで、コンソールは TXD2,RXD2を接続と書いてあったのに、実際はSCIF1接続だった。さんざ確認し て、「こんなところで、この俺がつまづくなんて...」と絶望の淵に彷っていた。 しかたない。とu-boot/include/configs/sh7785lcr.hを見たところ、

そしてすぐに納豆に入れて食べます。これが僕の至福の朝食。納豆と、とろろ 昆布汁。納豆食べないとどうもエンジンかからないんだよね。

SH4A続き。ちょっとブチ切れました。基板のマニュアルで、コンソールは TXD2,RXD2を接続と書いてあったのに、実際はSCIF1接続だった。さんざ確認し て、「こんなところで、この俺がつまづくなんて...」と絶望の淵に彷っていた。 しかたない。とu-boot/include/configs/sh7785lcr.hを見たところ、
#define CONFIG_CONS_SCIF1 1SCIF1にレジスタを変更すればOKだった。精神的によくないね。
デバッグシリアルはSCIF1を使用し、このクロックは内部のPCLKからではなく、
外部から1.8432MHzを供給している。115200*16 = 1843200
#include <system.h>
#include <delay.h>
#include <console.h>
#include <console_machdep.h>
// for interrupt context or no threading support.
void null_putc (int8_t);
int8_t null_getc (void);
void isci_putc (int8_t);
int8_t isci_getc (void);
// SCIF1 P4 address
#define SCSMR ((volatile uint16_t *)0xffeb0000)
#define SCBRR ((volatile uint8_t *) 0xffeb0004)
#define SCSCR ((volatile uint16_t *)0xffeb0008)
#define SCFTDR ((volatile uint8_t *) 0xffeb000c)
#define SCFSR ((volatile uint16_t *)0xffeb0010)
#define SCFRDR ((volatile uint8_t *) 0xffeb0014)
#define SCFCR ((volatile uint16_t *)0xffeb0018)
void
boot_console_init (bool on)
{
if (!on)
{
// Install place holder
console_putc_install (SERIAL, DIRECT, null_putc);
console_putc_install (SERIAL, BUFFERED, null_putc);
console_getc_install (SERIAL, DIRECT, null_getc);
console_getc_install (SERIAL, BUFFERED, null_getc);
return;
}
*SCSCR = 0x2; /*CKE1 external clock */
//ここで外部クロックを指定する。
*SCSCR |= (1 << 5)/*TE*/ | (1 << 4)/*RE*/;
// 送信,受信ともに有効に。
*SCSMR = 1/*CKS0*/;
*SCBRR = 0;
// 調歩同期115200bpsの場合SCBRRに設定する値Nは
//
// N =(Pck * 10^6) / (8 * 2 ^(2*n - 1) * bps) -1になる。
// この場合Pckは外部の1.8432MHz、bpsは115200なので
// N = 16 / (8 * 2^(2*n - 1)) - 1
// N(SCBRR)を0に設定するとして、
// 1 = 2/ 2^(2*n - 1)
// なのでnは1 → CKS1=0, CKS0=1
*SCFCR = 0; // FIFO、RTS/CTSの設定。まずはFIFOなしの設定。
console_putc_install (SERIAL, DIRECT, isci_putc);
console_putc_install (SERIAL, BUFFERED, isci_putc);
console_getc_install (SERIAL, DIRECT, isci_getc);
console_getc_install (SERIAL, BUFFERED, isci_getc);
}
// place holder for non console.
void
null_putc (int8_t c __attribute__((unused)))
{
}
int8_t
null_getc ()
{
return 0;
}
// Simple polling routines.
void
isci_putc (int8_t c)
{
if (c == '\n')
md_uart_putc1 ('\r');
md_uart_putc1 (c);
}
int8_t
isci_getc ()
{
uint8_t c;
while (((c = *SCFSR) & 0x2/*RDF*/) == 0)
;
c = *SCFRDR;
*SCFSR &= ~0x2/*RDF*/;
return c;
}
void
md_uart_putc1 (int8_t c)
{
while ((*SCFSR & (1 << 5)/*TDFE*/) == 0)
;
*SCFTDR = c;
*SCFSR &= ~((1 << 5)/*TDFE*/ | (1 << 6)/*TEND*/);
while ((*SCFSR & (1 << 6)/*TEND*/) == 0)
;
}
ここまで用意すれば
void
startup ()
{
// int8_t isci_getc (void);
boot_console_init (TRUE);
iprintf ("ohayo\n");
led (dip_switch ());
// 単純なエコーバックのテスト
// while (1)
// iputc (isci_getc (), SERIAL);
shell_init ();
shell_set_device (SERIAL, SERIAL, TRUE);
shell_prompt ();
// NOTREACHED
}
簡単なコマンドランチャーまで。
U-Boot 2008.10-rc2-00002-g87b4ef5-dirty (Sep 18 2008 - 15:01:39)
CPU: SH4
BOARD: Renesas Technology Corp. R0P7785LC0011RL
DRAM: 128MB
FLASH: 64MB
*** Warning - bad CRC, using default environment
PCI: SH7780 PCI host bridge found.
PCI: Bus Dev VenId DevId Class Int
00 00 10ec 8169 0200 00
00 01 1095 3512 0180 00
In: serial
Out: serial
Err: serial
Net: RTL8169#0
=> bootp
BOOTP broadcast 1
Using RTL8169#0 device
TFTP from server 192.168.33.2; our IP address is 192.168.33.12
Filename 'sh7785.img'.
Load address: 0x9000000
Loading: #
done
Bytes transferred = 7616 (1dc0 hex)
=> go 0xa9000000
## Starting application at 0xA9000000 ...
ohayo
mon>
mon> help
avaliable command: help reset
mon>
SH4A続き。Cのプログラムを呼ぶためにスタックを設定します。_stack_startは
リンカスクリプトで指定。
.align 2
.section .text
.globl start
start:
1: mov.l .L_led, r0
mov #0x4, r1
mov.l r1, @r0
mov.l .L_startup, r0
mov.l .L_stack_start, r15
jmp @r0
nop
/* NOTREACHED */
.align 2
.L_led:
.long 0xa4000008
.L_startup:
.long _startup
.L_stack_start:
.long _stack_start
ユーザ開放のディップスイッチを読みとって、そこからLEDを点灯します。
#include <types.h>
#include <system.h>
//R0P7786LC0011RL PLD internal LED register.
#define LEDCR ((volatile uint8_t *)0xa4000008)
//R0P7786LC0011RL PLD internal switch register.
#define SWSR ((volatile uint8_t *)0xa400000a)
uint8_t dip_switch (void);
void led (uint8_t);
void
startup ()
{
while (/*CONSTCOND*/1)
{
led (dip_switch ());
}
// NOTREACHED
}
uint8_t
dip_switch ()
{
return *SWSR;
}
void
led (uint8_t sw)
{
int i;
for (i = 1; i < 16; i <<= 1)
{
uint8_t r = i | i << 4;
if (sw & i)
*LEDCR |= r;
else
*LEDCR &= ~r;
}
}
ちょっとはまりました。スタック(R15)を設定してCの関数にジャンプする部分
mov.l .L_startup, r0 mov.l .L_stack_start, r15 jmp @r0 nopここを最初
mov.l .L_startup, r0 jmp @r0 mov.l .L_stack_start, r15と分岐遅延スロットに入れていて失敗。分岐遅延スロットにはPC相対MOV命令は 入れれないのだ。こんなブートの一回だけしか通らないところで遅延スロット を使ったところでなんの意味もないのだけど、ついついスロットがあると入れ たくなってしまい。
SD/MMCカードを実装にあたって一番最初、H8/3052でテストしていた。その時の
ブレッドボードが未だにそのままなので、まとめておきました。回路は
74VHC125でH8側の5Vと、SD/MMCカード側の3.3Vを変換するだけ。一応SD/MMCの
仕様に従ってプルアップ。

H8開発機の中に押しこめました。ストレージがつくとちょっとうれしい。

SHについて。まずはコンパイラと呼出し規約を確認。gccとルネサスでMACレジ スタの扱いに違いがある。

H8開発機の中に押しこめました。ストレージがつくとちょっとうれしい。

SHについて。まずはコンパイラと呼出し規約を確認。gccとルネサスでMACレジ スタの扱いに違いがある。
sh-elf-gcc -Q --help=target -c sh-elf-gcc --target-help gcc-4.3.2/gcc/config/sh/sh.hあたりから様子を探ります。
リーディングアンダースコア
引数は4つまでレジスタ渡し、それ以降はスタックに積む。
R0-R1 関数の返り値 (caller saved)
R2-R3 スクラッチ (caller saved)
R4-R7 関数の引数 (caller saved)
R8-R13 callee saved.
R14 フレームポインタ (callee saved)
R15 スタックポインタ (callee saved)
FPU1 caller saved
FR0-FR3 関数の返り値
FR4-FR11 関数の引数
FR12-FR15 callee saved
gcc-4.3.2/gcc/config/sh/sh.hより。
/* Register allocation for the Renesas calling convention:
r0 arg return
r1..r3 scratch
r4..r7 args in
r8..r13 call saved
r14 frame pointer/call saved
r15 stack pointer
ap arg pointer (doesn't really exist, always eliminated)
pr subroutine return address
t t bit
mach multiply/accumulate result, high part
macl multiply/accumulate result, low part.
fpul fp/int communication register
rap return address pointer register
fr0 fp arg return
fr1..fr3 scratch floating point registers
fr4..fr11 fp args in
fr12..fr15 call saved floating point registers */
----------------------------------------------------------------------
-mrenesas Comply with the calling conventions defined by Renesas.
Renesas saves and restores mac registers on call.
The multiply instructions and multiply/accumulate instructions store
results in the MAC register.
-mnomacsave Mark the "MAC" register as call-clobbered, even if
-mhitachi is given.
MACレジスタをcallee-savedにするかcaller-savedにするか。gccデフォルトだと
caller-saved(call-clobbered)。-mrenesas(-mhitachi)にするとcallee-saved.
/* sh-elf-gcc -O -S -fomit-frame-pointer a.c */
int
a (int a0, int a1, int a2, int a3)
{
return a0 + a1 + a2 - a3;
}
int
c (int a0, int a1, int a2, int a3, int a4)
{
return a0 + a1 + a2 - a3 + a4;
}
int
b ()
{
a (0, 1, 2, 3);
return c (0, 1, 2, 3, 4);
}
int
main ()
{
return a (0xaa55, 4, 3, 2);
}
.file "a.c"
.text
.text
.align 1
.global _a
.type _a, @function
_a:
mov r5,r0
add r4,r0
add r6,r0
rts
sub r7,r0
.size _a, .-_a
.align 1
.global _c
.type _c, @function
_c:
mov r5,r0
add r4,r0
add r6,r0
mov.l @r15,r1
add r1,r0
rts
sub r7,r0
.size _c, .-_c
.align 1
.global _b
.type _b, @function
_b:
sts.l pr,@-r15
add #-4,r15
mov #4,r1
mov.l r1,@r15
mov #0,r4
mov #1,r5
mov #2,r6
mov.l .L7,r0
jsr @r0
mov #3,r7
add #4,r15
lds.l @r15+,pr
rts
nop
.L8:
.align 2
.L7:
.long _c
.size _b, .-_b
.align 1
.global _main
.type _main, @function
_main:
sts.l pr,@-r15
mov.l .L11,r4
mov #4,r5
mov #3,r6
mov.l .L12,r0
jsr @r0
mov #2,r7
lds.l @r15+,pr
rts
nop
.L13:
.align 2
.L11:
.long 43605
.L12:
.long _a
.size _main, .-_main
.ident "GCC: (GNU) 4.3.2"
スイカを収穫。まだあと一個ある。スイカは難しかった。実が成ったのは1/5程
度。それもうまくいってこの大きさ。

キャベツに挑戦します。苗床はサカタのスーパーミックスA。やはり自家製の腐 葉土より発芽が安定してる感じ。

これは大根。間引きした後で、一本虫にやられた...。寒冷紗かけててもやられ るときはやられてしまう。虫を探したのだけど、みつからなかった。ヨトウム シか?

ストロベリーリナックスの7セグメントLED表示キットを動かしました。これは 3.3V駆動なのでちょっと暗い。これだけ桁数があれば、ラップと経過時間と、 ラップタイムを同時表示できる。と目論んでいます。
配線はGNDとVccとTXDだけで済むのでとても楽。LPC2388はUARTが4chもあるので 配線には困らない。これでLCDならなぁ。


キャベツに挑戦します。苗床はサカタのスーパーミックスA。やはり自家製の腐 葉土より発芽が安定してる感じ。

これは大根。間引きした後で、一本虫にやられた...。寒冷紗かけててもやられ るときはやられてしまう。虫を探したのだけど、みつからなかった。ヨトウム シか?

ストロベリーリナックスの7セグメントLED表示キットを動かしました。これは 3.3V駆動なのでちょっと暗い。これだけ桁数があれば、ラップと経過時間と、 ラップタイムを同時表示できる。と目論んでいます。
配線はGNDとVccとTXDだけで済むのでとても楽。LPC2388はUARTが4chもあるので 配線には困らない。これでLCDならなぁ。

凄いの借りてきました。SH7785のルネサス純正評価基板。CQのSH3の評価キット
は買ったことがあったけれど、ガチの評価基板は初めてだ。
コンソールはCP2102のシリアル-USB変換。これは、ロガーで使っている LPC2388基板と同じだ。
そしてロムにはブートローダとしてu-bootが乗っている。書き替えも可能だけ れど、それにはJTAG(H-UDI)が必要。今はこういう時代なのね。
u-bootは、イーサネットからbootp/tftp,NFS、USBメモリからのロードとガッチ リ作ってあって至れり尽せり。

まずはオンボードのLEDを点灯してみました。
コンソールはCP2102のシリアル-USB変換。これは、ロガーで使っている LPC2388基板と同じだ。
そしてロムにはブートローダとしてu-bootが乗っている。書き替えも可能だけ れど、それにはJTAG(H-UDI)が必要。今はこういう時代なのね。
u-bootは、イーサネットからbootp/tftp,NFS、USBメモリからのロードとガッチ リ作ってあって至れり尽せり。

まずはオンボードのLEDを点灯してみました。
[DHCPDの設定]dhcpd.conf
allow bootp;
allow booting;
host athena {
hardware ethernet 00:00:87:6b:bd:6b;
fixed-address 192.168.33.12;
option host-name "athena";
next-server 192.168.33.2; /* tftpサーバは別なのでそこを設定*/
filename "sh7785.img"; /* tftpdのルートからの相対パスで設定する */
}
[TFTPDの設定]inetd.conf
tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot
/tftpboot/sh7785.imgにはメモリにロードされるイメージそのものを置く。
[テストプログラム]
ユーザ開放LEDの三つめを点灯します。
.align 2
.section .text
.globl start
start:
1: mov.l .L_led, r0
mov #0x4, r1
mov.l r1, @r0
bra 1b
nop
.align 2
.L_led:
.long 0xa4000008
//
/* NOTREACHED */
[リンカスクリプト]
デフォルトで0x09000000にロードされるので、アンキャシュドで0xa9000000で
動くように設定。
OUTPUT_FORMAT("elf32-shl")
OUTPUT_ARCH(sh)
MEMORY
{
ram : o = 0xa9000000, l = 0x1000
}
SECTIONS
{
_stack_start = 0xa9001000;
.text :
{
*(.text)
*(.rodata*)
. = ALIGN (4);
} > ram
.data :
{
*(.data)
. = ALIGN (4);
} > ram
.bss :
{
_bss_start = . ;
*(.bss)
} > ram
_bss_end = .;
}
[コンパイル]
/usr/home/uch/os/w/tools/bin/sh-elf-gcc -ml -m4a -Wall -Werror -Wp,-MD,.deps/entry.P -c -o entry.o entry.S
/usr/home/uch/os/w/tools/bin/sh-elf-ld -T ../../ldscripts/test.ram -o test.elf entry.o
/usr/home/uch/os/w/tools/bin/sh-elf-objdump -x test.elf
test.elf: ?????? elf32-shl
test.elf
???????: sh, ??? 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
?????? 0xa9000000
????????:
LOAD off 0x00000080 vaddr 0xa9000000 paddr 0xa9000000 align 2**7
filesz 0x00000010 memsz 0x00000010 flags r-x
?????:
??? ??? VMA LMA File off Algn
0 .text 00000010 a9000000 a9000000 00000080 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
SYMBOL TABLE:
a9000000 l d .text 00000000 .text
a9000010 g .text 00000000 _bss_start
a9000010 g *ABS* 00000000 _bss_end
a9001000 g *ABS* 00000000 _stack_start
a9000000 g .text 00000000 start
/usr/home/uch/os/w/tools/bin/sh-elf-objdump -D test.elf
test.elf: ?????? elf32-shl
????? .text ???????:
a9000000 :
a9000000: 02 d0 mov.l a900000c ,r0 ! a4000008
a9000002: 04 e1 mov #4,r1
a9000004: 12 20 mov.l r1,@r0
a9000006: fb af bra a9000000
a9000008: 09 00 nop
a900000a: 09 00 nop
a900000c: 08 00 clrt
a900000e: 00 a4 bra a9000812 <_bss_end+0x802>
/usr/home/uch/os/w/tools/bin/sh-elf-objcopy -I elf32-shl -O binary test.elf test.bin
cp test.bin /tftpboot/sh7785.img
[ターゲットで実行]
U-Boot 2008.10-rc2-00002-g87b4ef5-dirty (Sep 18 2008 - 15:01:39)
CPU: SH4
BOARD: Renesas Technology Corp. R0P7785LC0011RL
DRAM: 128MB
FLASH: 64MB
*** Warning - bad CRC, using default environment
PCI: SH7780 PCI host bridge found.
PCI: Bus Dev VenId DevId Class Int
00 00 10ec 8169 0200 00
00 01 1095 3512 0180 00
In: serial
Out: serial
Err: serial
Net: RTL8169#0
=> bootp
BOOTP broadcast 1
Using RTL8169#0 device
TFTP from server 192.168.33.2; our IP address is 192.168.33.12
Filename 'sh7785.img'.
Load address: 0x9000000
Loading: #
done
Bytes transferred = 16 (10 hex)
=> md 0xa9000000 ちゃんとイメージが場所にあるかどうか確認。
a9000000: e104d002 affb2012 00090009 a4000008 ..... ..........
a9000010: 00000000 00000000 00000000 00000000 ................
a9000020: 00000000 00000000 00000000 00000000 ................
a9000030: 00000000 00000000 00000000 00000000 ................
a9000040: 00000000 00000000 00000000 00000000 ................
a9000050: 00000000 00000000 00000000 00000000 ................
a9000060: 00000000 00000000 00000000 00000000 ................
a9000070: 00000000 00000000 00000000 00000000 ................
a9000080: 00000000 00000000 00000000 00000000 ................
a9000090: 00000000 00000000 00000000 00000000 ................
a90000a0: 00000000 00000000 00000000 00000000 ................
a90000b0: 00000000 00000000 00000000 00000000 ................
a90000c0: 00000000 00000000 00000000 00000000 ................
a90000d0: 00000000 00000000 00000000 00000000 ................
a90000e0: 00000000 00000000 00000000 00000000 ................
a90000f0: 00000000 00000000 00000000 00000000 ................
=> go 0xa9000000
## Starting application at 0xA9000000 ...
ここでLEDが点灯して成功。
のんびりRS125とCR85の整備。RS125はE/G降ろしてフロントマウントを調べてみ
ると、左側が終わっていた。このマウントブッシュはもう出ない。05の時はま
だ出たのだけど、あの時に買いしめておけばよかった。
とりあえず素材用の89フレームからマウントブッシュを取りだして、錆び錆び なので、サンドブラストした。問題はゴムの劣化具合...。
H8/3052の開発機、以前外部拡張RAMがおかしくなって放置されていたのをを直 した。これはAREA4とAREA5に128KBのSRAMをつけていたのだけど、調べたところ AREA5のSRAMが壊れていた。今迄128KBも使い切ってないので、AREA4だけにプロ グラムを変更。
もうH8を使う機会があるかどうか微妙だけど...。周辺デバイスがLPC2388の方 が使いやすくて。32bitの方が楽だしね。CPU的にはH8はとても好みなのだけど。

とりあえず素材用の89フレームからマウントブッシュを取りだして、錆び錆び なので、サンドブラストした。問題はゴムの劣化具合...。
H8/3052の開発機、以前外部拡張RAMがおかしくなって放置されていたのをを直 した。これはAREA4とAREA5に128KBのSRAMをつけていたのだけど、調べたところ AREA5のSRAMが壊れていた。今迄128KBも使い切ってないので、AREA4だけにプロ グラムを変更。
もうH8を使う機会があるかどうか微妙だけど...。周辺デバイスがLPC2388の方 が使いやすくて。32bitの方が楽だしね。CPU的にはH8はとても好みなのだけど。

昨日は新宿に降りたった。ディスクユニオンに入ると、解散したはずの
MEGADETHの新作が。あまり期待せずに購入、あとついでに棚に並んでた
SLAYERの古いのを。そのまま馴染の店に。早速MEGADETHをかけてもらう。
...20秒くらいすると、どうなるかわからない感じに緊張。40秒後にはむせび泣 いた。そこから先は脳汁がでそうだ。曲は今迄の年月の積み重ねがあるけれど、 求めるMEGADETHのスラッシュがここにある。20年待ったぞ。RUST IN PEACE以降 の最高傑作だ。
そして、特典がなんと「メガデス箸」イカしてる!!これ、マイ箸にしよう。
店ではその後、例によってのんだくれ。粗相をしてしまう。反省中。

そして、SLAYERなのだけど...これ持ってた。ダブリ買いしてしまった...。そ の割に曲はまったく覚えてなく。僕はSLAYER はあまり趣味じゃなくて、あまり 持ってないし聞いてないんだよね。

ストロベリーリナックスに注文した7セグメントLED表示キット(2800円)が届い た。これは9600bps8N1でキャラクタを送るとそのまま表示という、お気楽ユニッ ト。LEDで走行中に視認できるかどうか不安なところがあるけれど。

オフコーポレーションに先行予約注文していた、OneidaのDust Deputyが届いた。 12700円。この値段なら...と買ってしまった。

...20秒くらいすると、どうなるかわからない感じに緊張。40秒後にはむせび泣 いた。そこから先は脳汁がでそうだ。曲は今迄の年月の積み重ねがあるけれど、 求めるMEGADETHのスラッシュがここにある。20年待ったぞ。RUST IN PEACE以降 の最高傑作だ。
そして、特典がなんと「メガデス箸」イカしてる!!これ、マイ箸にしよう。
店ではその後、例によってのんだくれ。粗相をしてしまう。反省中。

そして、SLAYERなのだけど...これ持ってた。ダブリ買いしてしまった...。そ の割に曲はまったく覚えてなく。僕はSLAYER はあまり趣味じゃなくて、あまり 持ってないし聞いてないんだよね。

ストロベリーリナックスに注文した7セグメントLED表示キット(2800円)が届い た。これは9600bps8N1でキャラクタを送るとそのまま表示という、お気楽ユニッ ト。LEDで走行中に視認できるかどうか不安なところがあるけれど。

オフコーポレーションに先行予約注文していた、OneidaのDust Deputyが届いた。 12700円。この値段なら...と買ってしまった。

筑波行ってきました。富士が終わった時から次の筑波が初まっているのだ!なん
て気合いではなく、このS枠を逃がすと次は9月の終わりまでないから。という
若干消極的な理由。まだ疲れとれてないし。月曜からずっと下痢だし。いい加減
直ったかな?と思いきや、筑波についてからトイレの往復。ツナギにチビったら
リカバリできるのか? と、ちょっと不安になりながらコースイン。
コース入ってすぐにシフトがおかしいのに気付いた。これは...。そのままピットインして、リアのE/Gマウントを締めた。
1コーナー、2ヘアではリアブレーキを使えるようになってきた。筑波は直立の ブレーキじゃないので、加減が難しい。すぐリヤがうねってしまう。
1ヘア前はまだまだ無理。まずはブレーキまで踏もうとせず、毎周ステップの踏 み替えだけはするようにしてみた。
タイムは8.7まで。

恐る恐るロガーデータを表示してみると...。多少ノイズは乗ってるけれどこれ なら手で除けるレベル。ちょっと安心。しかしそのデータは確かに8秒のデータ だ。全部のコーナーで3km/h増しで走れ。アクセル閉じるな。トップスピードは ソロならこんなとこ。

そしてプラグキャップを外してみると、大量の真鍮の粉。これはもう二本目は だめかな。と思いつつ、最後のあがきにアルミホイルでプラグを覆ってみた。 (用意してた)

二本目は途中からS8軍団の後を追うことができてタイムアップ。前走車との距 離だけで走るとタイムが出るんだよね。本当はそうじゃなく、マシンとの対話 でベストを尽くす方向にいきたいのだけど...。実際は闇雲に走ってるだけだ。
最終ラップ、抜かれて、ふんぬ〜とがんばってベストラップ。7.9まで。
やっぱり二本目はノイズがひどい。後半ボロボロ。ロガー本体のノイズ対策も 必要だけれど、マシン本体もおかしい。後半、振動で左手が痺れた。一度E/G 降ろして調べないとだめだな。

タイヤがささくれだってしまった。そろそろウォーマーかけた方がよかったか な。これは、筑波3戦の特走1本、3戦の予選決勝、ナラシ一本、富士一本、 MCFAJ3戦予選決勝、今日の二本。あと3本は余裕で持つと思ってたのに。

真鍮粉がひどい。CR85純正プラグキャップと相性が悪いのかな。

これはS1後半。典型的な8秒パターン。

これはS2後半。ちょっと強引なノイズ処理で一部おかしい。ホームストレッチ161km/h、1ヘア前147km/h、ダンロップ120km/h、2ヘア前144km/hまで持っていってるのはいい。が、1コーナー76km/hは遅い。2ヘアも68km/hじゃ。ベストは74km/hだよ。最終もがんばって130km/hでは。もう一息。135km/hで。

これは参照に筑波選手権3戦決勝データ。このデータと較べるに今のE/Gはいい な。

マイジョッキを買ってみました。今迄、「缶ビールはそのまま飲むのが粋って もんだろ〜」とか言っていたのだけど、これを冷凍室でキンキンに冷やしてビー ルを注ぐとやっぱりいいな。しかしこれの問題はすぐ飲み干してしまうことだ。

コース入ってすぐにシフトがおかしいのに気付いた。これは...。そのままピットインして、リアのE/Gマウントを締めた。
1コーナー、2ヘアではリアブレーキを使えるようになってきた。筑波は直立の ブレーキじゃないので、加減が難しい。すぐリヤがうねってしまう。
1ヘア前はまだまだ無理。まずはブレーキまで踏もうとせず、毎周ステップの踏 み替えだけはするようにしてみた。
タイムは8.7まで。

恐る恐るロガーデータを表示してみると...。多少ノイズは乗ってるけれどこれ なら手で除けるレベル。ちょっと安心。しかしそのデータは確かに8秒のデータ だ。全部のコーナーで3km/h増しで走れ。アクセル閉じるな。トップスピードは ソロならこんなとこ。

そしてプラグキャップを外してみると、大量の真鍮の粉。これはもう二本目は だめかな。と思いつつ、最後のあがきにアルミホイルでプラグを覆ってみた。 (用意してた)

二本目は途中からS8軍団の後を追うことができてタイムアップ。前走車との距 離だけで走るとタイムが出るんだよね。本当はそうじゃなく、マシンとの対話 でベストを尽くす方向にいきたいのだけど...。実際は闇雲に走ってるだけだ。
最終ラップ、抜かれて、ふんぬ〜とがんばってベストラップ。7.9まで。
やっぱり二本目はノイズがひどい。後半ボロボロ。ロガー本体のノイズ対策も 必要だけれど、マシン本体もおかしい。後半、振動で左手が痺れた。一度E/G 降ろして調べないとだめだな。

タイヤがささくれだってしまった。そろそろウォーマーかけた方がよかったか な。これは、筑波3戦の特走1本、3戦の予選決勝、ナラシ一本、富士一本、 MCFAJ3戦予選決勝、今日の二本。あと3本は余裕で持つと思ってたのに。

真鍮粉がひどい。CR85純正プラグキャップと相性が悪いのかな。

これはS1後半。典型的な8秒パターン。

これはS2後半。ちょっと強引なノイズ処理で一部おかしい。ホームストレッチ161km/h、1ヘア前147km/h、ダンロップ120km/h、2ヘア前144km/hまで持っていってるのはいい。が、1コーナー76km/hは遅い。2ヘアも68km/hじゃ。ベストは74km/hだよ。最終もがんばって130km/hでは。もう一息。135km/hで。

これは参照に筑波選手権3戦決勝データ。このデータと較べるに今のE/Gはいい な。

マイジョッキを買ってみました。今迄、「缶ビールはそのまま飲むのが粋って もんだろ〜」とか言っていたのだけど、これを冷凍室でキンキンに冷やしてビー ルを注ぐとやっぱりいいな。しかしこれの問題はすぐ飲み干してしまうことだ。

8:25 曇 561m 25.3℃ 57.3% 1001.3hPa PWK33:MJ165 SJ42 JN R1175J2/5 2.5枚 65-67℃ 12巻 残スト 7/8 Max 13500rpm best 8.7 10:25 曇 627m 27.0℃ 55.9% 1001.2hPa PWK33:MJ165 SJ42 JN R1175J1/5 12巻 残スト 11/9 Max 13500rpm best 7.9 開けにくいかも。J/N濃い目でSJ絞りたい気もするけれどSJ42より下げる? 6:21.483 12.381 10.375 9.780 9.770 9.680 9.286 9.608 9.692 9.279 8.951 8.861 9.133 9.181 8.706 8.833 28.916 23.948 10.066 9.865 9.388 9.955 10.171 9.811 9.448 9.678 10.048 9.026 8.195 8.282 8.071 8.806 8.134 8.076 8.501 8.270 7.942 24.498アクセルオフの減速に頼ってる部分をなんとかしてみたい。もっとブレーキか けてみるか...。
ガレージでE/Gかけてノイズの入りをテストしてみたところ、7000rpmくらいま
ではないのだけど、吹け切りまで廻すと一気に入る。12000rpmで200Hz、割り込
み間隔で5msec。しかし1msecに4,5回入る。試しにプラグキャップを新品に交換
してみて、一度吹けきり廻してみると良さげ。騒音の関係で、そうテストする
わけにもいかず、今日はここまで。

空きのディップスイッチが二つあるので、それぞれP-LAPの割り込みをとらない のと、P-LAP線をプルアップするかしないかに割りあてておいた。できればもう P-LAP 本体は外してこのロガーから全て駆動したいところなのだけど、ノイズ 問題が。 久々に本棚から
ロードレース・ライディング—“走る・止まる・曲がる”をシンキングする キース コード
なんて引き出してきた。(これまた随分とプレミアついてるのね)。この藁をも すがる気持ちが懐しい。この本は、オレオレライディング理論をまくしたてる という本ではなく、遅いライダーへのヒント集のような本。色褪せた蛍光ペン の跡がハートウォーミング。

空きのディップスイッチが二つあるので、それぞれP-LAPの割り込みをとらない のと、P-LAP線をプルアップするかしないかに割りあてておいた。できればもう P-LAP 本体は外してこのロガーから全て駆動したいところなのだけど、ノイズ 問題が。 久々に本棚から
ロードレース・ライディング—“走る・止まる・曲がる”をシンキングする キース コード
なんて引き出してきた。(これまた随分とプレミアついてるのね)。この藁をも すがる気持ちが懐しい。この本は、オレオレライディング理論をまくしたてる という本ではなく、遅いライダーへのヒント集のような本。色褪せた蛍光ペン の跡がハートウォーミング。
マシンチェック。総じて問題なし。そういえばリアブレーキは昨日のレースで
も自然に使えるようになってきた。といっても1コーナーとダンロップ前だけ。
コーナーリングと絡み合うようなところはまだ無理。筑波はまだ難しいだろう
な。



やっぱりピストンは30分かけてナラシした方が安牌かな。あたりなら10周程度 でも問題ないのだけど。だめな時はだめな気がする。今回はじっくり30分ナラ シしたもの。

青点がSDカードへのアクセス、赤がP-LAPの割り込み、緑がスピードメータ。 SDカードのアクセスからのノイズはなくなった。アクセルオフの部分でP-LAPの ノイズがまったくなくなっているところから、プラグだ。どうしたものかな。




やっぱりピストンは30分かけてナラシした方が安牌かな。あたりなら10周程度 でも問題ないのだけど。だめな時はだめな気がする。今回はじっくり30分ナラ シしたもの。

青点がSDカードへのアクセス、赤がP-LAPの割り込み、緑がスピードメータ。 SDカードのアクセスからのノイズはなくなった。アクセルオフの部分でP-LAPの ノイズがまったくなくなっているところから、プラグだ。どうしたものかな。

MCFAJ3戦富士でした。結果は5位。タイムは2'13.087となんとかベストタイムま
で出た程度。あんだけ練習して、練習してなかった頃のタイムを出すのがやっ
とか...。
レースはクラッチミートに失敗して継ぎ直しの失敗。しかしそう沈まずに済ん だ。今回は序盤結構、絡めて楽しかった。スリップ大会が楽しかった。しかし だ。僕のスリップから出るマシンはピューと前に出ていくのに、自分がスリッ プから出ると、失速してしまって前に出れず、仕方なくまたスリップに戻るこ とになる...。ちょっと悔しかった。
後半、ダンロップ切り返し後でフロントが滑り、プリウスでフロントが滑り、 ちょっと怖くなってヘロヘロになってしまいました。

1コーナー、120mくらい。4速落として2速。ギヤはちょうど。3,4,5で1速落とし て4速でコカコーラ。50mまで待ってからカットインした方が走りやすい。ここ は半クラ。調子いいときそのまま。もっと早いうちから開けないといけないの だけど...アクセルオフが長すぎる。100Rは5速、2速落として3速でヘアピン。 多少ロング。ここも開けるのが遅く、とても離される。でも300Rはインインで 行くと追いつく感じ。ダンロップは信号ブリッジの下。4速落として2速でダン ロップ。3速に上げてそのまま13コーナー、吹け切りまでそのままでネッツで2 速。3速に上げて最終は2速。これがカンカンで困っていたのだけど、どうも僕 は大回りし過ぎのようだ。コントロールラインで5速13000rpm。さらに13200く らいまでひっぱってピットビルAの終わりくらいで6速。11000rpmのまま、下り に入って11800まで行くか行かないか。
ヘアピン、だらだらと突っこんでるかも。もっと倒し込みで曲げたい。最終、 3速でスピード乗せていくラインにするか(これは無理かも)、2速に合わせたラ インにしないとだめかな。
17:35にして最終を3速確定にするのも面白いかも。

そういえば、本コース、S80なら125以下でも走ってよかったらしい。俺の苦労 は一体...。あのRS125を走らせるいい機会ではあった。

富士はレース時でもトランポでパドックに入れるのがいい。とはいえパドックが 広大なので押して行く距離は結構ある。

絶好のレース日和でした。今年の富士はもうこれで終わりなのが残念だ。

ロガーデータはまた大失敗。P-LAP線にノイズが入りまくり。おまけに表示ユニットのトグルスイッチにもノイズが 入って、勝手にログファイルがインクリメントされていた。
煽りを受けてスピードセンサもだめ。なんと1msecに4回も割り込みが入る状態 もあり、ログファイルは1.5MBにも。これじゃまったく解析できない。

取りつけた時から、点火系の線とロガーの線が入り乱れているのはどうだ...??? とは思っていたのだけど、もうちょっと疲れてて対処できなかった。

レースはクラッチミートに失敗して継ぎ直しの失敗。しかしそう沈まずに済ん だ。今回は序盤結構、絡めて楽しかった。スリップ大会が楽しかった。しかし だ。僕のスリップから出るマシンはピューと前に出ていくのに、自分がスリッ プから出ると、失速してしまって前に出れず、仕方なくまたスリップに戻るこ とになる...。ちょっと悔しかった。
後半、ダンロップ切り返し後でフロントが滑り、プリウスでフロントが滑り、 ちょっと怖くなってヘロヘロになってしまいました。

1コーナー、120mくらい。4速落として2速。ギヤはちょうど。3,4,5で1速落とし て4速でコカコーラ。50mまで待ってからカットインした方が走りやすい。ここ は半クラ。調子いいときそのまま。もっと早いうちから開けないといけないの だけど...アクセルオフが長すぎる。100Rは5速、2速落として3速でヘアピン。 多少ロング。ここも開けるのが遅く、とても離される。でも300Rはインインで 行くと追いつく感じ。ダンロップは信号ブリッジの下。4速落として2速でダン ロップ。3速に上げてそのまま13コーナー、吹け切りまでそのままでネッツで2 速。3速に上げて最終は2速。これがカンカンで困っていたのだけど、どうも僕 は大回りし過ぎのようだ。コントロールラインで5速13000rpm。さらに13200く らいまでひっぱってピットビルAの終わりくらいで6速。11000rpmのまま、下り に入って11800まで行くか行かないか。
ヘアピン、だらだらと突っこんでるかも。もっと倒し込みで曲げたい。最終、 3速でスピード乗せていくラインにするか(これは無理かも)、2速に合わせたラ インにしないとだめかな。
17:35にして最終を3速確定にするのも面白いかも。

そういえば、本コース、S80なら125以下でも走ってよかったらしい。俺の苦労 は一体...。あのRS125を走らせるいい機会ではあった。

富士はレース時でもトランポでパドックに入れるのがいい。とはいえパドックが 広大なので押して行く距離は結構ある。

絶好のレース日和でした。今年の富士はもうこれで終わりなのが残念だ。

ロガーデータはまた大失敗。P-LAP線にノイズが入りまくり。おまけに表示ユニットのトグルスイッチにもノイズが 入って、勝手にログファイルがインクリメントされていた。
煽りを受けてスピードセンサもだめ。なんと1msecに4回も割り込みが入る状態 もあり、ログファイルは1.5MBにも。これじゃまったく解析できない。

取りつけた時から、点火系の線とロガーの線が入り乱れているのはどうだ...??? とは思っていたのだけど、もうちょっと疲れてて対処できなかった。

9/5 12:40 晴 1273m 27.3℃ 61.6% 941.8hPa RS125 16:35 14:40 晴 1309m 28.1℃ 58.2% 941.2hPa CR85 2.5枚 66℃ 3枚 69℃ 17:34 9/6 MCFAJ3戦 CR85 MJ168 SJ42 Final 17:34 9:00 晴 1294m 28.0℃ 54.6% 951.6hPa 3枚 68℃ 2.7l→1.2l 1.9/1.9 12巻き 残16/15 best 2'15.497 予選6位 12:40 晴 1342m 29.1℃ 48.8% 940.3hPa MJ168からMJ165に。 2枚 68℃ best 2'13.087 11巻き 残13/9 5位
富士に前日練習に行ってきました。ロガーデータはとれなかった。というのも
コースイン直前に電源を入れたら入らなくなっていた。朝の段階では大丈夫だっ
たのに。
どうも暖機してレーシングしている時に断線した。
走行途中からP-LAP自体も異様にノイズを拾うようになった。走行後、見てみた らアース端子が折れていた...。
前々から水温計の針の値がおかしいとは思っていた。異様に低すぎる値を出し ていて信用せずに昔のデータで走っていたのだけど、今日、水温計も完全にい かれた。そろそろ年貢の納め時かな。

この三端子レギュレータの足にクラックが入った。なんとかハンダで補修した けれど、もつかどうか。これもレギュレータの足を曲げただけでぷらぷらして たのが原因。

SDカードの端子も外れた。もうこれは一から作り直した方がいいな。

久々にCR85に乗ってみると、びっくりする程乗りやすい。同じNFフレーム、ジ オメトリも同じにしてあるのに全然違う。エンジンが10kg軽くなっているので バランスは違うのだけど。E/Gも下からトルクがあって走りやすい。パワーバン ド広いし。
どうも暖機してレーシングしている時に断線した。
走行途中からP-LAP自体も異様にノイズを拾うようになった。走行後、見てみた らアース端子が折れていた...。
前々から水温計の針の値がおかしいとは思っていた。異様に低すぎる値を出し ていて信用せずに昔のデータで走っていたのだけど、今日、水温計も完全にい かれた。そろそろ年貢の納め時かな。

この三端子レギュレータの足にクラックが入った。なんとかハンダで補修した けれど、もつかどうか。これもレギュレータの足を曲げただけでぷらぷらして たのが原因。

SDカードの端子も外れた。もうこれは一から作り直した方がいいな。

久々にCR85に乗ってみると、びっくりする程乗りやすい。同じNFフレーム、ジ オメトリも同じにしてあるのに全然違う。エンジンが10kg軽くなっているので バランスは違うのだけど。E/Gも下からトルクがあって走りやすい。パワーバン ド広いし。
ブレーキをじゃぶじゃぶマジックリンで洗って、フォークオイルを交換して
(WAKO'S #10 油面100mm。突き出し7mm)、整備終了。
フォークオイルを抜いた後、灯油入れて洗って、フォークオイルで共洗いして からオイルを入れた。アルミ粉がひどく。寿命なんだよね。

土曜はMCFAJ走行枠(れはレース以外でCR85でコースを走れる数少ないチャンス なのだけど、30分8000円と高い!)を走れるのも久々だ。2年振りかも。ここずっ と富士の前日は筑波選手権だったからね。
FISCO枠もRS125持っていって走ろうかな。
フォークオイルを抜いた後、灯油入れて洗って、フォークオイルで共洗いして からオイルを入れた。アルミ粉がひどく。寿命なんだよね。

土曜はMCFAJ走行枠(れはレース以外でCR85でコースを走れる数少ないチャンス なのだけど、30分8000円と高い!)を走れるのも久々だ。2年振りかも。ここずっ と富士の前日は筑波選手権だったからね。
FISCO枠もRS125持っていって走ろうかな。
サンハヤトのSDカード変換基板にはコネクタにヒロセ(HRS)とアルプス(ALPS)の
二種類がある。カード検出(INS#)、ライトプロテクト(WP)の配線はこれらで違
いがある。
スピードセンサーとラップセンサーの配線を変更した。P0_15にスピードセンサー を。P0_8にラップセンサーにした。これはテスト基板。本番基板にはさらにパスコンを入れておいた。

ラップ表示もなんとかOK。今回、P-LAPからの分岐配線にもLPC2388からプルアッ プしてみた。走ってみないことにはわからないけれど。

秋葉原に買い出しに行ったついでに秋月でステッピングモーターを買ってきた。

ALPS HRS 12 WP 12 Common(GND) 11 Common(GND) 11 WP 10 INS# 10 INS#だ。WP→A19(P0_21), INS#→B19(P0_18)につないだ。それぞれGPIOとしてプルアップしておけばいい。
スピードセンサーとラップセンサーの配線を変更した。P0_15にスピードセンサー を。P0_8にラップセンサーにした。これはテスト基板。本番基板にはさらにパスコンを入れておいた。

ラップ表示もなんとかOK。今回、P-LAPからの分岐配線にもLPC2388からプルアッ プしてみた。走ってみないことにはわからないけれど。

秋葉原に買い出しに行ったついでに秋月でステッピングモーターを買ってきた。

筑波4戦エントリーしました。
ロガー続き。RTCを実装して、経過時間を表示できるようにした。これは富士に は必要ないのだけど。富士はコントロールブリッジに経過時間が表示されてい るので。あれは便利だ。
ディップスイッチでラップタイム、経過時間の表示の切り替え、1点、3点計測 の切り替えをできるようにした。
ロガーを入れた写真の3L4、これは3点計測、ラップタイム表示、ログ番号4。大 きい表示の8桁くらいのLCDで、できればI2C接続のとかあるといいのだけど。
今週末のMCFAJ3戦富士までに仕上げないと。

ロガー続き。RTCを実装して、経過時間を表示できるようにした。これは富士に は必要ないのだけど。富士はコントロールブリッジに経過時間が表示されてい るので。あれは便利だ。
ディップスイッチでラップタイム、経過時間の表示の切り替え、1点、3点計測 の切り替えをできるようにした。
ロガーを入れた写真の3L4、これは3点計測、ラップタイム表示、ログ番号4。大 きい表示の8桁くらいのLCDで、できればI2C接続のとかあるといいのだけど。
今週末のMCFAJ3戦富士までに仕上げないと。

typedef void (irq_handler_t)(void);
irq_handler_t __rtc_intr;
// Application override interrupt handler.
irq_handler_t rtc_intr_counter_incr __attribute__ ((weak, alias ("__rtc_intr")));
irq_handler_t rtc_intr_alarm __attribute__ ((weak, alias ("__rtc_intr")));
irq_handler_t rtc_intr_subsecond __attribute__ ((weak, alias ("__rtc_intr")));
RTCは3つの割り込みを出せる。ymdhmsで指定したアラームと、ymdhmsのカウン
タの増分時、ソースクロックの16,32,64,128,256,512,1024,2048カウント毎だ。
ソースクロックは外部接続の発振子と内部のPCLKどっちかを選べる。PCLKの場
合はプリスケーラの設定ができる。
それぞれのハンドラはアプリケーションで実装。実装がない場合は__rtc_intr
が埋め草として使われる。
enum rtc_state
{
RTC_OFF,
RTC_ON,
RTC_START,
};
enum rtc_state __rtc_state;
STATIC void rtc_reset ();
STATIC void rtc_alarm_clear (void);
void
rtc_init ()
{
struct rtc_ymdhms date;
// Power on (On reset, the RTC is enabled.)
RTCはデフォルトで電源が入っている。
mcu_peripheral_power (PCONP_PCRTC, TRUE);
// Reset all.
RTCは本体電源のON/OFFでレジスタがリセットされないので確実にリセット。
Interface2009/5付録基板の場合、VBATはVccに直結なのでなくてもいい。
rtc_reset ();
__rtc_state = RTC_ON;
// RTC source clock.
Interface2009/5付録基板に32.768kHzの外部発振子をつけている。
*RTC_CCR |= CCR_CLKSRC; // 32.768kHz external oscillator.
// If use PCLK, set RTC_PREINT and RTC_PREFRAC.
内部クロック(PCLK)を使うならRTC_PREINTとRTC_PREFRACを設定してプリスケーラを
設定しないといけない。
RTCを全部ゼロ。これはこの基板だから。
memset (&date, 0, sizeof date);
rtc_time_set (&date);
}
void
rtc_fini ()
{
rtc_stop ();
rtc_reset ();
// Power off.
mcu_peripheral_power (PCONP_PCRTC, FALSE);
__rtc_state = RTC_OFF;
}
void
rtc_reset ()
{
*RTC_CCR = 0; // クロックストップ。
*RTC_AMR = AMR_MASK; // Alarm Mask. アラームの割り込みオフ。
*RTC_CIIR = 0; // Counter Increment Interrupt. カウンター割り込みオフ
*RTC_CISS = 0; // Subsecond interrupt. サブセカンド割り込みオフ
*RTC_ILR = ILR_RTCCIF | ILR_RTCALF | ILR_RTSSF; // Interrupt Location
前に残っていた割り込みをクリア
// Clear alarm
rtc_alarm_clear ();
}
void
rtc_start ()
{
assert (__rtc_state == RTC_ON);
// Start RTC clock
割り込みの有効化はこれだけ。3つそれぞれのイネーブルは
アラームはRTC_AMR, カウンターはRTC_CIIR、サブセカンドはRTC_CISS。
*RTC_CCR |= CCR_CLKEN;
__rtc_state = RTC_START;
// Interrupt Enable.
*VICIntSelect |= VIC_RTC; // FIQ
FIQなのでこのOSではこの割り込みでコンテキストスイッチなし。
*VICIntEnable |= VIC_RTC;
}
void
rtc_stop ()
{
// Interrupt Disable
*VICIntEnable &= ~VIC_RTC;
// Stop RTC clock.
*RTC_CCR &= ~CCR_CLKEN;
// Clear pending interrupt.
*RTC_ILR = ILR_RTCCIF | ILR_RTCALF | ILR_RTSSF;
__rtc_state = RTC_ON;
}
bool
rtc_time_set (struct rtc_ymdhms *date)
{
*RTC_SEC = date->sec;
*RTC_MIN = date->min;
*RTC_HOUR = date->hour;
*RTC_DOM = date->day;
*RTC_DOW = date->wday;
*RTC_DOY = 0; //XXX
*RTC_MONTH = date->mon;
*RTC_YEAR = date->year;
return TRUE;
}
bool
rtc_time_get (struct rtc_ymdhms *date)
{
date->sec = *RTC_SEC;
date->min = *RTC_MIN;
date->hour = *RTC_HOUR;
date->day = *RTC_DOM;
date->wday = *RTC_DOW;
date->mon = *RTC_MONTH;
date->year = *RTC_YEAR;
return TRUE;
}
bool
rtc_alarm (struct rtc_ymdhms *date, bool on)
{
// Clear Pending interrupt.
*RTC_ILR |= ILR_RTCALF;
if (on)
{
*RTC_ALSEC = date->sec;
*RTC_ALMIN = date->min;
*RTC_ALHOUR = date->hour;
*RTC_ALDOM = date->day;
*RTC_ALDOW = date->wday;
*RTC_ALDOY = 0;//XXX
*RTC_ALMON = date->mon;
*RTC_ALYEAR = date->year;
// Alarm mask.
*RTC_AMR = 0; // compare all.
}
else
{
*RTC_AMR = AMR_MASK; // mask all.
rtc_alarm_clear ();
}
return TRUE;
}
void
rtc_alarm_clear ()
{
// Clear alarm
*RTC_ALSEC = 0;
*RTC_ALMIN = 0;
*RTC_ALHOUR = 0;
*RTC_ALDOM = 0;
*RTC_ALDOW = 0;
*RTC_ALDOY = 0;
*RTC_ALMON = 0;
*RTC_ALYEAR = 0;
*RTC_AMR = AMR_MASK; // mask all;
}
bool
rtc_counter_incr (enum ymdhms counter, bool on)
{
uint32_t bit[] = { CIIR_IMYEAR, CIIR_IMMON, CIIR_IMDOM, CIIR_IMDOW,
CIIR_IMHOUR, CIIR_IMMIN, CIIR_IMSEC };
// Clear Pending interrupt.
*RTC_ILR |= ILR_RTCCIF;
if (on)
{
*RTC_CIIR = bit[counter];
この実装だと、どれか一つのカウンタの増分時しか割り込みが起きない。
本来は全ての組み合わせでいい。
}
else
{
*RTC_CIIR = 0;
}
return TRUE;
}
bool
rtc_subsecond (uint32_t subsecond_select, bool on)
{
// SubSelSub-Second Select.
*RTC_CISS = subsecond_select;
// Clear Pending interrupt.
*RTC_ILR |= ILR_RTSSF;
// Enable/Disable interrupt.
if (on)
*RTC_CISS |= CISS_SUBSECENA;
else
*RTC_CISS &= ~CISS_SUBSECENA;
return TRUE;
}
void
rtc_print ()
{
struct rtc_ymdhms date;
rtc_time_get (&date);
iprintf ("%d %d %d %d %d %d %d\n", date.year, date.mon, date.day,
date.wday, date.hour, date.min, date.sec);
}
void
rtc_intr ()
{
uint32_t r = *RTC_ILR; // interrupt cause.
*RTC_ILR |= (r & ILR_MASK); // Clear interrupt.
RTC_ILRの予約ビットの読み込みは不定、書き込み時は0じゃないといけない。
// Dispatch application defined handler.
if (r & ILR_RTCCIF)
rtc_intr_counter_incr ();
if (r & ILR_RTCALF)
rtc_intr_alarm ();
if (r & ILR_RTSSF)
rtc_intr_subsecond ();
}
void
__rtc_intr () // Place holder.
{
ユーザ定義のハンドラがなければここ。
rtc_print ();
}






最近のコメント