組込み開発 基本のキ:組込み処理

IoT MCUソフトウェア/ハードウェア開発者向け基本のキ、今回は、組込み処理の「ポーリング」、「割込み」、「低消費電力動作」とMCU開発の秘訣(コツ)を示します。ベアメタル開発でもRTOS開発でもこれらは同じです。これら基本を知ると、サンプルコードの読み方、利用法も解ります。

ポーリング と 割込み

「ポーリング」とは、無限ループを周る度に例えばSWが押されたかどうかのフラグ相当をポーリング(polling)し、フラグが立ったら、その処理を実行することです。

ポーリング
ポーリング

「割込み」は、割込み発生時に周辺回路が自動で呼出すISR(Interrupt Service Routine)を開発します。

ISRは、出来るだけ軽く(小さく)することが重要です。別周辺回路の割込みもできるだけ取込むためです。そこでISRでは、周辺回路が割込み発生時に立てた割込み発生フラグをリセット、このフラグとは別の割込み処理待ちフラグを立ててコード化するのが常套手段です。

この割込み処理待ちフラグを無限ループでポーリング、ブラグが立っていれば実際の割込み処理を実行します。

つまり、割込み処理の前段階にISRがあり、ポーリングのフラグ相当が割込み処理待ちフラグに変るだけ、結局、ポーリングに帰着します。

割込み
割込み

ベアメタル開発でもRTOS開発でも上記は同じです。RTOS時は、タスク間のセマフォ/Queueによる処理待ちが差分として追加されます(これら以外にも処理待ちはありますが、セマフォ/Queueで当面賄えます)。

低消費電力動作

無限ループをそのまま連続で回し続けると消費電力が増加します。そこで、間欠的にループを回し、ループを回さない時間は、最も電力を消費するMCUを停止するのが「低消費電力動作」です。

低消費電力動作
低消費電力動作

例えば1秒毎に1回ループを回すなど、低電力化を図りつつループ連続回しの時と大差なく処理する、つまり、どの程度間欠動作させるかが開発者の腕の見せ所です。

まとめ:ポーリング、割込み、低消費電力動作の3Tipsと開発秘訣

IoT MCUで開発するのは、MCUを含む周辺回路の初期設定と、無限ループ内の処理です。

初期設定とは、内蔵周辺回路を動作させるための設定です。周辺回路は、初期設定が終わると直に動作を開始します。そこでMCUは、動作中の周辺回路を監視し、必要に応じて処理を行います。このMCU監視が、無限ループ内の処理です。「組込み処理の中身」は、このように初期設定とループ内処理の2種類です。

初期設定の前にRAMクリアなどのスタートアップ処理もありますが、ここはIDEが自動生成し、通常、開発者が手を加えることは殆どありません。

初期設定は、サンプルコードの初期設定をそのまま流用する部分です。サンプルコードに使用例がない特殊(!?)な周辺回路の使い方をする時は、データシートやユーザマニュアルの当該周辺回路部分を熟読すればコード化できます。

次の開発部分が、無限ループ内です。ループ内処理をまとめた本稿の3Tipsが下記です

  1. 無限ループ内は、「ポーリング」か「割込み」のどちらか
  2. 割込みは、ISRで「割込み発生フラグ」を「割込み処理待ちフラグ」へ事前変換しポーリングへ帰着
  3. 無限ループの間欠動作と、間欠中のMCU停止が、「低消費電力動作」
組込み処理の3Tips、ポーリング、割込み、低消費電力動作
組込み処理の3Tips、ポーリング、割込み、低消費電力動作

組込み処理の中身とこれら3Tipsを知らずに組込み開発を始めるは、非効率です。中身と3Tipsを習得するには、紆余曲折、結構な時間と実務(失敗)経験が必要だからです。

例を挙げると、技術背景が少ない初心者にとっては、関連情報が多いため消化不良を起こします。また、初心者でなくても、開発自由度が高い(≒無いに等しい)ので、開発を上手く収束させには、Tipsやコツが必要になるなどです。

全てを網羅的に記述しているデータシートやユーザマニュアルは、既にこれらコツや技術背景を習得済みの中級者以上には役立ちますが、それ以外の人が読んでも実質の理解はできません。いきなり六法全書を読んで弁護士をする様なものです😂。

MCU開発の秘訣(コツ)は、先ず、3Tipsを基にプロトタイプを開発し、次に、実際に動作するプロトタイプを使って、開発自由度の高さを活かし動作チューニングすることです。

実働プロトタイプがあれば、データシート実質理解も進みますし、チューニング結果で変な動作になっても元のプロトタイプへ戻れますので、安心して色々な試行錯誤ができ、開発者スキルアップも容易です。

サンプルコード利用法

主要MCUベンダは、多くのサンプルコードを提供中です。

サンプルコードの目的は、“1つ”の周辺回路の基本動作を解り易く示すことです。基本動作は、初期設定と無限ループ内の2つに分けて読みます。無限ループ内は、Tips1/2から処理内容が理解できます。割込みの時は、ISRがあります。

初期設定は、開発に使う使用例と同じかどうかを添付コメントなどから判断します。使用例が同じ、または、近いなら、そのままコピーして流用します。内容を理解したい時は、”その周辺回路のデータシートのみ”を読めば十分です。

もちろん、サンプルコード無限ループ内のポーリング/割込み処理もそのままコピーして流用可能です。

但し、サンプルコードは、一般的にTips3:低消費電力動作への配慮がありません。また、サンプルコードを、“複数”集めて動作させる作り方ではありません。1周辺回路の動作コードを、シンプルに解り易く示すためです。

弊社マイコンテンプレートは、複数サンプルコードを利用する仕組みを予め持っています。また、無限ループの間欠動作と停止MCUを復帰させる仕組みも、テンプレートへ組込み済みです。

テンプレートのサンプルコード利用法
テンプレートのサンプルコード利用法

つまり、初めから複数サンプルコードの活用・流用が即座に出来るようテンプレート化、主要ベンダの汎用MCUに対応し、適用例と詳しい説明資料付き(一部ダウンロード可)で販売中です(ベアメタル開発用:1000円、RTOS開発用:2000円、テンプレート一覧と価格はコチラ)。

本稿3Tipsを知っていれば、サンプルコードを分析しながら読むことができ、必要に応じて各部分を自分のソフトウェアや弊社テンプレートへ組込むことも可能です。

プロトタイプ開発に最適なのが、弊社テンプレートです。テンプレートを使って早期にプロトタイプ開発を実現すれば、開発者の効率的スキルアップ、要求仕様に対するMCU性能過不足なども明らかとなり、お役に立てると思います。

テンプレートご購入、お待ちしております。

FreeRTOSサンプルコード(3)

タスク数=1の前稿FreeRTOSサンプルコード(2)に続き、本稿は、タスク数=2のMCUXpresso54114評価ボードSDK付属FreeRTOSサンプルコードの前半3プロジェクトを説明します。

FreeRTOSサンプルコード:タスク数=2

FreeRTOSプロジェクト:タスク数=2(前半)
Project Tasks heap_ Additional FreeRTOS APIs Additional Comments
freertos_tickless 2 4

vTaskDelay
xTaskGetTickCount
xSemaphoreCreateBinary
xSemaphoreGiveFromISR
xSemaphoreTake

FreeRTOS低電力動作とSW_taskの2タスク並列動作説明。

Tickless_taskは、vTaskDelay、前稿hello_taskは、vTaskSuspend。

SW_taskは、Tickless_taskに何ら影響を与えない。

freertos_i2c 2 4

xSemaphoreCreateBinary
xSemaphoreGiveFromISR
xSemaphoreTake

master_taskとslave_taskの2タスク構成。正常動作結果は、Console窓出力。DoC>readme.txtでも結果が判る。

freertos_spi 2 4

xSemaphoreCreateBinary
xSemaphoreGiveFromISR
xSemaphoreTake

同上

タスク数=2のサンプルコードは、上記以外にもFreeRTOS特徴のミューテックスとセマフォ利用例がありますが、これらは次回説明します。

FreeRTOS Project:freertos_ tickles

前稿説明のhello_taskは、Console窓に文字を1回出力し、「待ち状態」になりました。
hello_task とよく似たTickless_taskは、文字の代わりにxTaskGetTickCountで得た数字を1回出力し、vTaskDelayで5秒間の「停止状態(=低電力動作:Sleep)」になります。

低電力動作からの復帰Eventで、Tickless_taskは停止状態から実行可能状態へ移行し、スケジューラによって再実行されます。停止時間5秒間のtick回数がConsole窓に出力されます。
※FreeRTOSタスクの状態遷移図は、マイコンRTOS習得2017の第2部を参照。

このプロジェクトは、Tickless_task が、SW_task動作に全く影響を受けないFreeRTOSの特徴を説明しています。

つまり、Tickless_taskと、SW_taskは、それぞれ別々にあたかも自分のタスクがMCUを占有するように記述されており、かつその通り並列動作します。これがFreeRTOS利用ソフトウェア開発の最大メリットです。タスク開発は、ベアメタルソフトウェア開発に比べ簡単に、かつ流用性も大きくなるでしょう。

※SW3プッシュは、ソフトウェア、ハードウェアで何もチャタリッグ防止策をしていない処理の検証にも使えます。試しにSW3を長く押してチャタリッグが発生することを確かめてください。チャタリッグ防止策の必要性が解ります。

FreeRTOS Project:freertos_ i2cとfreertos_ spi

freertos_ i2cとfreertos_spiプロジェクトは、どちらもMCU内蔵I2C、またはSPIを使った外部デバイスとの通信サンプルコードです。どちらもmaster_taskとslave_taskの2タスクから構成されています。

main.cでslave_taskのみをタスク登録し、slave_task内でmaster_taskを登録しています。このように、FreeRTOSスケジューラ起動後でも、任意の場所で新たなタスク登録が可能です。

動作は、最初master_taskでデータ送信し、それをslave_taskで受信、次にslave_taskがデータ送信し、それをmaster_taskで受信し、両タスクとも正常終了します。

この動作シナリオは、slave_taskに記述されており、master_taskのデータ送信開始は、slave_taskのmaster_task登録の結果、並列実行されます。slave_taskのデータ受信と送信完了は、i2c_slave_callbackからのセマフォを使って判断しています。

評価ボード実装Arduinoコネクタ上の配線で、送受信データをループバック接続しますので、評価ボード1台のみで両タクス動作結果が、IDEのConsole窓に出力されます。

MCUXpresso54114評価ボードをお持ちでない方は、両プロジェクトのDoc>readme.txtのRunning the demoにConsole窓出力と同じ結果があるので解ります。

I2C/SPI通信対象のデバイスは、従来からの外付けEEPROMに加え、最近ではIoTセキュティデバイスなどがあります。

IoTセキュティデバイスは例えば、NXPのEdgeLookやMicrochipのCryptoAuthenticationファミリなどがあり、IoT MCUのクラウド接続には、これらデバイス利用が必須になりそうです。

I2C通信のIoTセキュリティデバイス接続例(出典:NXP SE050データシート)
I2C通信のIoTセキュリティデバイス接続例(出典:NXP SE050データシート)

FreeRTOSサンプルコード:タスク数=2(前半)の調査結果

  • FreeRTOS低電力動作(Sleep)は、vTaskDelay(msec)で低電力動作開始と復帰
  • タスク数が2と少ないので、タスク並列動作が解り易く、プライオリティ設定とその意味も理解容易
  • I2C/SPI割込みISRとのタスク同期に、バイナリセマフォ利用
  • 割込みcallback関数でセマフォをgive → 割込み処理タスクでセマフォをtake → セマフォ消滅
  • IoT MCUは、セキュティデバイスとのI2C接続可能性大
  • メモリ使用法は、heap_4を利用

セマフォ(Semaphore)同期は、マイコンRTOS習得2017の第3部:Semaphoreによるタスク同期の章に、図入り解説していますのでご参照ください。

FreeRTOSサンプルソースコードは、MCUXpresso IDEのみでも御覧頂けます。是非、PCへインストールし本稿をご参照ください。