スタートアップのバグ
CPU依存部のstart.asmにある、start: コード(リセット時に最初に実行されるコード)にバグがありました。現在、当該コードはこうなっています。
task_level: // ここからタスクの実行順位 [--sp] = reti; // 戻り番地を捨てて割り込み可能にする jump _kernel_start; user: #ifdef INIT_C_PLUS_PLUS call.x ___ctorloop; #endif jump user; start.end:
まず、このコードでは___ctorloopが決して呼ばれません。user:ラベルはダミーで、このコードの上方にあるrtiから飛んでくるのですが、遅延割込みがかかって直ちにtask_level:に制御が移ります。したがって、場所が適切ではありません。また、_kernel_startにジャンプする前にスタックに予約領域を取っていません。これはkernel_start()関数をデバッグ・オプションでコンパイルした場合、スタックの上の領域が破壊される可能性があります。
正しくはいかのようにあるべきです。
task_level: // ここからタスクの実行順位 sp += -12; #ifdef INIT_C_PLUS_PLUS r0 = 0; r1 = 0; call.x ___ctorloop; #endif [--sp] = reti; // 戻り番地を捨てて割り込み可能にする jump _kernel_start; user: jump user; start.end:
___ctorloopが呼ばれていなかったにもかかわらず、C++のプログラムが動いていたのは不可解です。すこし調査をして見ます。