STM32デモソフトから見える問題点

STM32Fxシンプルテンプレート

前回記事で予告しました、弊社マイコンテンプレートを使い、STM32評価ボードのデモソフトへUART-USB通信機能を追加しました(下記仕様参照)。

デモソフトのSW押下げの代わりに、評価ボードとパソコン間のUART-USB通信コマンドでLED点滅速度を変えます。これをマイコンテンプレートのSTM32F0マイコンへのシンプルな応用例という意味で、STM32Fxシンプルテンプレートとします(年内に既存マイコンテンプレートと同様、Baseboardテンプレートと合わせSTM32Fxマイコンテンプレートとして1000円で販売予定)。

STM32Fxシンプルテンプレート仕様
・動作確認評価ボード:STM32F072RB(Cortex-M0)
・LED出力:評価ボード実装 緑LED LD2点滅速度をUART-USBコマンドで変更
・SW入力:評価ボード実装 青ユーザSW(ソフトチャタリング対策済み)PushをUART-USBで表示
・UART-USB通信:TeraTermなどのターミナルソフトへメッセージ入出力(19200bps 8-Non-1)
・低電力動作:Sleep処理
・使用ライブラリ:HAL

STM32Fx Simple-Template Overview
STM32Fx Simple-Template Overview

STM32評価ボードデモソフトから見えるサンプルソフトの問題点

STM32評価ボードのデモソフトは、マイコンサンプルソフトの問題点を示しています。この問題点は、マイコンサンプルソフト全般に言えます。

サンプルソフトの問題点とは、1つの機能を、初期設定と無限ループを使って説明する点です。この方法は、初心者が単独機能を理解する際には、動作が解り易く、優れています。

しかし、実際のアプリケーションでは、複数の機能が並列的に動作するのが普通です。実アプリケーションの[複数並列(的)動作]と、サンプルソフトの[無限ループ単独動作]とのギャップが大きいことが、マイコン初心者にとっての大きな障壁です。

結論から言うと、サンプルソフトの解り易さに貢献している無限ループの時間消費(浪費)が問題です。

デモソフトの具体例

具体的にSTM32評価ボードのデモソフトで説明します。無限ループ内のLED点滅処理が下図です。

Sample Software Infinite Loop Trouble
Sample Software Infinite Loop Trouble

LED点滅速度は、SW割込みのCallback関数で変えます。このサンプルソフトは、LED出力とSW入力が並列動作しています(サンプルソフトとしては、SW割込みを使う点で珍しい例)。

LED点滅処理を繰り返すのが、無限ループの目的です。1ループのLED処理は、500/100/50ms毎に1回トグルを実行し、その他の時間は、HAL_Delayで時間消費(浪費)です。殆どのサンプルソフトは、この構成です。

つまり、

典型的サンプルソフト ➡[単独処理+時間浪費]の繰り返し

これにより1つの機能を説明する構成です。この方法は、説明の受け側にとっては、解り易いものです。単独処理の中身は、ポーリングが多いのも特徴です。ポーリング結果で、別処理へジャンプするなどします。

別処理の無限ループへの追加

STM32評価ボードのデモソフトは、割込みでSW入力の別処理を追加しています。しかし、無限ループへ、割込み以外で別処理を追加するのは困難です。なぜなら、[単独処理+時間浪費]へ別処理を追加するには、時間浪費の時間を変えるしか手がないからです。

時間浪費の時間を変えたとします。すると、[単独処理+追加処理+変更した時間浪費]となり、既に存在したLED点滅処理の点滅間隔が変わる可能性が生じます。

つまり、処理追加により既存処理へも影響が及ぶのです。厳密には、割込みでも既存処理へ影響が及びますが、その影響は極わずかです。

処理追加で既存処理に影響が及ぶので、追加前の既存処理単独でのデバッグが無駄になります。デバッグの積み重ねができないのです。

それならば、いつも割込みで処理を追加すれば良いかというと、そうでもありません。

割込み処理は、ポーリングに比べデバッグが難しくなります。また、割込み処理のサンプルソフトは、ポーリングに比べ少数です。

サンプルソフトは、単独動作の説明に重点を置いたポーリング動作のものが多数で、実アプリケーション開発へ、そのままでは使いにくい構成、構造になっていることがお判りになったと思います。

弊社マイコンテンプレートの対策

デモソフトのLED点滅処理に着目したのが、弊社マイコンテンプレートです。500ms、100ms、50ms毎に1回処理し、その他の時間は、別処理、低電力処理(Sleep処理)を時分割で処理します。

つまり、

弊社マイコンテンプレート ➡ ①[単独処理]終わり
____________ ➡ ②[別処理]終わり
____________ ➡ ③[低電力処理]終わり
____________  ①~③の繰り返し

簡単に言うと、時分割の無限ループランチャーです(起動される①側からみると、単独で無限ループ内にあるのと同じ、②、③も同様)。複数処理を起動する仕組みをテンプレート自体が持っているとも言えます。

RTOS: Real Time Operating systemを使うと複数処理起動が簡単です。しかし、RTOS理解のオーバーヘッドが必要です。弊社マイコンテンプレートは、簡易的に処理を並列に起動します。

起動される側の処理は繰り返し起動されますので、ポーリング動作のサンプルソフトの多くがそのまま流用できます。数多くあるポーリングサンプルソフトを活用、流用してアプリケーションの早期開発ができるのが、弊社マイコンテンプレートの特徴です。

また、STM32Fxシンプルテンプレート仕様から解るように、実アプリケーションに最低限必要な、低電力処理、LED出力、SW入力、UART-USB通信の各処理は既にシンプルテンプレートに実装済みです。

このシンプルテンプレートへ実用アプリで必要となる処理を追加しさえすれば、直ぐに最終段階アプリとなる構成になっています。プロトタイピング開発に適し、実アプリケーションとサンプルソフトとのギャップを小さくします。

もちろん処理を追加や削除しても、既存処理への影響が小さいので、デバッグの積み重ねもできます。