NXP LPC111xテンプレートV2改版

ARMコア制御の入門マイコンとして適しているNXP LPC1114/5マイコンのテンプレートを改版しました。

このLPC111xテンプレートV2は、従来テンプレートの必須機能のみを実装したTiny(小さな)テンプレートの適用、最新開発環境MCUXpresso IDE(v10.1.1_606)での動作確認が改版目的です。

近日中に旧LPC111xテンプレートご購入者様で、無料アップグレード対象者様には、お知らせとLPC111xテンプレートV2の無償配布を行います。暫くお待ちください。

LPC1114とLPC1115の違い

NXP LPC111xテンプレートの対象マイコンは、ARM Cortex-M0コア50MHz動作のLPC1114(ROM/RAM=32KB/8KB)とLPC1115(ROM/RAM=64KB/8KB)です。

以前の投稿で紹介したNXPマイコンの推薦開発環境をLPC1114/5でフィルタしたものが下図です。

LPC1114 and LPC1115 Recommended Software
LPC1114 and LPC1115 Recommended Software

※赤線は、評価ボード搭載マイコン、青線は、単体購入可能マイコン

NXPのLPC1100シリーズは、LPC1110/11/12/13/14/15の6種の型番と、同じ型番でも低消費電力の技術進化によりLPC1100/1100L/1100XLの3つの世代があるので複雑です(通常→L→XLでより低消費電力)。

但し本ブログは、個人でも入手性が良く低価格、良い評価ボードもあるマイコンが対象です。このふるいにかけると、フィルタの下線を付けたLPC1114/302、消費電力LPC1100L搭載のNXP評価ボードLPCXpresso1114(秋月電子2000円)、デバイス単体では、DIP28ピンパッケージLPC1114/102、消費電力LPC1100L(400円)とSOP28ピンパッケージLPC1114/102、消費電力LPC1100L(190円)の3種類がそれぞれ秋月電子より購入できるので対象となります。
※LPC1114/102は、どちらもRAM=4KBで評価ボード搭載のLPC1114/302の8KBの半分に注意

LPC1115は、LPC1114のROMを2倍の64KBにし、電力消費を第3世代に進化させたマイコンです。NXP評価ボードのLPCXpresso1115には、LPC1115/303、消費電力LPC1100XLが搭載されています。
※型番/xxxの最後の数字が消費電力を示し、1が通常、2がL、3がXLを意味します。

LPCXpresso1115の入手性はあまり良くありません。しかし、開発環境MCUXpresso IDEでAvailable boardsに現れる評価ボードはLPCXpresso1115とLPCXpresso11C24のみで、LPCXpresso1114はありません。

MCUXpresso IDE Available Boards
MCUXpresso IDE Available Boards

従って、入手性が良いLPCXpresso1114評価ボードで新プロジェクトを作るには、評価ボードからでなく、Preinstalled MCUsからLPC1114/302を選択する必要があります。

LPCXpresso1114のMCUXpresso新規プロジェクト作成方法

Select LPC1114/302
Select LPC1114/302

Preinstalled MCUsから評価ボード搭載のLPC1114/302選択後>Next>LPCOpen – C Project>Project name追記と進み、Import…をクリックします。

Click Import...
Click Import…

ArchiveでLPCOpenからlpcopen_v2_00a_lpcxpresso_nxp_lpcxpresso_11c24.zipを選択しNextをクリックします。

Import lpcopen_v2_00a_lpcxpresso_nxp_lpcxpresso_11c24.zip
Import lpcopen_v2_00a_lpcxpresso_nxp_lpcxpresso_11c24.zip

使用ライブラリにlpc_chip_11cxx_libとnxp_lpcxpresso_11c24_board_libを選択後、ダイアログに従っていけば評価ボードLPCXpresso1114/302上に新プロジェクトが作成できます。

LPCXpresso1114とLPCXpresso1115評価ボードの回路図は全く同じです。違いは、搭載ターゲットマイコンのみでIO割付も同じ、PLC-Linkと呼ぶ評価ボード付属デバッガも同じです。またImportして使用するライブラリも同じです。

ならば、Available boards のLPCXpresso1115を選択して新プロジェクトを作成し、LPC1114評価ボードへダウンロードも可能だと思われるかもしれません。しかし、これはデバッガ接続時にエラーが発生します。

MCUXpressoの右下にターゲットマイコンNXP LPC1114/302が示されており、これ以外へはデバッガ接続ができない仕組みになっています。

Target NXP LPC1114/302
Target NXP LPC1114/302

このため、同一ソースコード、使用ライブラリも同じであっても、ターゲット毎にプロジェクト作成が必要です。逆に、LPC1114評価ボードで動作確認したソースコードでライブラリも同じなら、ターゲットさえ変えれば、LPC1115評価ボードでも動作すると言えます。違いは、ROM容量のみだからです。

評価ボード搭載のLPC1115/303とLPC1114/302の機能差はROM容量以外にもありますが、LPC111xテンプレートの応用例は、この差が生じる機能は使用しておりません。

従って、テンプレート応用例のシンプルテンプレート/Baseboardテンプレートを、LPC1114評価ボード、LPC1115評価ボードそれぞれに提供します。LPC111xテンプレートProject Explorerの様子が下図です。

LPC111xTemplate Project Explorer
LPC111xTemplate Project Explorer

LPC1100シリーズの位置づけと開発環境の良さ

NXP ARMコアエントリレベルのLPCマイコンラインナップを、LPC Cortex-M microcontrollers — Discover the differenceより抜粋しました。

LPC1100 Series (Source:LPC Cortex-M microcontrollers — Discover the difference)
LPC1100 Series (Source:LPC Cortex-M microcontrollers — Discover the difference)

LPC1100シリーズは、最も基本的で適用範囲も広いCortex-M0コアマイコンです。電力効率は、LPC800シリーズのCortex-M0+に及びませんが、低電力技術の進化でCortex-M0+に近い低電力動作も可能です。Cortex-M0とM0+の機能差は、コチラの投稿も参照してください。

また、LPCOpenライブラリもLPC8xxに比べ安定(≒バグ無し)しています。DIPやSOPパッケージの入手が容易で低価格、手実装も可能です。LPCXpresso1114/5評価ボードとLPC111xテンプレートを使えば、ARM Cortex-M0マイコンの早期習得とプロトタイピング開発ができると思います。

評価ボードの半分は、切り離して単体デバッガとしても使えます。デバッガとターゲットの接続は、ARMコア標準のSWDインタフェースなので、LPCマイコン以外の他社ARMコアにも使うことができます。100mAまでの電力供給と、実質4本の接続でデバッグとオブジェクトダウンロードが可能です。

LPC111xテンプレートV2のまとめ

改版したNXP LPC111xマイコンテンプレートV2構成を示します。

テンプレート名 対象マイコン(ベンダ/コア) テンプレート応用例 評価ボード:動作確認ハードウェア
LPC111xテンプレートV2(LPCOpen v2.00a利用) LPC1114(NXP/Cortex-M0) ・シンプルテンプレート
・Baseboardテンプレート
LPCXpresso1114(LPC1114/302)
+ Baseboard
LPC1115(NXP/Cortex-M0) ・シンプルテンプレート
・Baseboardテンプレート
LPCXpresso1115(LPC1115/303)
+ Baseboard

ARM Cortex-M0コアのLPC1114/302(ROM/RAM=32KB/8KB)実装のLPCXpresso1114評価ボードは、低価格で入手性良く、開発環境MCUXpressoも他社EclipseベースIDEと比べ使い勝手良く、ライブラリも安定しています。また、評価ボードとBaseboardを接続すれば、色々な周辺回路制御も手軽に学べます。

今回の改版でテンプレート本体は、より解り易く、利用し易くなりました。テンプレートを使うと、複数のサンプルソフトをそのまま流用した並列処理が簡単に実現できます。

テンプレートの特徴や仕様は、LPC111xテンプレートサイトを、使い方などはサイトのテンプレート関連情報を参照してください。

ARMコア制御の入門用として適しているLPC111xテンプレートとLPC1114評価ボードは、Cortex-M0の習得、プロトタイピング開発のお勧めキットです。

RTOSへの備え:最終回、FreeRTOSサンプルソフト

FreeRTOSの要点を第1回~第3回でなるべく簡潔に解説してきました。簡潔にし過ぎて部分的には不正確な記述もあります。

しかし、正確さに拘って記述すると分(文)量が増え、参考書の和訳になりかねません。ポイントとなる点をざっと掴んで、開発環境で試し、参考書やマニュアルなどで開発者自ら考える、これにより新しい技術を本当に身に付けることができます。私は、これを食物の消化に例えます。

これには、出だしでつまずかず、多少間違えてもスムースに学習を進めること(=先ずは食べること)が大切です。食べたものの消化には、時間が掛かります。後で振り返ると、内容や詳細が解るということはよくあります。

開発者への「開発スピードを上げよ」というプレッシャーは、益々強まります。この状況で技術を身に付けるには、効率的に頭の中の整理、これこそが消化、が必須です。

最良の解説書は、「サンプルソフト+評価ボード」

ソフト開発は、つまるところ、ソースコード+評価ボードによる開発環境に勝る解説書は無いと思います。ソースコードを読み理解するのに最低限必要な知識と、実際のマイコンで使えるFreeRTOSサンプルソフトを示す、これが今回のRTOS関連記事の目的です。

そこで、第3回のタスク間データ通知、同期、排他制御の自作サンプルソースや、NXPオリジナルのLチカサンプルに、より解りやすい日本語コメントを付加した第1回のLチカサンプルソースを弊社サイトのRTOSページで公開します。

このサンプルソフトを使えば、より具体的に、日本語コメント付きソースコードを参照しながらRTOS習得や理解ができます。評価ボードで動作が即確認できますので、出だしのつまずき回避にも有効です。

FreeRTOSのAPIは、多くのパラメタを含みます。パラメタを変えた時に、どのように動作が変わるかをサンプルソースに修正を加え、評価ホードで試すことができます。これは、結構重要です。食べ方を自分で変えて消化することに相当するからです。また、このパラメタ変化を事細かに記述する術は(多分)ありません。

しかし実際の開発では、この事細かな事柄を知っていないと、トラブルやバグ回避ができません。このことが「サンプルソフト+評価ボード」が最上の解説書とする理由です。

FreeRTOSサンプルソフト

FreeRTOSサンプルソフトは、NXP製LPCXpresso824-MAXで動作します。RTOSへの備え:第1回に予定していたLPCXpresso812/812-MAX、LPCXpresso1114/5の動作確認結果が下表です。

FreeRTOSサンプルソフト動作確認状況
FreeRTOSサンプルソフト動作確認状況

LPCXpresso824-MAXで動作するソースを使い、IO割付と使用LPCOpenライブラリのみを変更し、他評価ボードへ適用しました。LPCXpresso812は824-MAXと同様に動作しますが、LPCXpresso1114/5は、Lチカ以外の動作確認ができません。また、LPCXpresso824-MAXもMutexは、希望の動作をしません。代用として2個のセマフォを使って疑似的に実現しました(Mutex2)。MutexとLPCXpresso1114/5の動作NG原因は不明です。原因が判明しましたら、弊社サイトへ記載します。

以上のように出来が良くありませんので、LPCXpresso824-MAXのFreeRTOSサンプルソフトのみをサイトで公開いたしました。

当初目的の全ボードでのFreeRTOS動作確認は出来ていませんが、これも、(かなり無理があることは承知の上で)評価ボード検証のあかしと考えることにします(Orz)。

※動作しない原因がお判りの方は、info@happytech.jpへまで教えていただけると助かります。

PSoC 6続報

MONOist組み込み開発ニュースに、PSoC 6と他社製品との性能、消費電力の比較が掲載されています(出典:「業界最小」の消費電力でセキュリティも、サイプレスがIoT向け「PSoC」を投入)。

PSoC 6の目標

「ある程度のシステム制御ができる性能+低消費電力+セキュリティ、これらの同時実現」というPSoC 6の目標のために採用された40nmプロセス技術とデュアルARMコアにより、PSoC 6の他社比、優れた性能が解ります。

PSoC 6 Comparison Table1
PSoC 6 Comparison Table1(記事より)
PSoC 6 Comparison Table 2
PSoC 6 Comparison Table 2(記事より)

青字が性能同等、または、より優れた項目を示しています。PSoC 4でも採用中の高性能CapSenseやアナログコンポーネント、多くのGPIO数、そして100MHz動作のCortex-M0+、ピーク時257DMIPSなど、弊社ブログ対象の従来MCUの性能枠を大きく超えるものです。

1MB ROM、288KB RAM、8KB キャッシュの意味

ディアルコアで、1MB ROM、288KB RAM、8KB キャッシュものリソースを持つPSoC 6制御には、RTOSが必要になると思います。MCU開発も、よいよOS必須時代になるのでしょうか?

PSoC Creator News and InformationにNew FreeRTOS on PSoC 4 port が掲載されています(PSoC Creator 4.0のStart Pageからもアクセス可能)。弊社マイコンテンプレートで使ったCY8CKIT-042 評価ボードへも適用できそうです。ARMコアなので、mbed OS 5も気にはなりますが、FreeRTOSですので、RTOSへの備え記事が、理解に有効に活用できるでしょう。

弊社自作FreeRTOSサンプルソフト状況

RTOSへの備え記事は、LPCXpresso 824-MAXを使ってFreeRTOSサンプルソフトを自作しています(Lチカ、Q-通信、セマフォ同期、ミューティックス排他制御の4種)。

この自作サンプルを横展開してLPCXpresso 812/812-MAX、LPCXpresso 1114/5へ適用する予定でした。しかし、LPCXpresso 824-MAXで動作するサンプル(勿論GPIOとLPCOpenライブラリのみ変更)が、Lチカを除いて他の評価ボードでは動作確認ができないのが現状です。

原因が(僅か数十行の)自作サンプルにあるのか、それとも、それ以外かの見極めも、結構大変です。FreeRTOSもv9では、スタティックなセマフォ、ミューティックス割付ができるなど改良が進んでいるのでデバッグには良さそうですが、現状のv8は未だ非対応です。

LPCXpresso 824-MAX版だけでもFreeRTOSサンプルソフトを無償リリースするか、それとも、当初の予定どおり全評価ボード対応として問題解決後リリースするか3月末を目途に検討中です。

RTOSへの備え:第3回、タスク間データ通知、同期、排他制御

各タクスが独立=バラバラで動作する場合には、第2回に示したスケジューラーのRunningの切り替えのみでもRTOSを使ったマルチタスクとしては十分機能します。実際、LPCXpresso付属のfreertos_blinkyサンプルソフトを理解するには、第2回までの説明で十分です。

しかし、あるタクスの結果を待って別タクスが動作するような場合には、結果の待ちや通知、タクス間の同期が必要です。今回は、RTOSがどのようにこれらタクス間のデータ通知、同期を行っているかを解説します。

これらの技術を習得すれば、殆ど(7割以上)のソフト開発をFreeRTOSでカバーできるようになります。つまり、ここがRTOS習得の山場と言っても良いでしょう。少し量が多いのですが、ご勘弁を…。

初めに、状態遷移図のSuspendedによるタスク間の待ちや同期を行う仕組みを説明し、次に具体的な方法を説明します。

Suspendedの役目

第2回で示した状態遷移図のSuspendedが、タスクの待ちを実現します。

タスクAとタスクB間の通知や同期には、タスク実行中に別タスクの結果を待つことが必要となります。タスクAに待ちが発生した時は、vTaskSuspened()のAPIを使ってSuspendedへ移行し、タスクBの結果を受け取ると、RTOSがvTaskResume()のAPIを使ってタスクAをReadyへ戻します。Suspended中も第2回で示したBlocked同様、MCU能力を消費しませんので、待ち期間中も他のタスクがRunningすることができます。

以上がSuspendedによるタスクの待ちや同期を行う仕組みの簡単な説明です。Blockedと似ていることが解ると思います。違いは、BlockedがRunningからのみ遷移するのに対し、どの状態からでもSuspendedへ遷移できる点です。次にRTOSでの具体的な方法を示します。

FreeRTOSのタスク間データ通信、同期、排他制御の方法

RTOSを使わない通常ソフトの場合は、ユーザが定義するメモリ経由で、変数や結果の通知をユーザ自身が行います。また、割込みにより同期が可能です。弊社マイコンテンプレートもこの方法を使っています。

FreeRTOSを使うソフト開発の場合は、
タスク間のデータ通信は、           Queues:キュー、
タスク間の同期は、                      Semaphore:セマフォ、
タスク間の排他制御は、               Mutex(=mutual exclusion):ミューティックス、
を使います。

Queues:キューによるタスク間データ通信

FreeRTOSは、Operating SystemですのでMCU資源のユーザによる直接アクセスを嫌います。メモリなどの直接表現ではなく、論理的にメモリを繋げたQueues:キューという手段で、通信という方法によりタスク間データ送受信を行います。FreeRTOSのタスク間通信Queues:キューは、FIFO:First In First Outとして使います。

FreeRTOS Task Communication
FreeRTOS Task Communication

タスクAからタスクBへキュー経由でデータ通信する例です。受信タスクBは、xQueueReceive()でキューからのデータを受信します。このキューにデータが無い時のみSuspendedへ移行します。Suspended中は、キューデータ有無をRTOSが監視し、データが生じた時はタスクBのxQueueReceive()以降の処理が実行されます。

つまりタスクBは、xQueseReceive()の記述のみでデータ受信処理が実現できます。データ有無による待ち制御は全てRTOS側で行いますので、タスクBは受信処理のみの簡単記述ができます。

キューにより送受信タスクの処理は完全に分離されますが、処理結果のデータは、FIFOなので順序が保たれて通信されます。

Semaphore:セマフォによる同期

FreeRTOSのSemaphore:セマフォは、バイナリセマフォです。割込みによる同期を図示します。

FreeRTOS Semaphore
FreeRTOS Semaphore

割込み処理は、割込みハンドラーと割込みサービスルーティン:ISRの2つで構成します。割込み発生時、優先順位に応じてMCUハードウエアが自動的にCallするのが割込みハンドラー、実際の割込み処理を記述する部分がISRです。※図では、Interrupt!がハンドラー、TaskがISRです。

FreeRTOSの割込み同期は、ISRで割込み発生をxSemaphoreTake()で待ちます。割込み発生時、ハンドラーで割込みフラグクリアなどの処理後、xSemaphoreGiveFromISR()で動作許可(図赤丸)を与えます。この動作許可によりISRのxSemaphoreTake()以降の割り込み処理が実行されます。これが割込み同期の実現方法です。

ISR処理後、動作許可は消えます。再びハンドラーが動作許可を生成するまでISRはSuspendedになります。

Mutex:ミューティックスによる排他制御

FreeRTOSのMutex:ミューティックス排他制御を図示します。

FreeRTOS Mutex
FreeRTOS Mutex

ミューティックスの場合は、セマフォと異なり初めから動作許可(図赤丸)があります。この動作許可を初めにTakeしたタスクAのみが共有リソースへアクセスできます。タスクAのアクセス中は、動作許可がないタスクBはxSemaphoreTake()でSuspendedになります。タスクAのアクセス終了後、動作許可をxSemaphoreGive()で放棄するので、今度はタスクBが共有リソースへアクセスできます。これが排他制御の実現方法です。

つまり、動作の許可を示すバイナリセマフォを同期で使う時はセマフォ、排他制御で使う時はミューティックスと呼ぶだけで、使用するAPIは、どちらもxSemaphoreGive()とxSemaphoreTake()です。
違いは、セマフォ同期のvSemaphoreCreateBinary()では、初期値:動作許可が無いこと、ミューティックス排他制御のxSemaphoreCreateMutex()では、初期値:動作許可が有ることです。

まとめ

FreeRTOSのタスク間データ通信、同期、排他制御の方法を示しました。これら待ちの制御は、スケジューラーのタスク管理Suspendedが重要な役割を果たします。

データ通信は、Queue:キュー作成後、このキューへタスクからデータSend/Receiveという通信で実現します。同期と排他制御は、Semaphore:セマフォ作成後、このセマフォへタスクから動作許可Give/Takeにより実現します。

タスク側の記述は、データのキューSend/Receive、セマフォの動作許可Give/Takeという単純なFreeRTOSのAPIのみで良く、関係タスクの状況に応じて即Runningにするか、あるいはSuspended→Ready→Runningにするかの面倒な制御は、全てRTOS側が行います。従って、ユーザタスクは、必要処理の簡単記述ができます。

今回登場したFreeRTOSのAPIが以下です。

キューデータ通信:          xQueueCreate()、xQueueSend()、xQueueReceive()
セマフォ同期:                  xSemaphoreCreateBinary()、xSemaphoreGiveFromISR()、xSemaphoreTake()
ミューティックス排他制御:xSemaphoreCreateMutex()、xSemaphoreGive()、xSemaphoreTake()

上記と、第2回で示したFreeRTOSのAPIとを加えても20個弱のAPIでFreeRTOSが使えます。これらのAPIとFreeRTOSスケジューラーを理解していれば、FreeRTOS以外でも慌てずにRTOSソフト開発に着手できると思います。

最終回の次回は、ソースコード+評価ボードの開発環境に勝る解説書はない、という話をする予定です。

RTOSへの備え:第2回、タスク管理

RTOSが複数ユーザタクスの無限ループを回し、タクスの優先順位に応じてMCU実行時間を振り分けること、その利点を第1回で示しました。RTOSは、タスクを処理単位として扱います。今回は、RTOSがユーザタスクをどのように扱うかを解説します。タスク自身は既に出来上がったものと仮定します。

FreeRTOSによるユーザタスクの扱い方

ユーザタスクをFreeRTOSで処理してもらうには、最初にタスク登録が必要です。登録済みの複数タスクは、RTOSにより以下のように4つの状態で管理されます。

FreeRTOSへのタスク登録APIが、vTaskCreate()、登録済みタスクの削除APIがvTaskDelete()です。FreeRTOSは、優先順位の高いタスクをRunningにします。従って、登録後、タスクを即実行するのではなく、他タスクとの優先順位判定をReadyで行い、その結果で実行状態にします(図示の太線部分)。

FreeRTOS Task States
FreeRTOS Task States

優先順位は、登録APIのvTaskCreate()パラメタで指定できますが、デフォルトは全て同順位です。同順位タスクは、TICK_RATE(タスク切換え時間)単位に実行状態を切り替えるラウンドロビン方式です。実行後は、再びReadyに戻されます。

例えば2タスクのみが登録された場合、LPCXpresso824ボードなら2タスクを1ms毎に交互に切り替えながら実行します。ユーザ側からは、2つのタスクが並列動作したように見えます。これが最も簡単なRTOSマルチタスク処理の説明です。

デフォルト優先順位の変更に使うAPIがvTaskPrioritySet()、vTaskPriorityGet()です。更にReadyやRunningのタスクに対して、図示のAPIでSuspendedやBlockedへも遷移可能です。

これら制御を行うのがスケジューラー、スケジューラーが行う制御をタスク管理と呼びます。スケジューラーをRTOSカーネルと呼ぶこともあります。FreeRTOSスケジューラーは、4個の状態でタスクを管理しますが、数がもっと多いRTOSの例もあります。
※例えば、RL78用のRTOS:RI78V4は、6個の状態遷移を持ちます。

Blockedの役目

さてここで、第1回で示したLED点滅タスクの無限ループ内にあるvTaskDelay()を解説します。

vTaskDealy()は、タスクをBlockedへ遷移させます。そして設定時間の停止後、Readyへ戻します。つまりBlockedの間は、MCUを使わないため他タスクがRunningになりうるのです。これが、RTOSを使っても、各タスクに通常ソフトと同じように無限ループを記述できる非常に重要な仕組みです。

RTOSを使わない通常ソフト記述の場合、無限ループは、文字通りそのループ内に留まりMCU能力を使い続けます。しかしRTOSは、vTaskDelay()によりソース上は無限ループでも、MCUを使いません。これによりマルチタスク処理ができるのです。

RTOSにより再びRunningに戻ったタスクは、vTaskDealy()の後の処理から実行されます。タスク側からは、指定時間の停止後に継続して実行しているように見えます。

スケジューラーの状態遷移図は、ユーザタスク側からみた状態です。Running以外はMCUを使わないNot Running (super state)ですが、スケジューラー自身のために(ほんの少し!)MCUを使います。このスケジューラーを起動するAPIが、RTOSのmain()最後にあるvTaskStartScheduler()です。

スケジューラー自身は、実は最高プライオリティを持つタスクです。従ってユーザタスクよりも優先的に処理されますが、実態はユーザタスクと変わりません。

まとめ

今回はRTOSのタスク管理を説明しました。スケジューラーの優先順位判定により複数のタスクRunningが切り替わりマルチタスクを実現すること、BlockedによりRTOSでのタスク記述に通常ソフト記述と同様の無限ループを使えることを示しました。

この回までに登場したFreeRTOSのAPIが下記です。FreeRTOS APIレファレンスマニュアルで詳細が解ります。
vTaskCreate()、vTaskDelete()、uxTaskPriorityGet()、 vTaskPrioritySet()、vTaskDelay()、vTaskStartScheduler()、
vTaskSuspend()、 vTaskResume()。
vTaskSuspend()、 vTaskResume()の2つは、次回解説予定。

RTOSへの備え:第1回、RTOSの必要性

IoT MCUのソフト開発は、RTOS:Real Time Operation Systemが必要になると思います。IoT向けでない通常のMCU開発でも通信UART制御は鬼門です。IoT MCUの通信プロトコルが何に決まるかは今のところ不透明ですが、UARTに比べて複雑な通信処理になることは明らかです。

この対策として、IoT向けMCUのRTOSを数回に分けて解説していきます。連載記事を読めば、RTOSが理解でき、いざIoT MCUで実際にRTOSを使わなければならなくなった時にも慌てずに対処することができます。

背景

本ブログは、IoT向けMCUのRTOS、FreeRTOSmbed OS 5を記載してきました。これらRTOS関連の資料は、少なからずあります。しかし、1から10まで書いている教科書的な内容で、参考書としては優れていますが、残業時間の制限が厳しい昨今、実務的にはもっと効率的に習得したいのが本音です。

そこで、最低限のRTOS知識とMCU評価ボードを使って、手っ取り早くお金をかけずにRTOSを習得することを目標とします。この目標に沿ってブログ記事を作成します。このための開発環境が下記です。

使用RTOS:FreeRTOS(NXPのIDE:LPCXpresso無料版に付属)
MCU評価ボード:NXP LPCXpresso812またはLPCXpresso812/824-MAXまたはLPCXpresso1114/5
※記事ではFreeRTOS v8.0.1、LPCXpresso v8.2.2、LPCOpen v2.19(いずれも2017年2月最新のLPCXpresso無償版に付属)とLPCxpresso824-MAXを使います。
FreeRTOS Documentationにある“Mastering the FreeRTOS Real Time Kernel – a Hands On Tutorial Guide”が参考書としてお勧めです。

MCUのLPC812/824、LPC1114/5で動作するFreeRTOSがポーティング済みで、かつ秋月電子などで低価格で入手性が良いMCU評価ボードで動作確認できることが選定理由です。

LPCXpresso824-MAX
LPCXpresso824-MAX

因みに、LPCXpresso812/1114/1115評価ボードで動作する弊社マイコンテンプレートも販売中です。このマイコンテンプレートによる従来ソフト開発と、FreeRTOSによるソフト開発の違いなどでRTOSの特徴を浮き彫りにします。

RTOSの必要性

評価ボード実装済みのLEDを点滅させるいわゆる「Lチカ」サンプルソフトを、FreeRTOS利用時のソースの一部(左側)と、RTOS未使用の通常ソフト記述(右側)を示します。最大の違いは、無限ループの数です。

RTOS LED sample
RTOS LED sample(2タスクのみ抜粋)

FreeRTOS記述の場合、1個のタクス(≒ユーザ処理単位)で1個の無限ループを持ちます。一方、通常ソフト記述の場合は、全体で1個の無限ループのみです。1個の無限ループ内で様々なユーザ処理を行うため、ループ内の1処理時間の長さ、短さ、待ちがその他の処理へ影響を与えます。

RTOSを使う最大の利点は、1つのタクス実行時間の影響が、他のタクスへ及ばないことです。

このおかげで、あたかも1つのMCUを占有するかのようにユーザタスク記述ができます。従って、1個のタクスが、1個の無限ループを持つのです。複数のタクスへ優先順位に応じて実行時間を振り分けるのは、RTOSの役目です。

ユーザタクスは、他のタクスのことを気にせずに記述できるため、シンプルな処理になりタクス単位の可搬性も向上します。

RTOSでのユーザタクス記述は、通常ソフト記述と何ら変わることはありません。1無限ループ内にシンプルな処理を記述すれば良いのです。ただし、RTOS利用のオーバーヘッドとして、タクスの登録や優先順位の設定は別途必要となります。

要はRTOS APIを追加するだけ!

RTOSのLチカサンプルソースは、FreeRTOS APIとLPCXpresso API、残りがC言語の3構成です。

LPCXpresso APIとC言語は、通常ソフト記述時に使うものと同じです。FreeRTOS APIは、APIの頭に必ずx…、v…、ux…などが付いています。これらの接頭語は、FreeRTOS以外のRTOSでも同様です。RTOSユーザタスクの記述は、通常ソフトの記述に、これらRTOS APIが加わったのみです。

従ってFreeRTOS APIの使い方を理解すれば、FreeRTOSに限らず他のRTOSへも応用可能です。使用頻度が高いFreeRTOS APIの使い方を習得すれば、基本的なRTOSユーザタスク開発ができると思います。この方法でIoT MCUにRTOSが適用された時でも、慌てずに備えることができます。

まとめ

今回は、RTOSの利点を説明しました。RTOSが複数ユーザタスクの優先順位に応じてMCU実行時間を振り分けるので、個々のユーザタスクはシンプルで可搬性に優れた記述ができます。

IoT MCUの通信処理はUARTに比べ複雑です。この複雑さは、再送データ数や外来ノイズなどの通信環境により様々に変化します。RTOS無しの通常ソフトでこれらに対応するには複雑すぎると思います。

この対応には、RTOSが期待できます。しかし、RTOS習得には初期段階で手間と時間が掛かるため、実務的で手軽に習得できると筆者が思う1習得方法を示しました。

今後も、FreeRTOSのポイントをできるだけ簡潔に説明していきます。詳しく知りたい方は、お勧め参考書などを参照してください。

NXPの新統合開発環境MCUXpresso

LPCマイコンとKinetisマイコンの2つを同時サポートする新しい統合開発環境(以下IDE)、MCUXpressoが2017年3月リリースに向けて開発中です。

LPCXpressoとKinetis Design StudioをMCUXpressoに一本化

Freescaleを買収したNXPのLPCマイコンにはLPCXpresso、旧FreescaleのKinetisマイコンにはKinetis Design Studio(以下KDS)が、それぞれの開発用IDEとして提供されてきました。どちらもEclipseベースのIDEなので、いつかは一本化されると思っていました。

新しいMCUXpressoのサポートマイコンリストは、コチラからダウンロードできます(ログイン必須)。Product Familyでフィルター操作をすると、下例のようにお使いのMCUの詳しい状況が判ります。

LPC1114/5 Support状況
LPC1114/5 Support状況

本ブログ対象のLPC1114/5とKinetis K/Lは、2017年3月にサポートされる予定です。

MCUXpressoもEclipseベースIDEで、無料版でもコードサイズ制限なしで使えるなど、数々の嬉しい特徴を備えています。LPCXpressoとKDSの最も異なる部分、API生成/提供方法がMCUXpressoでどのようになるかは、今のところ不明です。

IDEのAPI生成/提供方法

マイコンテンプレート使用中IDEのAPI生成/提供方法をまとめました。現状は3種類です。

API生成/提供方法
API生成/提供方法 概要 使用IDE
別ライブラリ IDEに別途APIライブラリを追加し利用 NXP:LPCXpresso(LPCOpen)
API生成ツール IDEで周辺回路を設定しAPI生成 Freescale:KDS

ルネサス:コード生成

SCH生成ツール IDE回路図で周辺回路を設定しAPI生成 Cypress:PSoC Creator

API生成ツールを使う方法は、周辺回路の知識が豊富でないと設定しにくいので、SCH生成ツールのCypress:PSoC方式が、動作イメージが把握し易く使い勝手が良いと個人的には思います。また、シンプルなのは、別ライブラリ提供のNXP:LPCXpresso方式ですが、MCUXpressoがこの方式になる可能性は、KDS統合も考えると少ないと思います。

いずれにしても来年は、この新しいMCUXpressoでNXPとFreescaleのマイコンテンプレートを、6月末を目途に作り直す予定です。興味がある方はすぐに現状マイコンテンプレートを購入されても、ご購入後1年以内のテンプレート更新は無償で行いますのでご安心ください。

米Qualcomm、NXPを300億ドルで買収か?

2015年、Freescaleを買収したNXPを、スマートフォンで有名なクアルコムが300億ドル以上で買収するかもしれないというニュースが飛び込んできました。

記事によると、買収目的は、スマホ市場の成長が停滞しつつあるので、組込と車載市場へ参入することで、買収が成立すれば、半導体業界史上、最大規模のM&Aになるそうです。

クアルコム製品でスマホによく用いられているSnapdragonを使ったシングルボードコンピュータ:SBCは、チップワンストップのコチラで参照できます。

個人的観測ですが、このところNXPに限らずマイコンベンダーの新製品開発が鈍っている気がします。IoT無線規格の見極めや、Eclipse Neon対応かなと思ってきましたが、業界再編の可能性も影響しているかもしれません。

新生NXPマイコンラインアップ

NXPがFreescaleを買収後、新生NXPのARMコアMCU製品ラインアップが一目で解る図を見つけたので掲載します。
出典は、組込みシステム向けコンテンツ・プロバイダ)インスケイプ様のマガジンVOLUME.13:「さらなる高みへ。新生NXPのマイコン戦略に迫る MCU約1,100ラインアップ。シナジー効果の最大化へ」です。

NXP+FreescaleのARM Cortex MCUラインアップ

NXPサイトは、NXPのLPCマイコンと旧FreescaleのKinetisマイコンがそれぞれ別ページで示されるので、経営統合後のARM Cortex MCU製品ラインアップが分かりにくいのが現状です。

既存ユーザにはページ分離記載で問題ないでしょうが、以前記載した今後を予想するには、下図が解りやすいと思います。

NXP ARM Cortex MCU Lineup
NXP ARM Cortex MCU Lineup(記事より抜粋)

左側の汎用MCUでは、Cortex-M0/M0+でLPC800、LPC1100/1200とKinetis Lシリーズが競合しています。IDEも、それぞれのMCU対応にLPCXpressoとKinetis Design Studioの2種を提供中です。
一方、右側の特定用途MCUでは、Kinetisシリーズにより製品補完がされたことが解ります。

出典記事に、各MCUの詳しい特徴が解りやすく記載されております。

統合により、NXPは、ARMコア提供数は(恐らく)世界最大で、MCUコアのデファクトスタンダードCortex MCUのリーダーです。今後の動向が気になります。

CortexーM0/M0+対応マイコンテンプレート

弊社は、コスト重視で8/16ビット市場の置換えを狙う32ビットMCUコアCortex-M0/M0+を使ったLPC8xx、LPC111x、Kinetis Eに対してマイコンテンプレートを販売中です。動向によっては、このラインアップも変わるかもしれません。

※Kinetis Lシリーズは、Kinetis Eとソフト、ピン互換性があります。Kinteis EテンプレートのLシリーズへの適用は、弊社へお問合せください。

NXPとCypress動向

NXPは2015年にFreescale、Cypressは2014年にSpansionを買収しました。買収後のNXPとCypressのマイコンラインアップがどう変わるかが気になります。
日経テクノロジーOnlineで両社のマイコン新製品と今後の開発動向に関する記事がありましたので、要点をリストアップしました。

NXP: LPCとKinetisを徐々に統合

“新生NXP初のマイコン、旧NXP系で低消費電力がウリモノ” 2016/02/24より

  • NXPのマイコンシェア、車載MCUは世界第2位、車載を除くMCUは世界第1位
  • LPCマイコンと(旧Freescale)Kinetisマイコンは、徐々に統合(Geoff Lee氏談)
  • 新製品は、NXP系のLPC54000シリーズ(Cortex-M4FでコプロセサにCortex-M0+搭載可)

弊社マイコンテンプレートで使った、NXPのLPC8xx/LPC111xと旧FreescaleのKinties Eも現在NXPから全て供給中ですが、統合される可能性があることが解ります。

Cypress: PSoC 4へCortex-M0+コアを採用

“FMマイコンもPSoCも同じツールで開発、Cypressがアルファ版をデモ” 2016/02/29より

  • 新製品PSoC 4 Sは旧Spansionライセンス取得のCortex-M0+を採用。今後新開発PSoC 4もM0+を使う
  • PSoC 4 S搭載の第4世代CapSenceは、第3世代比、雑音耐性向上と低電力化
  • PSoC 4 S Pioneer Kit ($49)、PSoC 4 S Prototyping Kit ($10)発売
  • PSoC CreatorでFM0+マイコン(旧Spansion)も開発できるよう強化中

Cortex-M0+とM0を比較すれば、M0+が優れているので、新開発のPSoC 4系にM0+を採用するのは理解できます。
数あるマイコンIDEの中で私が最も使いやすいと評価するPSoC Creatorですが、PSoC 4とFM0+はアーキテクチャが異なり、さらにPSoC 4系にM0+が採用されれば、ますますFM0+を使う機会は減ると思います。
通常のマイコンソフト開発では、M0+とM0を区別することも少ないので、Creator強化は静観したいと思います。