マイコン基本機能【割り込み】現役エンジニアが徹底解説

こんにちは、組み込みエンジニア歴20年以上のtomozoです。

 

今回は、

私の組み込み開発経験も交えながら

マイコンの機能【割り込み】

について徹底解説します。

 

この記事は

マイコンの割り込みってどう使うんだろうって疑問を持っている新人エンジニアの方

向けの記事です。

 

マイコンの割り込み機能を使いたいけど

マニュアルを読む前に分かりやすい説明を

調べているところではないでしょうか?

 

新人の頃はマイコンのマニュアルを読んでみても、

ページ数が多くて分からないことが多いので

もう少し簡単に分かればなあって思いますよね。

 

私も新人の頃に先輩からマニュアルみたら分かるよって言われたこと

ありましたが、それはある程度知っている人の意見であって

分からない人からしたらさっぱり分からないってこともあります。

 

この記事を読めば

  • マイコンの割り込み機能について
  • 組み込み機器ではどういう風に使われているか

が分かるようになります。

 

割り込み無しで組み込みシステムは作れない

といっていいくらい割り込みは必須です。

きちんと理解しないままにしておくと、何か不具合があった時に

対処できない可能性があります。

 

このページを足掛かりにして

しっかり基本を理解してもらえたら幸いです。

それでは早速解説をはじめます。

 

マイコンの割り込みとは

日常生活で割り込みと聞くと「列に割り込む」とか

イメージされるのではないでしょうか?

 

組み込みプログラムは通常書かれた順に一行ずつ処理されます。

割り込みは、この順番に割り込んで優先的に処理されるので

この言葉がつけられています。

 

下の図のようにメインプログラムを順番に処理している時に

タイマー割り込みが発生すると、タイマー割り込みプログラム

が優先して処理されます。

タイマー割り込みというのは、後述しますが

ここでは所定の時間がマイコンに教えてくれる機能と考えてください。

 

どういったときに割り込みが必要になるの?

初心者あん

tomozo

分かりやすい日常例を挙げてみましょう

お風呂にお湯を貯めている時に溢れないようにするには

どうしたらいいでしょうか?

ずっと目で浴槽を見ていて貯まったら止めるのが一番確実ですね。

 

しかしずっと見ていると他のことができないし、

ちょっと離れてスマホをいじっていると

ついつい忘れてしまって溢れされてしまいます。

そこでだいたいの貯まる時間に知らせてくれれば便利ですね。

これが割り込みの考え方です。

時間以外にも一定量貯まったらでもいいですね。

 

今の説明をフローチャートで書くと以下のようになります。

tomozo

何かしている時に条件を満たすことによって割り込みます

 

組み込み制御でも同様に、

マイコンがずっとセンサを見ていると

モーターを回したり通信したりといった他のことが効率よくできないので

割り込みを使って適切なタイミングで必要な処理を行います。

 

ちなみにマイコンが定期的にセンサの状態を見たり

通信することを「ポーリング」と言います。

例えば1ms毎にセンサの状態をポーリングするとか

300ms毎にポーリングして他のマイコンに通信するって言ったりします。

tomozo

よく使う言葉なので覚えておきましょう

 

割り込みの原理

マイコンの割り込みってどう動いているの?

初心者あん

マイコンにはタイマーや通信など色々な機能があって、

それらが○○した時割り込みを発生するというのが、

マイコンの内部回路ハードウェアで決まっています。

 

例えばタイマーであれば、

  • オーバーフローした時
  • アンダーフローした時
  • カウントが一致した時

などです。

オバーフローというのは、1バイトカウンタであれば0xFFから1カウントアップして0になるタイミング

アンダーフローは1バイトカウンタであれば0から1カウントカウンして0xFFになるタイミング

の事です。

 

割り込みが発生すると、

  1. メインプログラムを中断
  2. 内蔵RAMにあるスタック領域に中断時点の汎用レジスタやプログラムカウンタを退避(プッシュ)
  3. 割り込みベクタから割り込みプログラムに遷移
  4. 割り込み処理
  5. プッシュした情報を取り出して中断前の状態に戻す(ポップ)
  6. 中断したところからメインプログラム処理再開

という流れになります。

 

 

割り込みベクタ

下の図のようにタイマー割り込みが発生すると

#2の割り込みベクタに設定された番地B

に対応するタイマー割り込み処理を実行するというようになっています。

 

割り込みの禁止と許可

割り込みには、

禁止/許可の切り替えができるもの(マスカブル)と

できない物(ノンマスカブル)があります。

マスカブル割り込み

メインプログラムのここのタイミングは

少しの遅延も許されないくらいシビアなので

処理が中断されたくない時に割り込みを

受け付けないように禁止します。

 

割り込み禁止にした後は

せっかく割り込みを使っているのに見逃したり

適切なタイミングで処理されなくなったりしないように

できるだけ早く許可するように注意しましょう。

 

以下のような図になります。

割り込み禁止中に起きた割り込みの要求自体は

保持されています。

許可されてから処理できるので安心してください。

ノンマスカブル(NMI)割り込み

電源が低下した時や外部クロックが停止した時など

組み込みシステムにとって致命的な状態が起きたとき

発生する割り込みです。

 

ノンマスカブルインターラプト(Non-Maskable Interrupt)

の頭文字をとってNMIと呼ぶことが多いです。

 

tomozo

組み込み担当者は上司からの命令をNMIって言ったりします(笑)

多重割り込み

割り込みによってはいつ発生するか決まっていないものもあるので、

割り込み処理中に他の割り込みが発生することもあります。

これを多重割り込みと言います。

 

割り込みの優先レベルはハードウェアで決まっているので、

より優先レベルの高い割り込みが発生し、多重割り込みが許可

されていた場合はそちらの割り込みに遷移します。

優先レベルの低い割り込みが発生した場合や

多重割り込みが禁止されている場合は、現在の割り込み処理が完了してから

次の割り込み処理に遷移します。

多重割り込みはスタックを大量に消費したり、

思わぬメモリを書き換えたりして原因の分かりにくい

不具合が発生する危険性があります。

できる限り多重割り込みを禁止するなどの方法で

避けるようにすることをお勧めします。

 

組み込みの種類

下記リンクのルネサス社製RL78マイコンのデータシートを見ると

割り込みは約50個もあります。

RL78G13ハードウェアマニュアル(公式リンク) 第16章割り込み 768ページ参照

 

 

すごくたくさんあるんですね

初心者あん

ほとんどがマスカブル割り込みです。

 

組み込みエンジニアは、

これらを使いこなしてどのように効率のいいプログラムを作るかが

腕の見せ所でもあり面白いところです。

 

組み込み機器の割り込み実用例 3選

実際に組み込み機器で割り込みがどのように使われているのか

よく使われる割り込み制御を3つ紹介します。

タイマー割り込み

時間を設定して定期的に割り込みを発生させます。

割り込みプログラムの中では以下のようなことを行います。

  • センサやスイッチの状態チェック
  • メカ制御

タイマーについてはこちらの記事で詳しく解説しているので

よければご覧ください。

マイコン基本機能【タイマー・カウンタ】現役エンジニアが簡単解説

通信関係の割り込み

組み込みでは外部デバイスや他のCPUとの

通信がたいていの場合必要になります。

通信の中でもシリアル通信がよく使われます。

 

通信の割り込みとしては

  • 送信完了
  • 受信完了
  • エラー発生

などがあります。

 

通信はデータを正しく送受信しなければ

予期せぬ動作をしたりするので

割り込みを使ってデータの送受信を行うのが一般的です。

 

組み込み機器ではコマンドとレングスなどをあらかじめ

仕様として決めておいて、所定のレングス分受信が完了したら

通信内容を確認するといった使い方をします。

 

仕様の一例をあげると

コマンド0x01がレングス0x06で

機器のステータス(運転中とかエラー内容)

を通知するとします。

以下の表のような形です

コマンド 1バイト 0x01
レングス 1バイト 0x06
ステータス情報 4バイト バイナリ情報

 

全データの6バイト受信が完了したら

コマンドは?0x01=>ステータス情報だな!

ではステータス情報の中身は?となります。

 

上の表のような通信の仕様(プロトコルといったりします)は、

各組み込みメーカーの文化があって考え方は色々異なります。

データの中身もバイナリであったりアスキーであったりします。

IRQ割り込み

IRQ割り込みはマイコンのポートの入力の状態の変化が

あった時に発生する割り込みです。

 

組み込み機器では

センサで物体を検出したら割り込みを発生させて

物体を停止させるためにモーターを止めたり

次の処理工程に移ったりするという使い方をします。

 

割り込みを利用したプログラミングの実例を

こちらの記事で詳しく紹介しています。

よければ読んでみてください。

【組み込み基礎】RL78でLチカプログラミング【タイマ/割込/ポート】

 

割り込み処理記述の注意事項

割り込み制御する上で割り込みが発生した時の処理を

割り込みの中に書くのか

メインプログラムに書くのか

迷う時があります。

 

上のお風呂にお湯を貯める例では、

タイマー割り込み内でお湯を止めてもいいし

メインプログラム内でお湯を止めることもできます。

 

こういう場合は、割り込み内では

メインプログラムに通知用のフラグをセットするだけなどにして

できるだけメインプログラムで処理することを

おすすめします。

 

理由は割り込みプログラムが長くなりすぎると

  • 他の割り込みに影響がでる
  • 自分の割り込みが破綻する
  • 可読性が良くない

といった点があるからです。

 

具体的には、

●優先度の高い割り込みプログラムが処理を占有してしまって

他の割り込みのタイミングがずれる。

●自分の次の割り込みを見逃してしまう。

例えば100us毎のタイマー割り込みの処理で

100us以上の処理を行うとシステムは破綻します。

●割り込みプログラムでややこしいことをすると、

まるでメインプログラムのように見えて

頭が混乱します。

 

まとめ

マイコンの割り込みとは

文字通り処理の途中に特定の条件が条件発生した時行われる処理

割り込みの原理

内部回路のハードウェアで発生する

割り込みベクタによって処理先が決定する

割り込みは禁止と許可ができる

重要なものは禁止できない

多重割り込みは極力避ける

割り込みの種類は多岐に渡る

組み込みでよく使われる割り込み3選

  • タイマー割り込み
  • 通信割り込み
  • IRQ割り込み

参考になったとか、もっとここが知りたいなど一言でも

コメント、意見などいただけると励みになります。

 

こちらの記事でマイコンの基本機能についてまとめています。

もしよければご覧ください。

マイコン基本機能5選【初心者組み込みエンジニア必見】

 

このサイトでは

学校や友人、親は教えてくれない

資産運用についても紹介しています。

できるだけ早く自分の将来のために勉強しておかないと

もっと早く知っておけば良かったって後悔しますよ。

インデックス投資はおすすめ!厳選ファンド(商品)3つと利回り検証

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA