Template Tips

Tips Quick Links


第1部:処理分割の重要性

処理分割の重要性で示すTipsやコツの一覧は、下記です。

第1部で示すTipsやコツのまとめ
  • 処理を細かく分割する指針、方針を持ってサンプルソフトを読む
  • 分割処理は、RAM値で動作決定する部品化を目指す
  • マイコンテンプレートへ、分割処理を追加してアプリケーション開発

マイコン処理を4つに分類

テンプレートの対象マイコンで開発する処理を、下記のように4つに分類します。

Processing Processing completion confirmation Explanation Example Sample Code
Input unnecessary Processing that can be completed by simply inputting from the target SW Yes
need Processing that requires some processing completion confirmation before input from the target ADCs
UARTsreception
Output unnecessary Processing that can be completed by simply outputting to the target LED
need Processing that requires some processing completion confirmation after output to the target LCD
UARTssend
Interrupt unnecessary Prediction of occurrence timing is impossible, so interrupt. ISR
Note that whether or not an interrupt is cleared depends on the cause.
Others unnecessary Processing using computing power, high-speed microcomputers are good at it. feedback control none
Processing that calculates with the input value of the input process and reflects the output value to the output process.

マイコンのアプリケーションは、これら「4種類の処理を組合せて」開発します。

説明の内容から、「その他の処理」を除くと、各処理は数10~数100ステップの単純な処理です。従って、これら単純な処理の品質、バグが無いことが重要です。

「その他の処理」は、内容によっては多くの計算や開発ノウハウが必要となる分野です。
そこで、マイコン計算能力や大きなROM/RAMが必要になるかもしれないその内容には踏み込まず、「その他の処理」としてひとくくりにしています。

マイコンテンプレートも、この「その他の処理の1つ」です。


マイコン開発のバイブル:サンプルソフトを活用

「入力処理」~「割込み処理」のような単純な処理は、ベンダ提供のサンプルプログラムで提供されることも多いのです。

従って1から自分で開発するよりも、サンプルプログラムを利用する方が、手間も少なくバグも無くなるのです。
※サンプルソフトの見つけ方は、 アプリケーション開発手順 4.サンプルソフトの選出も参考になります。

マイコンテンプレートが、サンプルプログラムの流用/活用を重視するのは、これが理由です。

「骨組み」を提供するテンプレートへ、サンプルから入手した入力~割込みなどの「処理」を、骨組みに「追加」することでアプリケーションを早期完成します。

適当なサンプルソフトが無い場合でも、このように分類しておけば「既存サンプルと似た方法」で開発する指針が与えられます。

つまり、サンプルソフトが提唱するマイコンに適した方法で処理を開発するのです。

サンプルソフトは、単にサンプルではなく、「当該マイコン利用のバイブル」と言っても過言ではありません。

サンプルソフトの手法を活用/流用することこそ、開発成功の秘訣です。


テンプレートを使って重要箇所開発に集中

テンプレートを使えば、表で示した最も重要で開発時間もかかる「その他の処理へ労力を集中」したアプリケーション開発が可能です。

この結果、計算能力不足の場合には、より高性能なマイコン利用や、改版や仕様追加に備える対策が「事前」に取れます。

プロトタイピング開発は、実際のアプリケーション開発に近い環境で、このような現状マイコンに対する予測/見識を持てること、これが最大の目的です。

勿論、現状のマイコン能力で十分であれば、アプリケーション開発も完了に近づきます。


インタフェースRAMの役目

処理間のデータやり取りにRAMを使うこと、これもテンプレートの特徴です。

インタフェースRAMで処理を分離し、部品化するのです。

処理を分離しておけば、処理の中身がデバッグ中、または未完成であっても、「完成後の想定データ」をデバッガでインタフェースRAMへ設定しさえすれば、データを送受する側の処理が開発可能です。

RAMにより処理を分離分割し、なるべく単純でデバッグしやすい処理単位で開発することがインタフェースRAMの目的です。


第2部:マルチタスク処理の実現方法

シングルコアのマイコンでマルチタスクを実現するには、組込OSを使う方法が一般的です。

しかし、ROM/RAMが少ない低価格マイコンへ、組込OSを適用するのは考慮が必要です。アプリケーションを追加する余地が少なくなるからです。マイコンテンプレートは、これら低価格マイコンに適したマルチタスク起動処理を実装済みです。

第2部で示すTipsやコツのまとめ
  • 処理時間を短くするため、「確認処理」と「その結果の処理」を分離
  • 起動処理無しの「空き時間」は、低消費電力処理を起動(SleepとDeep Sleepの差には注意)

組込OS(FreeRTOS)の分割起動

シングルコアのマイコンで、マルチタスク処理をする方法が、「処理の分割起動」です。

組込OSは、この処理=タスクの起動をOSが行います。FreeRTOSの “USING THE FREERTOS REAL TIME KERNEL”から抜粋したFigure 4は、このことを解り易く示しています。

組込OS(FreeRTOS)の分割起動

OSのKernelは、tick interrupt毎にタスク切り替えを行います。
t2でTask1は「強制的に中断」され、Task2へ切り替わります。
t3では、Task2が強制中断され、Task1が「中断処理から再開」されます。


テンプレートの分割起動

分割起動は、テンプレートでも同じです。

テンプレートは、第1部で示した「細かく分割した処理」をtick interrupt毎に時分割で起動します。

組込OSとの差は、(簡単に説明すると)起動処理を強制的に中断したり、再開したりする機能が無いことです。

起動処理1の中断機能が無いので、t2のタイミングまでに「処理1が終了」していることが必要になります。


細かく処理分割することで処理終了

この「処理終了」は、どうすれば得られるのでしょうか?

第1部で説明した「マイコン処理の分類」は、結果として処理時間も短くなり、この処理終了をもたらします。

Processing Processing completion confirmation Explanation Example Sample Code
Input unnecessary Processing that can be completed by simply inputting from the target SW Yes
need Processing that requires some processing completion confirmation before input from the target ADCs
UARTsreception
Output unnecessary Processing that can be completed by simply outputting to the target LED
need Processing that requires some processing completion confirmation after output to the target LCD
UARTssend
Interrupt unnecessary Prediction of occurrence timing is impossible, so interrupt. ISR
Note that whether or not an interrupt is cleared depends on the cause.
Others unnecessary Processing using computing power, high-speed microcomputers are good at it. feedback control none
Processing that calculates with the input value of the input process and reflects the output value to the output process.

 

注意すべきは、赤字の完了確認が必要な入出力処理です。

しかし、ここを「完了確認の処理」と、「その結果で動作する処理」の2つに分けて開発すれば、問題解決です。それぞれの処理が短時間で終了するからです。

同じように割込み処理も、基本的にISR: Interrupt Service Routine内では、「割込み発生確認と割込み要因のクリア」のみを行い、「割込みの結果で動作する処理は別処理」として分割して処理化します。

このような処理分割により、デバッグが容易となり、別アプリへ流用/応用性、部品化も高まります。

勿論、サンプルプログラムのISR処理を「そのまま流用」してもOKです。サンプルプログラムが提供する典型的なISRは、処理時間が短い場合が殆どでだからです。


処理終了後はSleep

テンプレートの起動処理で起動される側の処理時間が短くなると、元の起動処理へ戻る時間が増えます(テンプレートの分割起動:ピンク期間)。

この戻った時の処理が、無限ループの処理です。

テンプレートでは、無限ループ内で起動する処理は、低電力処理のSleep(またはDeep Sleep)です。

この結果、高速マイコンであればある程「無限ループ:空き時間」が長くなり、マイコン消費電力の大部分を占めるコア動作を停止するSleepを効果的に使えます。


第3部:時分割タイミングとインタフェースRAM

マイコンテンプレートが起動するアプリケーション処理の間隔は、250us/1ms/10ms/100ms/1s/無限ループの6種類です。
※テンプレートにより間隔が異なる場合もあります。

この6種類の使い方を説明します。

第3部で示すTipsやコツのまとめ
  • 処理起動間隔:tick interruptは、250usとしているが、変更は可能、かつ任意
  • 高速応答が必要なアプリケーション処理は、短い起動間隔へ配置
  • インタフェースRAMの効率的な利用に、ビット単位構造体も有効

起動処理タイミングと優先順位

マイコンの処理は、電源投入後、「1回のみ実行する」スタート処理と、無限ループで「繰り返し実行する処理」の2つに大別できます(ROM/RAMを初期化するなどのスタートアップ処理は、除いています)。

ここでは無限ループに代わってテンプレートが実行する、繰り返し実行する処理の間隔:「タイミング」を考察します。

テンプレートのアプリ処理起動の間隔は、250us/1ms/10ms/100ms/1s/無限ループの6種類です。

100msと1sの起動間隔は、マイコンにとっては「遅い処理」、例えば、LED点滅や、LCD初期設定、SWチャタリング対策の起動に適しています。
※LCD初期設定は、無限ループ前のスタート処理で実行することも可能です。

1msと10msの起動間隔は、「早い処理」、例えば、割込みの応答処理などの起動に適しています。

250us起動間隔は、「最も早い処理が必要」な、例えば、UART/I2Cなどのデータ受信処理を起動することを想定しています。

つまり、早いレスポンスが必要な処理ほど処理間隔が短く、起動される処理のソース記述位置も上側になるのです。
これが テンプレート時分割起動の「基本的な使い方」です。

実例を示します。赤/緑/青LEDを、0.5/1/2秒毎にトグル点滅する場合です。
赤囲みが、テンプレートへ追加されたLEDトグル処理を表します。それ以外が、テンプレートに初めから記述済みの起動処理です。


起動間隔

起動処理の間隔は、tick interruptの発生間隔です。

1ms>10ms>100ms>1sの順にレスポンスが早くなりますが、250usだけ特別に超高速応答です。これは、UART受信などの主として「いつ発生するか判らない処理に早く即応する」ためです。

テンプレートは、全てこの250usを起動間隔として開発しておりますが、実は「250usである必要性は無い」のです。
因みに、FreeRTOSなどの組込OSでもtick interruptは1msです。

250usは、この最高速でこれまで利用に問題が無かった経験からです。

この起動間隔を1msにし、UART受信処理を1ms起動に変更しても、付属のメニュードリブンテンプレート動作などには問題ありません。

メニュードリブンテンプレートは、当該マイコンのUART受信バッファが1バイトでも、UARTコマンド長も1バイトなので、受信完了確認後ゆっくりバッファからデータを取り出しても間に合うからです。

起動間隔の設定は、テンプレート購入者様が「独自判断で設定して頂いても構いません」。

但し、250usよりも高速:短くすることは無いと思います。これよりも短いと、処理分割をより細かくする必要があり、開発がより厳しくなるからです。逆に、250usよりも長くすると、処理分割は楽になります。

テンプレートは、マイコン「コア動作速度を最高速」に設定し、起動間隔も「最高速と思われる250us」でデフォルトは設定しております。

これは、「開発の最初の段階」ではマイコンの最大能力で動作するアプリケーション開発し、「次の段階」としてコア周波数を下げるなどで、低消費電力化するアプローチを想定しているからです。


インタフェースRAMの効果的な使い方

処理間のデータやり取りにインタフェースRAMを使うことは、第1部で説明しました。

ルネサスのRL78/G1xは、通常RAMよりも高速アクセス可能なSADDRを持つなど特殊な例もありますが、低価格マイコンではRAMが貴重なリソースであることに変わりはありません。

この貴重なRAMを使う時に、ビット単位構造体を使い、ビット単位フラグでデータをやり取りすると、1バイトRAMで最大8個のフラグを使えるので効率的です。

テンプレートでは、このビット単位アクセスを容易にするため、userdefine.hにユーザ型定義を初めから追記しております。処理間のやり取りにブラグを多用する場合などにご活用ください。


マイコンテンプレートとは?

販売中のマイコンテンプレートを、
「ISRはサンプルプログラムを一部またはそのまま流用し、その他全処理をポーリング起動するマルチタスク処理の骨組み」
と説明すると理解が早いかもしれません。

  • 割込み処理は、ISRで割込みフラグ処理のみを行い、ISR発生をポーリングし、実際の割込み実処理を起動する。
  • サンプルプログラムの無限ループポーリングとの差は、処理優先度に応じた時分割ポーリングである。
  • 骨組みのテンプレートへ、サンプルプログラム流用の分割処理を組込んでプロトタイピング開発をする。

この理解でも良いと思います。