今回は、Raspberry Pi Picoを使って、MicroPythonでマルチタスクプログラムを作成する方法について解説します。
マルチタスクは、1つのマイコンで複数の処理を実装することができ、組込みアプリケーション開発では必須の知識となりますので、ぜひ挑戦してみてください。
マルチタスクプログラムとは?
マルチタスクプログラムは、複数のタスクを同時にまたは交互に実行するプログラムです。これにより、システムが効率的に動作し、リアルタイムでの応答が可能になります。
マルチタスクとプライオリティ(優先度)の重要性
マルチタスクは、システムの効率を大幅に向上させることができます。しかし、すべてのタスクが同じ優先度を持つ場合、重要なタスクが適切な時間に実行されない可能性があります。
これを解決するために、各タスクにプライオリティを設定します。プライオリティが高いタスクは、プライオリティが低いタスクよりも頻繁に実行されます。これにより、システムは重要なタスクを優先的に処理し、全体のパフォーマンスと効率を向上させることができます。
作成したMicroPythonコード
ここからは、実際にMicroPythonを使ってマルチタスクを構成する具体的な実装方法について解説します。
コード解説
このプログラムでは、3つの異なるタスクを協調マルチタスクで実行します。それぞれのタスクは、特定の間隔で実行されるように設計されています。それぞれのタスクは、一定の間隔(100ミリ秒、300ミリ秒、500ミリ秒)が経過した後に実行されます。
task1
は、最も高い優先度を持つタスクで、100ミリ秒ごとに実行されます。これは、他のどのタスクよりも頻繁に実行されるタスクです。task2
は、中程度の優先度を持つタスクで、300ミリ秒ごとに実行されます。これは、task1
よりは少なく、task3
よりは頻繁に実行されるタスクです。task3
は、最も低い優先度を持つタスクで、500ミリ秒ごとに実行されます。これは、他のどのタスクよりも少なく実行されるタスクです。
全体のMicroPythonコード
作成した全体のソースコードは以下の通りです。
import utime
# タスク1: 高優先度タスク
def task1(last_run):
if utime.ticks_diff(utime.ticks_ms(), last_run) > 100: # 100ミリ秒ごとに実行
print("Task 1: High priority")
return utime.ticks_ms()
return last_run
# タスク2: 中優先度タスク
def task2(last_run):
if utime.ticks_diff(utime.ticks_ms(), last_run) > 300: # 300ミリ秒ごとに実行
print("Task 2: Medium priority")
return utime.ticks_ms()
return last_run
# タスク3: 低優先度タスク
def task3(last_run):
if utime.ticks_diff(utime.ticks_ms(), last_run) > 500: # 500ミリ秒ごとに実行
print("Task 3: Low priority")
return utime.ticks_ms()
return last_run
# タスクの最後の実行時間を記録
last_run1 = utime.ticks_ms()
last_run2 = utime.ticks_ms()
last_run3 = utime.ticks_ms()
# タスクを無限ループで実行
while True:
last_run1 = task1(last_run1)
last_run2 = task2(last_run2)
last_run3 = task3(last_run3)
実行結果
以下がマルチタスクのプログラムを実行した結果です。
高優先のタスクの間に低優先のタスクが実行されていることが確認できました。
まとめ
Raspberry Pi PicoとMicroPythonを使って、マルチタスクを構成する方法について解説しました。今回紹介したプログラムの関数の中身を実行させたい処理に書き換えることで、いくつもの処理を切り替えて実行することができますので、ぜひ活用してみてください。
それでは、また次の記事でお会いしましょう。
コメント