「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
ARMマイコンは広い分野に対応しており、半導体市場で高いシェアを誇っています。特にスマホに搭載されている半導体のシェアは9割超と圧倒的です。その中でCortexシリーズは、従来のARMナンバリングを捨てて新シリーズ化したものとなっており、Cortex-A、Cortex-R、Cortex-Mのラインナップがあります。(ちなみにARMの名称はこのラインナップ部分に残しています)
Cortexシリーズの中でもCortex-Aは高性能のアプリケーションプラットフォーム用に設計されております。今回、Cortex-A9を立ち上げることに携わりましたので、こちらに関して簡単ではありますが紹介させていただきます。
Cortex-A9の特徴として主に以下があります。
今回、私が携わった立ち上げの開発環境はCPUがルネサス製RZ/A1M、開発統合環境はルネサス製e² studioになります。
RZ/A1MはCPUにCortex-A9を搭載しております。
特徴として、
があります。
e² studioは"Eclipse"をベースとしており、特徴として、
があります。
また、e² studioインストールの際にRZシリーズに必要なコンパイラパッケージを追加コンポーネントとして、一緒にインストールすることができます。(※2) (図1〜3参照)コンパイラパッケージは最新でなければいけない、などの制約がない限りは、e² studioをインストールする手順の中でRZシリーズ開発に必要なPC環境を整えることができます。
図1. e² studioインストール画面 ファミリー選択画面
図2. e² studioインストール画面 追加コンポーネント選択画面
図3. e² studioインストール画面 追加ソフトウェア選択画面
Cortex-A9の特徴で「動作モード毎に一部レジスタを保持しており、自動的に切り替わる」と説明しましたが、同じレジスタをリードしても動作モードが異なれば読み取る値は異なる、ということになります。例外処理における動作モードの扱いは、
となっております。動作モードを戻すと、lrレジスタ、SPSRの内容も切り替わるため、例外発生時に保管されたlrレジスタ、SPSRの内容を事前に抜き取っておく必要があります。
例えば、 「スーパーバイザモードで動作しているところにIRQ割込みが入った場合」
動作モードはスーパーバイザモードからIRQモードに自動的に切り替わり、戻り値、CPSRの内容はそれぞれIRQモードのlrレジスタ、SPSRに保管されます。IRQ割込み処理から戻る際の動作モードは、割込み処理から抜ける前に設定を行っておく必要があるため、割込みハンドラ内でIRQモードからスーパーバイザモードに戻す必要があります。スーパーバイザモードに切り替えた際に、lrレジスタ、SPSRの内容はスーパーバイザモードで保持していた内容に自動的に切り替わるため、IRQモードのlrレジスタ、SPSRの内容を動作モード切替前にスタックしておき、動作モードを切り替えた後、lrレジスタ、SPSRに反映させておく必要があります。(図4〜7参照)
実際にこのことを意識する必要がある場面は例外ハンドラの実装時になります。特に、IRQ割込みは組み込みソフトでほぼ確実に実装すると思われる例外処理なので、IRQ割込みハンドラを実装する際には、IRQモードのlrレジスタから戻り値を確保しておくことを意識する必要があります。ARMマイコンは書籍やインターネットを始め、プログラムサンプルなど参考にできるものが多くあるため、そちらも参考にするとよいと思います。
図4. IRQ割込み発生時のlrレジスタ
図5. IRQ割込み発生時のlrレジスタ操作
図6. IRQ割込み発生時のCPSR、SPSR動作
図7. IRQ割込み発生時のCPSR、SPSR基本操作
SPSRを操作する際にも注意が必要です。
SPSRは32ビットからなり、8ビット毎に以下のフィールドを有してます。
SPSRを操作する際には上記のフィールドを指定する必要があり、全体を操作する場合には、
と記載します。この操作の際に、
という記載自体は行うことができますが、この場合の実際の動作は
となり、SPSRのbit31〜24、7〜0しかライトされません。SPSRは初期値が不定となっており、このまま例外から復帰した場合、SPSRのbit23〜8は不定初期値のままなので、CPSRが意図しない設定となってしまいます。
実際に割込みハンドラの実装で「MRS SPSR, R1」という記載を行ってしまい、CPSRのbit9で設定されるエンディアン形式が意図せず変更されてしまったケースがありました。エンディアン形式が変更したことによって、次回のロード命令でリードしたアドレスが不正になってしまい、最終的にデータアボート例外となってしまいました。SPSR初期値は不定であるため、毎回発生するわけではなかったことで原因の特定にも時間が掛かってしまいました。SPSRを設定するのだからSPSRと記載するものだ、という思い込みによって、この失敗が発生してしまいました。レジスタ設定時の記載はレジスタ名そのままとは限らない、ということを注意いただけたらと思います。
キャッシュ、MMUを使用することにより高いパフォーマンスを発揮することができますが、使用しない場合はパフォーマンスが落ちてしまい、タイマ周期割込みを行うと処理のほとんどを周期割込みに費やされてします。キャッシュ、MMUは使用する前提で立ち上げの検討を行う必要があります。
今回RZ/A1Mのルネサスマニュアルをメインに確認しましたが、立ち上げに必要な情報としてARMのマニュアルも読み込む必要があります。例えば、先ほど紹介したCPSR、SPSRについてはARMのマニュアルのみに記載されております。また、ARMのマニュアルは機能ごとになっているため、1つのCPUを立ち上げるために多くのマニュアルが必要となる場合もあります。
Cortex-A9を始めとしたARMマイコンを立ち上げる際に注意する点を簡単ですが説明させていただきました。
ARMマイコンは多くのマニュアルが存在し、それ以外にも様々なサンプルや技術共有、質問掲示板などがあります。弊社で立ち上げた際にもマニュアルはもちろんのことサンプル、掲示板等を参考にして問題が解決したものもあります。今回のソフテックだよりもその役割を少しでも担えれば幸いです。
(T.M.)
関連ページへのリンク
関連するソフテックだより