hiro99ma blog

ncs: nRF Connect SDK 3.0.0 (2)

2025/04/29

過去に作ったプロジェクトを ncs v3.0.0 に差し替えた。
前回の予想とは違い、ビルドエラーになったので確認する。

ビルドエラー?

ベースとしているのはこちらのリポジトリである。
sysbuild には対応済みで mcuboot は使っていたと思う。。。

よく覚えていないが、vscode で赤くなっているからエラー終了のはずだ。

image

#define BT_LE_ADV_CONN                                                                             \
	BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE, BT_GAP_ADV_FAST_INT_MIN_2,                      \
			BT_GAP_ADV_FAST_INT_MAX_2, NULL)

#define BT_LE_ADV_CONN_FAST_1                                                                      \
	BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN, BT_GAP_ADV_FAST_INT_MIN_1, BT_GAP_ADV_FAST_INT_MAX_1,  \
			NULL)

#define BT_LE_ADV_CONN_FAST_2                                                                      \
	BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN, BT_GAP_ADV_FAST_INT_MIN_2, BT_GAP_ADV_FAST_INT_MAX_2,  \
			NULL)

以上だ。
あれ、エラーがないぞ??

エラーではない?

ログの最後まで見ても、リンクはしているし ELF も作って HEX まで作っている。
ツール類もなにかアップグレードしないといけない?

nRF Connect SDK for VSCode のアップデート

Visual Studio Code の Extension がアップデートされていなかった。
アップデートするとこういうメッセージが出てきた。 v1.0 系は使ったことも無いので関係なかろう。

image

これでもビルドエラー扱いになるのは変わらない。
コマンドラインで実行したあとにエラー値を見ると 126 だった(あとで vscode の TERMINAL でエラーを表す赤ドットの上にマウスカーソルを当てるとエラー番号がホバーするのに気付いた)。

$ echo $?
126

最後にカレントディレクトリの名前で “Is a directory” と出力されているから、west かなにかが実行しようとしているように思う。 `pwd` とか $PWD とか書いてあるんだろうか。

......
bash: /home/xxx/work/recv-sb1602: Is a directory
$

ただ、ncs v2.9.1 に戻しても同じようなエラー状態になった。
うーん、v3.0 にするまでエラーは出てなかったような気がするのだけどなあ。

切断後の再 Advertising

bt_le_adv_start() のパラメータを BT_LE_ADV_CONN_FAST_2 にしたため切断後は Advertising されなくなった。

元々第1引数は bt_le_adv_param* を与えるもので BT_LE_ADV_CONN_FAST_2 などはマクロになっているだけだ。
ポインタの代わりに要素数 1 の配列を作っている・・・?

#define BT_LE_ADV_CONN_FAST_2                                                                      \
	BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN, BT_GAP_ADV_FAST_INT_MIN_2, BT_GAP_ADV_FAST_INT_MAX_2,  \
			NULL)

#define BT_LE_ADV_PARAM(_options, _int_min, _int_max, _peer) \
	((const struct bt_le_adv_param[]) { \
		BT_LE_ADV_PARAM_INIT(_options, _int_min, _int_max, _peer) \
	 })

#define BT_LE_ADV_PARAM_INIT(_options, _int_min, _int_max, _peer) \
{ \
	.id = BT_ID_DEFAULT, \
	.sid = 0, \
	.secondary_max_skip = 0, \
	.options = (_options), \
	.interval_min = (_int_min), \
	.interval_max = (_int_max), \
	.peer = (_peer), \
}

options指定できそうなパラメータに再 Advertising できそうなものは deprecated になってしまった。
Nordic AI によると意図的な変更で、Advertising はアプリが責任を持つことになったそうだ。 BLE Fundamentals にも説明があるらしい。

Migration guide to Zephyr v4.0.0 によると extended advertising sample を参考にせよということだ。

なんか思ってたよりめんどくさい。
てっきり切断後に bt_le_adv_start() を呼び出すくらいだと思っていたのだ。 しかしその方法だと再 Advertising はされないのだから、こういう面倒そうなことをやるしかないのか。。。

Nordic AI には recycled コールバックの使用を提案された。
これは BLE Fundamentals の 5.2章でも出てくるので、こっちにしようかな。

bt_le_adv_start() を別タスク?ワーク?で動かすようにして、直接には呼び出さないようにしてある。
以前は disconnect のタイミングで bt_le_adv_start() を呼び出して再開できたと思うが構造というかコンテキストというかが変わったんだろうか。


 < Top page


コメント(Google Formへ飛びます)

GitHub

X/Twitter

Homepage