スケジューラとタイマの関係がよくわからないので、あれこれ考えたが、動かしてみることにした。
理詰めも大切だけど、わからんことを考えても面白くない。
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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。