HOME > ソフテックだより > 第337号(2019年9月4日発行) 技術レポート「ARMマイコンCortex-A9の立ち上げ」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第337号(2019年9月4日発行)
技術レポート

「ARMマイコンCortex-A9の立ち上げ」

1. はじめに

ARMマイコンは広い分野に対応しており、半導体市場で高いシェアを誇っています。特にスマホに搭載されている半導体のシェアは9割超と圧倒的です。その中でCortexシリーズは、従来のARMナンバリングを捨てて新シリーズ化したものとなっており、Cortex-A、Cortex-R、Cortex-Mのラインナップがあります。(ちなみにARMの名称はこのラインナップ部分に残しています)
Cortexシリーズの中でもCortex-Aは高性能のアプリケーションプラットフォーム用に設計されております。今回、Cortex-A9を立ち上げることに携わりましたので、こちらに関して簡単ではありますが紹介させていただきます。

2. Cortex-A9の特徴

Cortex-A9の特徴として主に以下があります。

  • ”スタックポインタ(sp)”、”戻り値(lr)”を格納するレジスタ、SPSR(※1)は動作モード毎に存在し、自動的に切り替わる
    動作モードは以下7つからなります
    - ユーザモード
    - スーパーバイザ(SVC)モード
    - システムモード
    - FIQザモード
    - IRQモード
    - アボートモード
    - 未定義モード
  • ロードストアアーキテクチャ(レジスタ間で演算を行う)
  • 分岐予測とリターンスタック
  • MMUによる高いメモリアクセス効率
  • 消費電力と性能のバランス ・プログラム動作中に動的にエンディアン変換を行うことが可能

3. 開発環境

今回、私が携わった立ち上げの開発環境はCPUがルネサス製RZ/A1M、開発統合環境はルネサス製e² studioになります。

3.1 RZ/A1M

RZ/A1MはCPUにCortex-A9を搭載しております。
特徴として、

  • 内蔵RAMを5MB搭載し、外付けSDRAMなしでWSVGA(1024×600)サイズ2画面分またはWXGA(1280×800)サイズ1画面分の画像表示に必要な画像情報を記録可能
  • 動作周波数400MHzの高速動作によりシステムの高性能・高機能化に対応

があります。

3.2 e² studio

e² studioは"Eclipse"をベースとしており、特徴として、

  • すべての開発プロセスを統合開発環境e² studio一つで実行可能
  • ルネサス製CPUに特化したプロジェクト生成、コード生成が容易
  • Eclipseベースの高い拡張性

があります。

また、e² studioインストールの際にRZシリーズに必要なコンパイラパッケージを追加コンポーネントとして、一緒にインストールすることができます。(※2) (図1〜3参照)コンパイラパッケージは最新でなければいけない、などの制約がない限りは、e² studioをインストールする手順の中でRZシリーズ開発に必要なPC環境を整えることができます。

e² studioインストール画面 ファミリー選択画面
図1. e² studioインストール画面 ファミリー選択画面

e² studioインストール画面 追加コンポーネント選択画面
図2. e² studioインストール画面 追加コンポーネント選択画面

e² studioインストール画面 追加ソフトウェア選択画面
図3. e² studioインストール画面 追加ソフトウェア選択画面

4. 立ち上げ時におけるポイント、注意点など

4.1 動作モード毎のレジスタを意識する

Cortex-A9の特徴で「動作モード毎に一部レジスタを保持しており、自動的に切り替わる」と説明しましたが、同じレジスタをリードしても動作モードが異なれば読み取る値は異なる、ということになります。例外処理における動作モードの扱いは、

  • 例外発生時に動作モードは該当するモードに自動的に切り替わる。その際にlrレジスタ、SPSRの内容は切り替わった動作モードのレジスタに保管される
  • 例外処理を抜けた後の動作モードは例外処理を抜ける前に手動で設定する必要がある

となっております。動作モードを戻すと、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マイコンは書籍やインターネットを始め、プログラムサンプルなど参考にできるものが多くあるため、そちらも参考にするとよいと思います。

IRQ割込み発生時のlrレジスタ
図4. IRQ割込み発生時のlrレジスタ

IRQ割込み発生時のlrレジスタ操作
図5. IRQ割込み発生時のlrレジスタ操作

IRQ割込み発生時のCPSR、SPSR動作
図6. IRQ割込み発生時のCPSR、SPSR動作

IRQ割込み発生時のCPSR、SPSR基本操作
図7. IRQ割込み発生時のCPSR、SPSR基本操作

4.2 SPSRのビットフィールドを意識する

SPSRを操作する際にも注意が必要です。
SPSRは32ビットからなり、8ビット毎に以下のフィールドを有してます。

C:制御フィールドマスクバイト(bit7〜0)
X:拡張フィールドマスクバイト(bit15〜8)
S:ステータスフィールドマスクバイト(bit23〜16)
F:フラグフィールドマスクバイト(bit31〜24)

SPSRを操作する際には上記のフィールドを指定する必要があり、全体を操作する場合には、

MRS SPSR_CXSF, R1(※レジスタ1の内容をSPSRにライト)

と記載します。この操作の際に、

MRS SPSR, R1(※レジスタ1の内容をSPSRにライト?)

という記載自体は行うことができますが、この場合の実際の動作は

MRS SPSR_CF, R1

となり、SPSRのbit31〜24、7〜0しかライトされません。SPSRは初期値が不定となっており、このまま例外から復帰した場合、SPSRのbit23〜8は不定初期値のままなので、CPSRが意図しない設定となってしまいます。
実際に割込みハンドラの実装で「MRS SPSR, R1」という記載を行ってしまい、CPSRのbit9で設定されるエンディアン形式が意図せず変更されてしまったケースがありました。エンディアン形式が変更したことによって、次回のロード命令でリードしたアドレスが不正になってしまい、最終的にデータアボート例外となってしまいました。SPSR初期値は不定であるため、毎回発生するわけではなかったことで原因の特定にも時間が掛かってしまいました。SPSRを設定するのだからSPSRと記載するものだ、という思い込みによって、この失敗が発生してしまいました。レジスタ設定時の記載はレジスタ名そのままとは限らない、ということを注意いただけたらと思います。

4.3 キャッシュ、MMUは必須である

キャッシュ、MMUを使用することにより高いパフォーマンスを発揮することができますが、使用しない場合はパフォーマンスが落ちてしまい、タイマ周期割込みを行うと処理のほとんどを周期割込みに費やされてします。キャッシュ、MMUは使用する前提で立ち上げの検討を行う必要があります。

4.4 マニュアルが多岐にわたる

今回RZ/A1Mのルネサスマニュアルをメインに確認しましたが、立ち上げに必要な情報としてARMのマニュアルも読み込む必要があります。例えば、先ほど紹介したCPSR、SPSRについてはARMのマニュアルのみに記載されております。また、ARMのマニュアルは機能ごとになっているため、1つのCPUを立ち上げるために多くのマニュアルが必要となる場合もあります。

5. 最後に

Cortex-A9を始めとしたARMマイコンを立ち上げる際に注意する点を簡単ですが説明させていただきました。
ARMマイコンは多くのマニュアルが存在し、それ以外にも様々なサンプルや技術共有、質問掲示板などがあります。弊社で立ち上げた際にもマニュアルはもちろんのことサンプル、掲示板等を参考にして問題が解決したものもあります。今回のソフテックだよりもその役割を少しでも担えれば幸いです。

(T.M.)

[注釈]
※1
例外発生時に CPSR の現在の値を保持するためのレジスタ。例外発生時に該当する動作モードのSPSRにCPSRの内容がコピーされる。また、例外からの復帰時、CPSRに内容が自動的に復元される。
※2
インターネット接続環境が必要です。インターネット接続がない環境では、別途「GCC for Renesas ツールチェーン」のダウンロードサイトからダウンロードして、インストールする必要があります

関連ページへのリンク

関連するソフテックだより

ページTOPへ