1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

mruby/cのタイマー

Last updated at Posted at 2024-08-24

mruby/cは複数のスクリプトを実行することができます。そのためMRBC_NO_TIMERを指定しない場合、時分割するために1msecのタイマー割り込みを使用します。

通常のスクリプトを一本実行しているときは、割り込みと通常処理が動いています。通常処理ではmrubyタスクを実行しています。

RX-WAKE2 (1).png

割り込み処理ではmrbc_tick()を呼んでmruby/cの処理をします。

mruby/cにはデフォルトで組み込みmethodのsleepとsleep_msがあります。

sleepすると処理対象のmrubyタスクがなくなるので通常処理でhal_idle_cpu()を呼んで次の割り込みまで省電力モードに入ります。RXマイコンの場合waitというインストラクションを使います。

RX-WAKE1 (3).png

sleepが終了するとwaitは呼ばれなくなります。

テストスクリプトを書いてみました。

#
# built in method sleep test
#

def print(val)
  val.to_s.each_char do |n|
    serial_write(n.ord)
  end
end

begin
  serial_init
  loop do
    serial_write(0x2a)
    sleep 1
  end
rescue StandardError => e
  print e
end

動かしたところRX210でもRX631でも止まってしまいます。

RXマイコンのwaitは特権命令でユーザーモードで実行すると例外が発生していました。このためユーザーモードに入らないようにすることがitocさんの資料にあり、それで解決しました。

組み込み用途では常に特権(スパーバイザー)モードが一般的のようです。

mruby/cの複数の処理を動かせる仕組みはリアルタイムOSを意識したものなのかもしれません。

RX210はこれで動いたのですが、RX631はUSBの処理が動かなくなったので、hal.hの割り込み制御を外しました。正しい修正かどうかはわかりません。ユーザーモードと特権モードでは割り込みの制御が違うのかもしれません。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?