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