パート 1:はじめに、新しいC11言語サポートと大幅なMPU(メモリ保護ユニット)のアップデートについて説明します。これらの機能強化は、堅牢な組込みシステムに不可欠な要素であるデータの整合性とメモリセキュリティを確保するために極めて重要です。
パート2:次に、ハードウェア除算器の追加、長分岐命令、より効率的なMOV操作など、Cortex-M0/M0+のパフォーマンス改善に焦点を当てます。これらのアップデートにより、低消費電力を維持しながら、開発者はパフォーマンスの優位性を確保できます。
パート 3:最後に、セキュリティの改善について詳しくみていきます。組込みデバイスがネットワークに接続されることが増えているため、脅威からシステムを保護するには、TrustZoneテクノロジーとスタック保護が不可欠になっています。これらの機能がセキュリティをどのように強化するのかを解説します。
近年のマイコン選定で重要視されるポイントとは?
ここ10数年でCortex-Mマイコンが広く普及して来てきました。組込みマイコンとしてのCortex-Mの特徴は何だったか?と考えるといくつかのポイントを上げることができます。
低消費電力
Arm社のCPUはもともと携帯機器(携帯電話、携帯ゲーム機)など低消費電力が求められる場所で使用されました。Cortex-Mの前の世代のコアになりますが、ゲームボーイアドバンスやDSなどにも使用されましたし、ガラ携と呼ばれた携帯電話でも使用されていました。そのため、多くの方が知らないうちにArm社のCPUコアを使ったことがあると思います。
幅広いラインナップ
現在普及しているCortex-Mシリーズでは、Cortex-M0+, Cortex-M3,Cortex-M4, Cortex-M7などのCPUがそろえられており、CPUクロックでいうと数十MHzから数百MHzという幅広い性能レンジでサポートしています。近年では、より高い性能を実現するためにマルチコアのマイコンも増えています。この幅広いラインアップのため組込みシステムに応じて選択することができます。
標準マイコン
Arm社はCPUの設計・開発はしますが、チップとしての製造などはしません。半導体ベンダが設計データを購入し、チップとして販売をしています。さまざまな会社がArm社のCPUを採用しているため、異なった半導体ベンダのマイコンでも同一のCPUが利用できるというメリットがあります。このメリットから現在、Arm社のCPUは標準マイコンとしての位置を確立したと思います。技術的にはCortex-Mでは割込みコント―ラも標準化し、そこにタイマも組込み、アドレス空間なども標準を定義したため、命令セットが同じでだけでなく、より多くのソフトウェアを再利用することが容易になりました。たとえば、RTOSのカーネルなどは共通化することが可能となりました。
さらに命令セットも互換性を持ちながら拡張していることで、Cortex-M0+のソフトを、上位のCortex-M3/M4/M7などで実行することが出来ます。コロナ下での半導体不足あるいはEOL(End of Line,ディスコンなどともいう)などで、これまで使ってきたマイコンが使えなくなることがありましたが、標準マイコンを使う事でマイコンの変更などが行いやすくなります。そのため、最近はマイコン設定の際に「標準マイコンを採用」という点を考慮するケースが増えてきているように思います。
開発環境の統一
Cortex-Mが標準マイコンとなることでマイコンというハードウェアだけでなく、開発環境の統一をすることが可能となりました。過去では、組込みソフトウェアの開発ではマイコンが変わると開発環境を変えることが普通でした。それがCortex-Mマイコンを採用することで、開発環境が継続して使えることが可能となってきました。
開発環境としてはコンパイラ、アセンブラ、リンカというソフトウェアだけでなく、ハードウェアデバッガも継続して使用できます。これらは開発者が日頃使うツールであり統一できることで新しいツールの使い方などを覚え直す必要などがないことがメリットになっています。
もちろん、半導体ベンダからは各社の開発環境も提供されていますが、そうしたものは各社のマイコンに特化したものが多くなります。しかし、IAR Embedded Workbench for ARM(以後、EWARM)を使えば、各社のマイコンを継続して使用する事が可能です。具体的には、EWARMでは9,200を超えるデバイスを対応し、8,400を超えるサンプルなどもご利用いただくことができます。
Armv8-Mの登場
現在、Cortex-MシリーズにはさまざまなCPUコアがリリースされていますが、市場の要求により進化しています。現在、普及しているのは、Cortex-M0/M0+, Cortex-M3/M4/M7です。Cortex-Mシリーズで一番最初にリリースされたCortex-M3もすでに20年超えてきていることから、今後新しいアーキテクチャのCPUコアに移行をしていくことになります。
CPUコア |
アーキテクチャ |
Cortex-M0 |
Armv6-M |
Cortex-M0+ |
Armv6-M |
Cortex-M3 |
Armv7-M |
Cortex-M4 |
Armv7E-M |
Cortex-M7 |
Armv7E-M |
Cortex-M23 |
Armv8-M Baseline |
Cortex-M33 |
Armv8-M Mainline |
簡単にいうと、Cortex-M0/M0+の置き換えがArmv8-M BaselineのCortex-M23, Cortex-M3/M4の置き換えがArmv8-M MainlineのCortex-M33となります。このArmv8-Mの特徴は、これまでのArmv6-MやArmv7-Mの機能を継承しつつも、市場要求により機能が追加されたことです。これまでのCortex-M0/M0+/M3/M4/M7のソフトウェア資産を継承しながらも新しい機能が追加されました。
Armv8-Mの主なアップデート
今回は、C11言語規格とMPUアップデートのサポートに焦点を当てます。
- C11のサポート:Cプログラミング言語の最新バージョンであるC11では、排他制御の管理を支援するマルチスレッドや_Atomic型修飾子などの新機能が追加されています。これにより、メモリへのアクセスが安全かつ秩序ある方法で処理されることが保証されます。これらのC11の機能に対応するため、Armv8-Mではロード・アキューイットおよびストア・リリース命令が導入され、組込みシステム向けのより堅牢なメモリ処理機能が提供されます。
- MPUのアップデート:Armv8-Mのメモリ保護ユニット(MPU)もまた、重要なアップグレードです。以前のCortex-Mバージョンでは、MPUの柔軟性は限られていましたが、Armv8-Mでは、開発者は読み取り/書き込み権限やキャッシュ設定などのメモリ属性をより詳細に制御できるようになりました。さらに、TrustZoneのサポートにより、MPUはセキュアと非セキュアの2つの構成が可能となり、最新の組込みシステムのセキュリティがさらに強化されます。
C言語の新しい規格:C11への対応
次の新機能はArmv8-M全体(Cortex-M23やCortex-M33など)に対応するものになります。皆さんは、C言語はこれまでC90, C99, C11,C18というように進化していることはご存じでしょうか?C11ではマルチスレッドのサポートが追加されました(C++11も同様の機能が追加されています)。そのC11では_Atomic型修飾子が追加されました。これは排他制御(アトミックアクセス)を扱うものです。排他制御を実現するにはハードウェアの支援が望ましいとのことで、Armv8-MではLoad acquire, store release命令が追加されました。一般的なロードストア命令はメモリアクセスするためのものですが、さらに機能を追加したものになります。
この命令はアクセスデータごとに用意されておりLDA(32ビット), LDAB(8ビット),LDAH(16ビット)、STL(32ビット),STLB(8ビット),STLH(16ビット)が用意されています。アクセスサイズが32ビットのLDAとSTLで説明をします。 LDAはメモリから読み出しレジスタに値をセットし、STLはレジスタ値をメモリに書き込む命令です。
LDAはそれ以前のメモリアクセスが完了されることを保証し、それ以降のメモリアクセスがプログラム順に実行されるという制限が入ります。それに対してSTL命令以降はその制限が解除されます。参考文献[1]のFigure 2-6を以下に引用します。LDA命令とSTL命令を使ってクリティカルセクションを保護するために使用されています。
さらに、排他アクセスを実施するLDAEX(32ビット), LDAEXB(8ビット, LDAEXH(16ビット)、 STLEX(32ビット),STLEXB(8ビット),STLEXH(16ビット)が用意されました。
LDAEXとSTLEXで説明をします。LDAEXはメモリから読み出しレジスタに値をセットし、STLEXで同じアドレスに書き込むときにLDAEXをしたときからメモリ値が変更されていた場合には、書き込みを失敗し、コードにて再度読み出しから始めます。以下の例で見てみます。C11のプログラムでは変数aiに対して_Atomic型修飾子を付けて宣言しました。これにより変数aiのアクセスはアトミックアクセスとなります。Cortex-M23/M33ではLDAEX命令でメモリの値を読み出し、加算した結果をSTLEXで書き込みを実施しますが、STLEXの実行結果としてR3がゼロでない場合には、再度ロードLDAEXをやり直すコードとなります。それに対して、Armv7-Mでは、LDAEX命令に対してLDREX命令+DMB命令、STLEX命令に対してSTREX命令+DMB命令を組み合わせて実現しています。このDMB命令はバリアとなり、この命令の前のメモリアクセス命令が、DMB命令の後のメモリアクセスの前に実行されることを保証します。
MPUの更新
これまでのCortex-Mの進化では過去との互換性が保たれることが多かったのですが、Armv8-MのMPUは互換性が無くなったという点で重要なポイントとなります。MPU(Memory Protection Unit)では、各メモリ領域のRead/Write属性、共有属性、実行属性、キャッシュ設定、メモリタイプなどを設定することが出来ます。
たとえば、メモリタイプがArmv7-MのNormal, Device, Strongly Orderの3つがあったのですが、Armv8-MではNormal,Deviceの2つになりました。その代わりにArmv8-MのDeviceでは、Gathering(G),Reordering(R), Early Write Acknowledgement(E)の属性が追加されました。
また、Armv7-MではMPUの領域指定がこれまでサイズが2のべき乗と言う制限があったのですが、指定方法が変わったことで比較的自由に領域指定ができるようになりました。2のべき乗と言う制限が無くったことで、領域のオーバーラップができなくなりました。8個に分割して管理するサブリージョンも廃止されました。
セキュリティ拡張(TrustZone対応)をしたものでは、Secure/NonSecureで2つのMPUコンフィグレーションを持つことが可能です。Cortex-Mは互換性良く作られている事が多く、昔のソフトは新しいコアでそのまま動かせることが多いですが、MPUは全く互換性がないのでコアを変更する場合に注意が必要です。
EWARMでArmv8-Mへの移行をスムーズに!
組込みシステムがより複雑になるにつれ、Armv8-Mのような強力で柔軟なアーキテクチャのニーズが高まっています。C11サポートとMPUのアップデートにより、Cortex-M23とCortex-M33は、IoTから産業用オートメーションまで、最新の組込みアプリケーションの要求に対応するのに最適な位置づけにあります。IAR Embedded Workbench for ARMはCortex-Mファミリー全般をサポートしており、Armv8-Mへの移行を容易にする統一開発環境を提供しています。
次回の記事では、Cortex-M0/M0+のパフォーマンス向上について詳しくみていき、ハードウェア分割、新しい命令、その他の機能が組込みシステムのパフォーマンスの限界をどのように押し広げているかを検証します。
本シリーズのそのほかの記事はこちら
TrustZoneの深層にせまる:組み込みシステムのセキュリティ強化
参考文献
[1] ARM Cortex-M for Beginners An overview of the ARM Cortex-M processor family and comparison
[2] Armv8-M Memory Model and Memory Protection Version 1.1 User Guide