皆さん こんにちは。
今回はラズピコのマイコン RP2040 (cortex-m0+)の割り込みに関する話題です。
OSに関連した記事なのに割り込みに全く触れないのもいかがなものかと思い、概要を書くことにしました。
この記事はインターフェース誌2023年7月号の「ゼロから作るOS」を参考にしています。
割り込みとは
ある事象が起きた際に、今実行している処理よりも起きた事象に対する処理を優先して実行するための機能です。
例えばスイッチが押されたり通信のデータを受信したら割り込みコントローラがそれらを検知して、あらかじめ登録しておいた要因毎の処理が実行されます。
その間、割り込みが発生する前に実行していた処理は待たされることになります。
割り込みを使わない場合(ポーリング)に比べて、スイッチ押下の検知もれや受信データのとりこぼしを起こりにくくすることができます。
今実行している処理を中断し、優先的に処理されることから割り込みと呼ばれています。
割り込みにはハードウェア割り込みとソフトウェア割り込みがあります。
ゼロから作るOS Try Kernel では Systick と Pend SV 割り込みが使われています。
Systickはタイマー割り込みで、指定した時間が経過するたびに実行されます。Try Kernel の タイマーインターバルは 10msec を標準としています。
Systickはハードウェア割り込みに分類されます。
Pend SVはOS用として用意されているもので、専用のレジスタのビットをセットすることにより実行されるソフトウェア割り込みです。
これによりプログラムで割り込みを発生させることが可能です。
Pend SV は Penging Supervisor の略で、SVC例外に関係しますがcortex-m0+にユーザーモードがないのでSVCは使っていません。
使わない機能なので、ここで難しい話は省略します。
Try Kernel ではタスク切り替え(ディスパッチ)に Pend SV割り込みを使っています。
ベクターテーブル
ラズピコのマイコン RP2040 (cortex-m0+)も、割り込みにはベクターテーブルが使われています。
このテーブルにC言語の関数を記述しておけば、その要因が発生する度にそれらの関数が実行されます。
cortex-m0+では、割り込み処理関数と通常の関数の区別をする必要がないので、C言語のコードが書きやすくなっています。
(ベクターテーブルに直接C言語の関数を記述するだけで良い)
RP2040のレジスタには VTOR というものがあります。
これは割り込みベクターテーブルのオフセットアドレスを変更するためのものです。
例えばRAMのアドレスに設定することで、RAM上にベクターテーブルを配置することが可能になっています。
優先順位
割り込みには優先順位(プライオリティ)があります。
ある割り込み処理が実行中に後から別の割り込み要因が発生した場合、後者の優先順位が高ければ先の割り込み処理が保留されて後者の割り込み処理が実行されます。
これを割り込みのネストと言います。
ネストが可能なcortex-m0+の割り込みコントローラはNVIC(Nested Vector Interrupt Controller)と呼ばれています。
優先順位を表す数値は 0から3までで、数値が大きいほど優先順位が高くなります。
Try Kernel では Systic: 3 , Pend SV: 0 となっていてタイマーの優先順位が高くなっています。
以上、RP2040(cortex-m0+)の割り込みについて概要を説明しました。
お疲れさまでした。
この記事の続きは こちら です。