2014/10/08

[nrf51]スケジューラは結局なんなんだ? - (2)

スケジューラとタイマの関係がよくわからないので、あれこれ考えたが、動かしてみることにした。
理詰めも大切だけど、わからんことを考えても面白くない。

nRF51のテンプレートにありがちなmain()を、こう書き換えた。
timersをコメントアウトだ。

    // 初期化
    leds_init();
    //timers_init();
    gpiote_init();
    buttons_init();
    ble_stack_init();
    scheduler_init();
    gap_params_init();
    services_init();
    advertising_init();
    conn_params_init();
    sec_params_init();
    // 処理開始
    //timers_start();
    advertising_start();
    while (1) {
        //スケジュール済みイベントの実行(mainloop内で呼び出す)
        app_sched_execute();
        uint32_t err_code = sd_app_evt_wait();
        APP_ERROR_CHECK(err_code);
    }

 

動かすと・・・、はい、assertしました。
予想してなかったけど、buttons_init()でapp_error_handler()が呼ばれていた。

エラーコードは8で、発生はAPP_BUTTON_INIT()の行らしい。
8はNRF_ERROR_INVALID_STATE。

マクロをひもとくと、app_button_init()がapp_timer_create()を呼び出しているのだが、app_timer_init()を呼び出していないと設定されないmp_nodesという変数がNULLなのでエラーになっている、ということらしい。
このmp_nodesは、app_timer_init()の第4引数だ。
第4引数は、APP_TIMER_INIT()マクロを使ったときに定義されるstatic変数だ(自分でやっても良いけどね)。

そんなわけで、ボタンを使う場合には、タイマの初期化も必要だし、開始も必要と思われる。


じゃあ、結果が見えているのだけど、ボタンの処理を外してみよう。

・・・はい、assert()。
今度は、ble_conn_params_init()。
罪状は8なので、もう追うまい。


ひとまず、スケジューラというか、タイマを使うかどうかについて1つの結論が出たことになる。

  • ボタンを使う場合には、タイマも使う。
  • BLEを使う場合にも、タイマを使う。
  • そしてタイマの初期化は、それよりも先に済ませておかないといけない。

ボタンを使わないことはあると思うが、nRF51822を使っているのにBLEを使わないことは無いだろう(用途として)。
だから、基本的にタイマは初期化しておくことになると思って良かろう。

 

なんか、スケジューラの話をしていたのにこんな結論で終わったのは寂しいが、まあそういうこともあるさ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。