Samples_multi task - gfd-dennou-club/mrubyc-esp32 GitHub Wiki
はじめに
マルチタスクのプログラムを作成する.タスクは Linux や Windows で言うと ころの「スレッド」とほぼ同じ意味である.OS がスレッドごとに CPU 時間の割り当てをコントロールし、複数のスレッドを同時的に進行させる機能またはその動作状態のことをマルチスレッドと呼ぶ.
注意) マルチタスク機能を使うためには,マルチタスク対応の VM を ESP32 マイコンに書き込む必要がある.
マルチタスク
mrblib/ 以下に master.rb と slave.rb の 2 つのファイルを作成し, グローバル変数 $status を通して連携するように書けば良い.
以下はサーミスタ温度計で計測しつつ,温度が 30 度を超えた時に LED が点灯するプログラムである. ADC のサンプル と GPIO のサンプル を組み合わせたものとなっている.
master.rb
ADC のサンプル を若干変更する.10 秒間隔でループを回している.
# A/D 変換 初期化
adc1 = ADC.new( 39, ADC::ATTEN_11DB, ADC::WIDTH_12BIT )
#温度計測用変数初期化
B = 3435.0
To = 25.0
V = 3300.0
Rref = 10.0
#グローバル変数
$status = "COLD"
while true
count = adc1.rawread()
voltage1 = adc1.read()
temp = 1.0 / ( 1.0 / B * Math.log( (V - voltage1) / (voltage1/ Rref) / Rref) + 1.0 / (To + 273.0) ) - 273.0
puts "adc1 : #{voltage1} mV, #{temp} C, #{count} count"
if temp > 30.0
$status = "HOT"
else
$status = "COLD"
end
puts $status
sleep(10)
end
slave.rb
GPIO のサンプル を若干変更する.master.rb とは異なり,1 秒間隔でループを回している.
sleep 2 #時間調整
led1 = GPIO.new( 13, GPIO::OUT )
while true
puts "+++ #{$status} +++"
if $status == "HOT"
led1.write(1)
else
led1.write(0)
end
sleep 1
end
実行
コンパイルと実行を行う. コマンドが multi-task になっていることに注意.
$ make multi-task
モニタ出力を確認する場合は,以下のコマンドを実行する.Ctrl-a k で終了できる.
$ screen /dev/ttyUSB0 115200