(gdb) bt
#0 0x00000000004c9539 in MK48T02Device::Store (this=0x7a0e7e858b40, cal=...)
at mk48t02.cpp:283
#1 0x0000000000441f8d in Scheduler::RunRTC (this=0x7a0e7e42c000)
at scheduler.cpp:618
#2 Scheduler::RunOff (this=this@entry=0x7a0e7e42c000) at scheduler.cpp:292
#3 0x00000000004429bc in Scheduler::ThreadRun (this=0x7a0e7e42c000)
at scheduler.cpp:217
#4 0x00000000004429dc in scheduler_run (arg=<optimized out>)
at scheduler.cpp:201
#5 0x00007a0e7a00c072 in ?? () from /usr/lib/libpthread.so.1
#6 0x00007a0e7a887b70 in ?? () from /usr/lib/libc.so.12
Backtrace stopped: Cannot access memory at address 0x7a0e69000000
(gdb) print mem
$1 = (uint8 *) 0x0
LUNA88Kを起動すると即死したが再現はしない。たぶんLUNA-Iも同様。
VM::Init()
がScheduler::Init()
を呼び、スレッドを作成してScheduler::ThreadRun()
->Scheduler::RunOff()
->Scheduler::RunRTC()
->RTCDevice::ClockIn()
->MK48T02Device::Tick1Hz()
->MK48T02Device::Store()
で mem[] に書き込むが、VM::Init()
がそのループでその後MK48T02Device::Init()
を呼び、ここで mem を用意してるのが間に合わなかった? たぶん Init() からスレッド作成を分離したほうがいい。