hiro99ma blog

何か技術的なこと

ncs: マルチスレッド

2024/09/04

一昔前、組み込みソフトの仕事は起動処理を作ったりドライバーを作ったりして、最後にアプリがあった。 まあ、並行して進めるので最後にということもないのだが、下から上まで一から作ることが多かった。

比較的小さいマイコンで OS は載っていなかった。
なので、そういうのにかかりっきりな感じでサイズも大きくならない、CPU もそんなに速くない。 そういう状況なので、アプリも制御が主で複雑というよりはリソースが少ないのをやりくりするのが面倒というところだった。

しかし、今やどうかね。
そういう分野ももちろん残っているだろうが、マイコンメーカーはサンプルではなく標準で OS をセットにしているところも少なくない。 Nordic のマイコンが ncs/Zephyr を採用したのも最近の流れだろう。

OS を採用して頼りたくなるのはリソース管理、中でもタスク管理だろう(個人の感想です)。
メインループを 10msec ごとに回して、それをカウントして回数に達したらタスクを呼び出す、みたいなのは自分でやりたくないものだ。

というわけで、今回はマルチスレッドをやっていこう。
前置きが長くなって済まん。


Lesson 7 – Multithreaded applications

OS を使ってタスク管理できると楽になるとはいっても、そもそもタスク管理自体が面倒なものだ。
それを実装しなくて済んだからといっても、しくみを把握していないと

Threads

Scheduler

ISR

割込みハンドラー。

スレッドの優先度は Arm の割り込みレベルと連動しているのだろうか?
多重割込みを許したのと同じような動作だと考えたのだが。

Exercise にあるようだからそこまで待ってみよう。


2024/09/05

続き。

Exercise

Exercise 1

Exercise 2

Exercise 1 では k_yield()k_sleep()を呼び出すことで同じ優先度のスレッドを行き来するようにした。
そういうロジックを考えたくない場合に time slicing を有効にするそうだ。

ロジックは考えなくてよいかもしれないが、スレッドに優先度があるようなアプリだと難あり。

Exercise 3

優先度高のスレッドによって低優先度スレッドに処理が回らない可能性があるので Workqueue で処理を逃がそう、という感じか。

exercise が分かりづらかったがこういうことだろうか。

thread0では 20msec ごとに k_work_submit_to_queue()で workqueue に work item を追加する。 1回の処理(emulate_work())は 20msec 以上かかるのと、workqueue の優先度は thread1 よりも低いのとで workqueue での work item は thread1 が実行する emulate_work()に1回程度処理を中断させられる。
thread0 の work item は結果を出力することがないので実際はどのくらいかかっているのか分からない。

thread0 は 20msec ごとに処理をキューに追加しているが、work item でかかる時間はそれより長いのでキューがいつかあふれるんじゃなかろうか。 API を見たがキューにたまった work item の数を取得するのはなさそうだった。 k_work_submit_to_queue()がエラーを返すだろうが、事前に調べられるのだろうか?

Workqueue Threadsはページが長いのだが、API の種類がいくつあるためだ。

よくわかってない。。。

< Top page