090707

|


CR85クランク交換しました。この新品クランク。振れはいい。両端とも0.01mm
以内だ。しかし、このクランク、キー溝がゆる過ぎ。こんなクランクに今迄出
会ったことがない。クランク、キー共に品番確認して、それでも信じられず、
旧クランクからキーを叩き出してはめてみても、ゆるゆる。

とても気になる...。CR85でキーのトラブルには会ったことはないので、これで も大丈夫なのかな...と思いつつ組んだけれど...。最近のホンダの部品のバラ つきはひどい。

ついでにクラッチも、フリクション、プレート、スプリングを新品に。相変わ らず、クランクのオイルシールの入れ方がうまくいかない。うーん...とやり過 ぎると打ち込み過ぎて泣きながら引っこ抜くハメになるのも恐しく。
とりあえず組みはいつも通り。

ピストン廻りも全部新品にして、軽く火入れの確認まで。シーズン前にパーツ 買い込んだ時には「これで1シーズン分だな」と思っていたのだけど、壊し過ぎ。 もうなくなってしまった。

後はロガーのソフト。シェルからいつでもコマンドを受けとれて、SDカードの 書き出し中にもセンサからの割り込みをこぼさないというところで、シェル、 データ、ストレージの3スレッドにしました。
データサンプリングスレッドは割り込みから起こされて、データをバッファに 入れる。このバッファは512Bのダブルバッファにして、512B書きこんだらその バンクをSDカード書き込みスレッドが書き出す。という方針。
char logfile_name[32] = "logx.dat";

uint32_t
logger (int32_t argc, const char *argv[])
{
  struct bfs_fileattr attr;
  int err;

  memset (&attr, 0xff, sizeof attr);	/* Set VNOVAL all */

  if (argc < 2)
    {
      switch (log_status_flag)
	{
	default:
	  printf ("bogus state.\n");
	  assert (0);
	  break;
	case LOG_STATUS_IDLE:
	  printf ("idle.\n");
	  break;
	case LOG_STATUS_SAMPLING:
	  printf ("sampling.\n");
	  break;
	case LOG_STATUS_STOP:
	  printf ("stop process.\n");
	  break;
	}
      return 0;
    }

  if (strcmp (argv[1], "start") == 0)
    {
      if (argc < 3)
	{
	  printf ("specify log #\n");
	  return 0;
	}
      logfile_name[3] = '0' + atoi (argv[2]);
      printf ("LOG START %s\n", logfile_name);
//ロガーのスタート。SysVBFSのファイルは連続セクタなので、これはinodeを
//設定してデータのスタートセクタをとってくる。
//そのセクタから順々に書き込みをして、終了時に、最終セクタの情報を
//inodeに書き戻せばいい。ファイルを開くのは一つだけなので。
      if ((err = bfs_datafile_open (b, logfile_name, &attr, &logfile)) != 0)
	{
	  printf ("can't open log file. %d\n", err);
	  assert (0);
	}
      log_status_flag = LOG_STATUS_SAMPLING;

      return 0;
    }

  if (strcmp (argv[1], "stop") == 0)
    {
      printf ("LOG STOP\n");
      log_status_flag = LOG_STATUS_STOP;
//ストップする時はデータスレッドはセンサからの割り込み待ちかもしれないので
//キック。
      thread_wakeup (data_th);
      return 0;
    }

  return 0;
}

//512byteのダブルバッファ。片方がSDカードへの書き込みに使われ、もう片方は
//割り込みからのデータの保存に使われる。
uint8_t scratch[2][512] __attribute__((aligned (4)));

thread_t data_th;
int data_bank = 0;

//割り込みルーチンとデータスレッドとの間の受渡し用。割り込みハンドラから
//wakeupされて処理がはじまる前に割り込みが入った時にデータを落とさないように
//リングバッファ。
#define	INTR_RBUF_SIZE	64
STATIC uint8_t __buf_intr[RBUF_NOLOCK_SIZE (INTR_RBUF_SIZE)];
STATIC rbuf_nolock_t buf_intr;

void
data_thread (uint32_t arg __attribute__((unused)))
{
  uint8_t buf[INTR_RBUF_SIZE];
  uint8_t *p, *q;
  size_t sz;
  size_t cnt;

  data_th = current_thread;

//センサがつながるGPIOを設定
  data_init ();

//ロガーが使うタイマを設定。今のところ1msecごとにカウントアップするフリー
//タイマー
  // Logger timer. Free count. 1msec.
  timer_config (TIMER3, TIMER_COUNTER_RESET, TIMER_MSEC);
  timer_start_nointr (TIMER3);
  buf_intr = rbuf_nolock_init (__buf_intr, INTR_RBUF_SIZE);

  intr_enable ();

  p = scratch[data_bank];
  cnt = 0;
  while (/*CONSTCOND*/1)
    {
      status_t s;
      size_t i;

      thread_sleep (current_thread);
//ロガーの終了要求が来たら吐き出しスレッドをキック。
      if (log_status_flag == LOG_STATUS_STOP)
	{
	  // Flush
	  printf ("flush.\n");
	  data_bank ^= 1;
	  thread_wakeup (storage_th);
	}
      else if (log_status_flag == LOG_STATUS_IDLE)
	{
//センサから起こされたけれど、まだロガーはスタートしてません。
	  printf ("idle.\n");
	  continue;
	}

//割り込みハンドラからのデータをコピーします。
      s = intr_suspend ();
      sz = rbuf_nolock_read (buf_intr, buf, INTR_RBUF_SIZE);
      intr_resume (s);

//コピーしたデータをさらに吐き出しスレッド用にコピーします。
//このコピーは減らしたいけれど、今回は富豪的に。
      for (i = 0, q = buf; i < sz; i++)
	{
	  *p++ = *q++;
//1セクタ(512byte)分バッファがたまったら、そのバッファを吐き出すように
//キックしてバンクを切り替えます。
	  if (++cnt == 512)
	    {
	      data_bank ^= 1;
	      p = scratch[data_bank];
	      cnt = 0;
	      assert (!write_busy);
	      // Kick storage thread.
	      thread_wakeup (storage_th);
	    }
	}
    }
  // NOTREACHED
}

void
data_init ()
{
  // Setup GPIO senser connected.

  // GPIO setting.
  mcu_pin_select2 (0, 28, PIN_FUNC0);	// GPIO
  // P0_28 is shared with I2C. can't use internal pullup.

  *FIO0DIR &= ~(1 << 28);	// Input

  *VICIntSelect &= ~VIC_EINT3;	// IRQ
  *VICIntEnable |= VIC_EINT3;

  *IO0IntEnR &= (1 << 28);
  *IO0IntEnF |= (1 << 28);
}

void
eint3_intr ()
{
  uint32_t r;

  r = *T3TC;
  //  iprintf ("%x\n", r);
  if (log_status_flag == LOG_STATUS_SAMPLING)
    {
      rbuf_nolock_write (buf_intr, (uint8_t *)&r, sizeof (uint32_t));
// この割り込みから起床する間にまたこの割込みが入ることもあるので、
// 既に起床されていたら起床カウントを上げません。
// これはちょっとモヤモヤする問題。
      thread_wakeup_once (data_th);
    }

  *IO0IntClr = (1 << 28);
}


これは吐き出しスレッド。

void
storage_thread (uint32_t arg __attribute__((unused)))
{
  int err;
  intr_enable ();

// BFSを初期化します。
  b = app_bfs_init (scratch[0]);
  assert (b);

//これはシェルスレッドとの待ち合わせ。
  storage_thread_flag = 1;
  thread_wakeup (shell_th);

  while (/*CONSTCOND*/1)
    {
      thread_sleep (current_thread);
//起こされた時には書き出すバッファが512B用意されているので書き出し。
//SysVBFSは連続セクタなので単に次セクタに書きこんでいくだけ。
      write_busy = 1;
      printf ("write start\n");
      if ((err = bfs_datafile_write (&logfile, scratch[data_bank ^ 1])) != 0)
	{
	  printf ("can't write log file. %d\n", err);
	}
      write_busy = 0;
      printf ("write end\n");
//ロガーの終了要求が来たら、ファイルを閉じます。これは該当ファイルのinodeの
//end_sectorとeof_offset_byteを設定するだけ。
      if (log_status_flag == LOG_STATUS_STOP)
	{
	  if ((err = bfs_datafile_close (&logfile)) != 0)
	    {
	      printf ("can't close log file. %d\n", err);
	    }
	  log_status_flag = LOG_STATUS_IDLE;
	  printf ("file closed\n");
	}
    }
  // NOTREACHED
}


ROM data: 0x3250-0x32b8
RAM data: 0x4000f800-0x4000f868 104byte
bss: 0x4000f868-0x4000f938 208byte
current stack=0x4000fff8
Clock: IRC, PLL NOT connected, PLL MSEL:0 NSEL:0, CCLKCFG 0
Clock: MAIN, PLL connected, PLL MSEL:11 NSEL:0, CCLKCFG 3
sysclock:288000000Hz cpuclock:72000000Hz
PCLK0: 0, PCLK1: 0 PCONP: 4280ffe
calibrated. delay_parm=11
bss RAM check passed.
Checking RAM 40000000-4000f800
LPC2388 Simple Monitor Build Jul  4 2009 14:54:24
mon> l
Send S-record file.
~>Local file name? a.mot
5310 lines transferred in 5 seconds 
!
Read 124732 byte. success
Start address: 0x40004054
stack_start: 0x4000f800
RAM data: 0x4000a02c-0x4000a78c 1888byte
bss: 0x4000a78c-0x4000db6c 13280byte
current stack=0x4000f7f8
Clock: MAIN, PLL connected, PLL MSEL:11 NSEL:0, CCLKCFG 3
Clock: MAIN, PLL connected, PLL MSEL:11 NSEL:0, CCLKCFG 3
sysclock:288000000Hz cpuclock:72000000Hz
PCLK0: 0, PCLK1: 0 PCONP: 4280ffe
calibrated. delay_parm=74
bss RAM check passed.
md_thread_create: [2]:uart recv pc=400015a4 sp=4000d60c stack=1024byte
thread_start: [2]
md_thread_create: [3]:uart send pc=40001540 sp=4000d144 stack=1024byte
thread_start: [3]
md_thread_create: [4]:storage pc=40005820 sp=4000ccd0 stack=2048byte
thread_start: [4]
md_thread_create: [5]:data pc=40005c58 sp=4000c460 stack=1024byte
thread_start: [5]
port 0 pin 19 func 2 => r=e002c004 shift=6
port 0 pin 19 func 2 => r=e002c044 shift=6
port 0 pin 20 func 2 => r=e002c004 shift=8
port 0 pin 20 func 2 => r=e002c044 shift=8
port 0 pin 21 func 2 => r=e002c004 shift=10
port 0 pin 21 func 2 => r=e002c044 shift=10
port 0 pin 22 func 2 => r=e002c004 shift=12
port 0 pin 22 func 2 => r=e002c044 shift=12
Pport 0 pin 28 func 0 => r=e002c004 shift=24
WR 14e80ffe CLK 3005000 PIN 2a80
SD card
RCA=9a970520
[0] DOS 3.0+ 16-bit FAT <32M [63 33264]
[1] NetBSD [33327 90657]
[2] unused [0 0]
[3] unused [0 0]
SysVBFS sector = 6 size = 65536
bfs super block + inode area = 1024byte
inode: 3/8
root inode: 2-2
bfs dirent area = 512byte
dirent: 4/32
super block 512byte, inode 64byte, dirent 16byte
magic=1badface
data_start_byte=0x400
data_end_byte=0x1ffffff
from=ffffffff
to=ffffffff
from_backup=ffffffff
to_backup=ffffffff
fsname=
volume=
[inode index list](max 8)
2  96 2 2 (0) 2 493 210 20 2 4a4ac235 4a4ac235 4a4ac235
3  1515 3 5 (1) 1 420 210 20 1 4a4ac236 4a4ac236 4a4ac236
4  1515 6 8 (2) 1 420 0 0 1 0 0 0
total 3 i-node.
[dirent index list]
32 file entries.
.: sector:58448 + 2 -> 2 96byte. inode=2
..: sector:58448 + 2 -> 2 96byte. inode=2
a.txt: sector:58448 + 3 -> 5 1515byte. inode=3
b.txt: sector:58448 + 6 -> 8 1515byte. inode=4
4 files.
user> 
user> logger
idle.
user> logger
idle.
user> logger start
specify log #
user> logger start 4
LOG START log4.dat
bfs_datafile_open: start 9 end 9
user> a672
a672
a672
a8d8
a943
aa11
aa5a
aae7
ab28
ab83
abb6
logger 
user> logger
sampling.
user> d133
d1e5
d1e5
d395
d3da
d3da
d3db
d3db
d3db
d3db
d4f0
d4f0
d51c
d51c
logger stop
LOG STOP
uflush.
write start
bfs_datafile_write: sector 9
write end
bfs_datafile_close: start 9 end 9
file closed
ser> read 9
72 a6 0 0 72 a6 0 0 72 a6 0 0 d8 a8 0 0 
43 a9 0 0 11 aa 0 0 5a aa 0 0 e7 aa 0 0 
28 ab 0 0 83 ab 0 0 b6 ab 0 0 33 d1 0 0 
e5 d1 0 0 e5 d1 0 0 95 d3 0 0 da d3 0 0 
da d3 0 0 db d3 0 0 db d3 0 0 db d3 0 0 
db d3 0 0 f0 d4 0 0 f0 d4 0 0 1c d5 0 0 
1c d5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 57 45 56 82 7b d3 6 0 0 20 0 0 
0 20 0 0 21 22 0 0 2f 82 0 0 0 4 0 0 
7 8 10 0 0 40 0 0 50 a4 0 0 0 0 0 0 
1 0 0 0 21 62 1 0 2f 82 0 0 0 0 0 0 
0 0 0 0 50 e4 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 f0 81 0 0 3f 0 0 0 0 0 0 0 
8 0 0 0 0 0 1 0 50 e4 0 0 0 0 0 0 
19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 c b 52 6e 52 dd bb 23 e5 31 d2 95 
38 73 2d ef f8 1c 2e a9 e3 c c0 62 8e 76 6b a7 
c6 fd 80 9c f6 eb 5e 6f a8 ea f7 b7 9e 7b 8b 88 
e1 28 40 f2 15 77 65 79 c9 24 f5 35 ed c9 2b a9 
35 f1 1f 33 8f 52 aa ee b5 56 d4 e6 6f 65 98 44 
b e4 ac a3 21 6d c6 70 4f 7c e 94 4c 9e 5a 88 
3c 86 8d e2 5c b1 3 93 ea 4f a7 1c d7 75 25 ca 
user>