arm コンパイラツールチェーン arm プロセッサ...

192
Copyright © 2010 ARM. All rights reserved. ARM DUI 0471BJ (ID 011811 ) ARM ® コンパイラツールチェーン バージョン 4.1 ARM ® プロセッサをターゲットとしたソフトウェア開発

Upload: nguyenphuc

Post on 31-May-2019

244 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM® コンパイラツールチェーンバージョン 4.1

ARM® プロセッサをターゲットとしたソフトウェア開発

Copyright © 2010 ARM. All rights reserved.ARM DUI 0471BJ (ID 011811 )

Page 2: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM コンパイラツールチェーンARM プロセッサをターゲットとしたソフトウェア開発

Copyright © 2010 ARM. All rights reserved.

リリース情報

本書には以下の変更が加えられています。

著作権

® または ™ のマークが付いた言葉およびロゴは、この著作権情報で別段に規定されている場合を除き、

ARM® の EU またはその他の国における登録商標および商標です。本書に記載されている他の製品名は、

各社の所有する商標です。

本書に記載されている情報の全部または一部、ならびに本書で紹介する製品は、著作権所有者の文書によ

る事前の許可を得ない限り、転用・複製することを禁じます。

本書に記載されている製品は、今後も継続的に開発・改良の対象となります。本書に含まれる製品および

その利用方法についての情報は、ARM が利用者の利益のために提供するものです。したがって当社では、

製品の市販性または利用の適切性を含め、暗示的・明示的に関係なく一切の責任を負いません。

本書は、本製品の利用者をサポートすることだけを目的としています。本書に記載されている情報の使

用、情報の誤りまたは省略、あるいは本製品の誤使用によって発生したいかなる損失・損傷についても、

ARM は一切責任を負いません。

ARM という用語が使用されている場合、“ARM または必要に応じてその子会社” を指します。

機密保持ステータス

本書は非機密扱いであり、本書を使用、複製、および開示する権利は、ARM および ARM が本書を提供し

た当事者との間で締結した契約の条項に基づいたライセンスの制限により異なります。

製品ステータス

本書の情報は 終版であり、開発済み製品に対応しています。

Web アドレス

http://www.arm.com

変更履歴

日付 発行 機密保持ステータス 変更点

2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン v4.1 リリース

2010 年 10 月 7 日 B 非機密扱い ARM コンパイラツールチェーン v4.1 のアップ

デート 1

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. iiID 011811 Non-Confidential

Page 3: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

目次ARM コンパイラツールチェーン ARM プロセッサを

ターゲットとしたソフトウェア開発

第 1 章 表記規則とフィードバック

第 2 章 ARM アーキテクチャバージョンの主な機能2.1 ARM アーキテクチャについて ................................................................................ 2-22.2 マルチプロセッサシステム ...................................................................................... 2-42.3 マルチプロセッサシステムに対応するソフトウェアの設計に関する注意事項 ...... 2-52.4 密結合メモリ ........................................................................................................... 2-62.5 メモリ管理 ............................................................................................................... 2-72.6 Thumb-2 テクノロジ ............................................................................................... 2-82.7 ARM および Thumb の浮動小数点ビルドオプション(ARMv6 以前) .................... 2-92.8 ARM および Thumb-2 の浮動小数点ビルドオプション(ARMv7 以降) ............... 2-112.9 ARM アーキテクチャ v4T ...................................................................................... 2-122.10 ARM アーキテクチャ v5TE ................................................................................... 2-142.11 ARM アーキテクチャ v6 ........................................................................................ 2-162.12 ARM アーキテクチャ v6-M .................................................................................... 2-192.13 ARM アーキテクチャ v7-A .................................................................................... 2-212.14 ARM アーキテクチャ v7-R .................................................................................... 2-232.15 ARM アーキテクチャ v7-M .................................................................................... 2-25

第 3 章 組み込みソフトウェアの開発3.1 組み込みソフトウェアの開発について .................................................................... 3-33.2 コンパイルツールのデフォルトの動作 .................................................................... 3-43.3 C ライブラリの構造 ................................................................................................ 3-53.4 デフォルトのメモリマップ ...................................................................................... 3-63.5 アプリケーションの起動 ......................................................................................... 3-83.6 ターゲットハードウェアに合わせた C ライブラリのカスタマイズ ....................... 3-9

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. iiiID 011811 Non-Confidential

Page 4: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

目次

3.7 ターゲットハードウェアに合わせたイメージのメモリマップのカスタマイズ .... 3-113.8 スキャッタロード記述ファイル ............................................................................ 3-123.9 ルート領域 ............................................................................................................. 3-133.10 スタックとヒープの配置 ....................................................................................... 3-143.11 ランタイムメモリモデル ....................................................................................... 3-153.12 ビットバンドオブジェクトへのリンクを含むスキャッタロードファイル ........... 3-173.13 リセットと初期化 .................................................................................................. 3-193.14 ベクタテーブル ..................................................................................................... 3-213.15 ROM および RAM のリマップ ............................................................................... 3-223.16 ローカルメモリのセットアップに関する注意事項 ............................................... 3-233.17 スタックポインタの初期化 ................................................................................... 3-243.18 ハードウェアの初期化 ........................................................................................... 3-253.19 実行モードに関する注意事項 ................................................................................ 3-263.20 ターゲットハードウェアおよびメモリマップ ....................................................... 3-27

第 4 章 C、C++、およびアセンブリ言語の混用4.1 命令の組み込み関数、インラインアセンブラ、および組み込みアセンブラ .......... 4-24.2 アセンブリコードから C グローバル変数へのアクセス ......................................... 4-44.3 C++ からのシステム C ヘッダファイルのインクルード ......................................... 4-54.4 C++ からの独自の C ヘッダファイルのインクルード ............................................ 4-64.5 混合言語プログラミング ......................................................................................... 4-74.6 C、C++、およびアセンブリ言語間の呼び出しに関する規則 ................................. 4-84.7 C およびアセンブリ言語からの C++ 関数の呼び出しに関する規則 ....................... 4-94.8 C++ に関する情報 ................................................................................................. 4-104.9 言語間の呼び出しのサンプル ................................................................................ 4-114.10 C からのアセンブリ言語の呼び出し ..................................................................... 4-124.11 アセンブリ言語からの C の呼び出し .................................................................... 4-134.12 C++ からの C の呼び出し ..................................................................................... 4-144.13 C++ からのアセンブリ言語の呼び出し ................................................................. 4-154.14 C からの C++ の呼び出し ..................................................................................... 4-164.15 アセンブリ言語からの C++ の呼び出し ................................................................ 4-174.16 C 言語またはアセンブリ言語からの C++ 言語の呼び出し ................................... 4-184.17 C 言語と C++ 言語間での参照の受け渡し ............................................................ 4-21

第 5 章 ARM と Thumb のインターワーク5.1 インターワークについて ......................................................................................... 5-25.2 インターワークに適した状況 .................................................................................. 5-35.3 アセンブリ言語のインターワーク ........................................................................... 5-55.4 C および C++ のインターワーク ............................................................................. 5-65.5 Thumb 状態の関数へのポインタ ............................................................................. 5-75.6 同一関数の 2 つのコピーの使用 .............................................................................. 5-85.7 アセンブリ言語のインターワークの例 ................................................................... 5-95.8 ベニアを使用したインターワーク ......................................................................... 5-115.9 C 言語と C++ 言語のインターワーク ................................................................... 5-135.10 ベニアを使用した C、C++、およびアセンブリ言語のインターワーク ............... 5-15

第 6 章 プロセッサ例外処理6.1 プロセッサ例外について ......................................................................................... 6-36.2 例外処理プロセス .................................................................................................... 6-46.3 ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルの例外のタイプ 6-56.4 ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのベクタテーブル ...

6-76.5 ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのプロセッサモード

およびレジスタ ....................................................................................................... 6-86.6 例外処理のためのシステムモードの使用 ................................................................ 6-96.7 例外に対するプロセッサの応答 ............................................................................ 6-106.8 例外ハンドラからの復帰 ....................................................................................... 6-116.9 リセットハンドラ .................................................................................................. 6-126.10 データアボートハンドラ ....................................................................................... 6-136.11 割り込みハンドラと外部割り込みのレベル .......................................................... 6-14

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. ivID 011811 Non-Confidential

Page 5: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

目次

6.12 再入可能割り込みハンドラ ................................................................................... 6-156.13 アセンブリ言語を使用した割り込みハンドラの例 ............................................... 6-186.14 シングルチャネル DMA 転送 ................................................................................. 6-196.15 デュアルチャネル DMA 転送 ................................................................................. 6-206.16 割り込みの優先度 .................................................................................................. 6-216.17 コンテキストスイッチ ........................................................................................... 6-236.18 SVC ハンドラ ........................................................................................................ 6-246.19 呼び出す SVC の決定 ............................................................................................ 6-266.20 アセンブリ言語を使用した SVC ハンドラ ............................................................ 6-276.21 C 言語およびアセンブリ言語を使用した SVC ハンドラ ...................................... 6-286.22 スーパーバイザモードでの SVC の使用 ............................................................... 6-306.23 アプリケーションからの SVC の呼び出し ............................................................ 6-316.24 アプリケーションからの動的な SVC の呼び出し ................................................. 6-336.25 プリフェッチアボートハンドラ ............................................................................ 6-356.26 未定義命令ハンドラ .............................................................................................. 6-366.27 ARMv6-M および ARMv7-M プロファイル ........................................................... 6-376.28 メインスタックおよびプロセススタック .............................................................. 6-386.29 マイクロコントローラプロファイルの例外のタイプ ............................................ 6-396.30 ARMv6-M および ARMv7-M プロファイルのベクタテーブル ............................... 6-406.31 ベクタテーブルオフセットレジスタ(ARMv7-M のみ) ....................................... 6-416.32 ARMv6-M および ARMv7-M プロファイルの例外テーブルの書き込み ................ 6-426.33 ネストされたベクタ割り込みコントローラ .......................................................... 6-436.34 例外処理 ................................................................................................................ 6-446.35 システム制御空間レジスタの設定 ......................................................................... 6-466.36 個別の IRQ の設定 ................................................................................................. 6-486.37 スーパーバイザコール ........................................................................................... 6-496.38 システムタイマ ..................................................................................................... 6-516.39 SysTick の設定 ...................................................................................................... 6-52

第 7 章 デバッグ通信チャネル7.1 デバッグ通信チャネルについて .............................................................................. 7-27.2 ターゲットとホストデバッグツールの間の DCC 通信 ........................................... 7-37.3 割り込み駆動型デバッグ通信 .................................................................................. 7-47.4 Thumb 状態からのアクセス .................................................................................... 7-6

第 8 章 セミホスティング8.1 セミホスティングとは ............................................................................................. 8-38.2 セミホスティングインタフェース ........................................................................... 8-58.3 セミホスティングオペレーションの番号の変更について ....................................... 8-78.4 セミホスティングオペレーション ........................................................................... 8-88.5 デバッグエージェントインタラクション SVC ....................................................... 8-98.6 angel_SWIreason_EnterSVC(0x17) ............................................................. 8-108.7 angel_SWIreason_ReportException(0x18) .............................................. 8-118.8 SYS_CLOSE(0x02) ............................................................................................ 8-138.9 SYS_CLOCK(0x10) ............................................................................................ 8-148.10 SYS_ELAPSED(0x30) ........................................................................................ 8-158.11 SYS_ERRNO(0x13) ........................................................................................... 8-168.12 SYS_FLEN(0x0C) ............................................................................................... 8-178.13 SYS_GET_CMDLINE(0x15) ............................................................................... 8-188.14 SYS_HEAPINFO(0x16) ...................................................................................... 8-198.15 SYS_ISERROR(0x08) ........................................................................................ 8-208.16 SYS_ISTTY(0x09) .............................................................................................. 8-218.17 SYS_OPEN(0x01) .............................................................................................. 8-228.18 SYS_READ(0x06) .............................................................................................. 8-238.19 SYS_READC(0x07) ............................................................................................ 8-248.20 SYS_REMOVE(0x0E) ........................................................................................ 8-258.21 SYS_RENAME(0x0F) ......................................................................................... 8-268.22 SYS_SEEK(0x0A) .............................................................................................. 8-278.23 SYS_SYSTEM(0x12) .......................................................................................... 8-288.24 SYS_TICKFREQ(0x31) ...................................................................................... 8-29

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. vID 011811 Non-Confidential

Page 6: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

目次

8.25 SYS_TIME(0x11) ................................................................................................ 8-308.26 SYS_TMPNAM(0x0D) ........................................................................................ 8-318.27 SYS_WRITE(0x05) ............................................................................................. 8-328.28 SYS_WRITEC(0x03) .......................................................................................... 8-338.29 SYS_WRITE0(0x04) ........................................................................................... 8-34

付録 A 『ARM プロセッサをターゲットとしたソフトウェア開発』に対する改訂

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. viID 011811 Non-Confidential

Page 7: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

第 1 章 表記規則とフィードバック

以下では、表記規則とフィードバックの方法について説明します。

表記規則

以下の表記規則を使用しています。

monospace コマンド、ファイル名、プログラム名、ソースコードなど、キー

ボードから入力可能なテキストを示しています。

monospace コマンドまたはオプションに使用可能な略語を示します。コマン

ド名またはオプション名をすべて入力する代わりに、下線部分の文字だけを入力することができます。

monospace italic コマンドまたは関数の引数で、特定の値に置き換えることが可能なものを示しています。

monospace bold サンプルコード以外に使用される言語キーワードを示しています。

italic 重要事項、重要用語、相互参照、引用箇所を斜体で記載していま

す。

bold メニュー名などのユーザインタフェース要素を太字で記載してい

ます。また、適宜記述リスト内の重要箇所と ARM® プロセッサの

信号名にも太字を用いています。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 1-1ID 011811 Non-Confidential

Page 8: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

表記規則とフィードバック

本製品に関するフィードバック

本製品についてのご意見やご提案がございましたら、以下の情報を添えて購入元までお寄せ下さい。

• お名前と会社名

• 製品のシリアル番号

• 製品のリリース情報

• ご使用のプラットフォームの詳細(ハードウェアプラットフォーム、オペレーティングシステムの種類とバージョンなど)

• 問題を再現するサイズの小さな独立したサンプルコード

• 操作の目的と実際の動作に関する詳しい説明

• 使用したコマンド(コマンドラインオプションを含む)

• 問題を例示するサンプル出力

• ツールのバージョン情報(バージョン番号、ビルド番号を含む)

内容に関するフィードバック

内容に関するご意見につきましては、電子メールを [email protected] まで

送信して下さい。その際には、以下の内容を記載して下さい。

• タイトル

• 文書番号(ARM DUI 0471BJ)

• オンラインでご覧の場合は、該当するトピック名

• PDF 版の文書をご覧の場合は、問題のあるページ番号

• 問題点の簡潔な説明

また、補足すべき点や改善すべき点についての全般的なご提案もお待ちしております。

ARM では、技術情報記事や FAQ の拡充と共に、ドキュメントに対する更新と訂正を ARM Information Center にて定期的に行っております。

その他の情報

• ARM Information Center, http://infocenter.arm.com/help/index.jsp

• ARM Technical Support Knowledge Articles, http://infocenter.arm.com/help/topic/com.arm.doc.faqs/index.html

• Keil Distributors, http://www.keil.com/distis

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 1-2ID 011811 Non-Confidential

Page 9: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

第 2 章 ARM アーキテクチャバージョンの主な機能

以下の各トピックでは、ARM® アーキテクチャの各バージョンの主な機能および ARM コンパイラツールチェーンを使用する際に注意すべき主な点について説明します。

• 「ARM アーキテクチャについて」 (ページ 2-2)• 「マルチプロセッサシステム」 (ページ 2-4)• 「マルチプロセッサシステムに対応するソフトウェアの設計に関する注意事項」

(ページ 2-5)• 「密結合メモリ」 (ページ 2-6)• 「メモリ管理」 (ページ 2-7)• 「Thumb-2 テクノロジ」 (ページ 2-8)• 「ARM および Thumb の浮動小数点ビルドオプション(ARMv6 以前)」 (ページ 2-9)• 「ARM および Thumb-2 の浮動小数点ビルドオプション(ARMv7 以降)」 (ページ

2-11)• 「ARM アーキテクチャ v4T」 (ページ 2-12)• 「ARM アーキテクチャ v5TE」 (ページ 2-14)• 「ARM アーキテクチャ v6」 (ページ 2-16)• 「ARM アーキテクチャ v6-M」 (ページ 2-19)• 「ARM アーキテクチャ v7-A」 (ページ 2-21)• 「ARM アーキテクチャ v7-R」 (ページ 2-23)• 「ARM アーキテクチャ v7-M」 (ページ 2-25)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-1ID 011811 Non-Confidential

Page 10: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.1 ARM アーキテクチャについて

ARM アーキテクチャは、ARM プロセッサによって使用される ARM 命令セット、

Thumb® 命令セット、実行モデル、メモリモデル、およびデバッグモデルを定義して

います。メモリモデルのバリアントには、仮想メモリ、キャッシュ、密結合メモリ(TCM)、およびメモリ保護が含まれます。ARM アーキテクチャ拡張は、浮動小数点

サポート、単一命令複数データ処理(SIMD)命令、セキュリティ拡張機能、Java バイトコードアクセラレーション、およびマルチプロセッシングサポートを定義しています。

ARM アーキテクチャでは、 先端のアプリケーション開発者の増大する要求を満た

すために絶えず向上を続ける一方で、ソフトウェア開発への投資を活用するために必要な下位互換性が維持されています。

以下の表に、現在の ARM プロセッサの主な機能を示します。

表 2-1 主な機能

プロセッサアーキテクチャ

密結合メモリ

メモリ管理 Thumb®-2

ARM7TDMI® ARMv4T - - -

ARM920T™ ARMv4T - MMU -

ARM922T™ ARMv4T - MMU -

ARM926EJ-S™ ARMv5TEJ あり MMU -

ARM946E-S™ ARMv5TE あり MPU -

ARM966E-S™ ARMv5TE あり - -

ARM1136J-S™/ARM1136JF-S™ ARMv6K あり MMU -

ARM1156T2-S™/ARM1156T2F-S™ ARMv6T2 あり MPU あり

ARM1176JZ-S™/ARM1176JZF-S™ ARMv6Z あり MMU -

ARM11™ MPCore™ ARMv6K - MMU -

Cortex™-M0 ARMv6-M - - -

Cortex-M1 ARMv6-M あり - -

Cortex-M3 ARMv7-M - MPU (オプ

ション)

Thumb-2 のみ

Cortex-M4 ARMv7E-M - MPU (オプ

ション)

Thumb-2 のみ

Cortex-A5 ARMv7-A - MMU あり

Cortex-A8 ARMv7-A - MMU あり

Cortex-A9 ARMv7-A - MMU あり

Cortex-R4 および Cortex-R4F ARMv7-R あり MPU あり

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-2ID 011811 Non-Confidential

Page 11: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.1.1 関連項目

概念: • 「密結合メモリ」 (ページ 2-6)• 「メモリ管理」 (ページ 2-7)• 「Thumb-2 テクノロジ」 (ページ 2-8)

その他の情報: • 『ARM アーキテクチャリファレンスマニュアル』,

http://infocenter/help/topic/com.arm.doc.subset.arch.reference/index.html

• 該当するプロセッサのテクニカルリファレンスマニュアル

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-3ID 011811 Non-Confidential

Page 12: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.2 マルチプロセッサシステム

ARM アーキテクチャ v6K では、 大 4 つの CPU および関連ハードウェアをサポート

する MPCore プロセッサが初めて導入されています。パフォーマンスを 適化するに

は、マルチプロセッサシステム上での実行を念頭に置いてアプリケーションを設計する必要があります。例えば、シングルスレッドアプリケーションは一度に 1 つの CPU でしか実行できませんが、マルチスレッドアプリケーションは複数のプロセッ

サで並列に実行できます。効率的なマルチプロセッサシステムでは消費電力と発熱が抑えられ、1 つの CPU を備えたシステムよりも応答性が高くなりますが、構造が

複雑になるのでデバッグは難しくなります。

2.2.1 関連項目

概念

• 「マルチプロセッサシステムに対応するソフトウェアの設計に関する注意事項」 (ページ 2-5)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-4ID 011811 Non-Confidential

Page 13: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.3 マルチプロセッサシステムに対応するソフトウェアの設計に関する注意事項

マルチプロセッシングシステムを設計する場合は、以下の推奨ガイドラインに従って下さい。

• LDREX および STREX を使用してプロセッサ上のソフトウェア実行を同期し、重要

なセクションおよび共有できないリソースを保護するミューテックスまたはセマフォを作成します。

• シンメトリックマルチプロセスおよび非シンメトリックマルチプロセスを行うためにキャッシュコヒーレンシを管理します。

• 反復タスクは複数の個別のスレッドで実行します。

• 大きなタスクは並列実行する複数のスレッドに分割します。

• 初期化タスク用に CP15 CPU ID レジスタを使用してプライマリ CPU をセット

アップします。

• 割り込みに優先度を設定します。

• 割り込みプリエンプション(横取り)にビットマスク処理を使用します。

• タイマまたはウォッチドッグをトリガするサイクル数を設定します。

注 通常、これらのタスクは OS によって処理されます。

2.3.1 関連項目

概念

• 「マルチプロセッサシステム」 (ページ 2-4)

リファレンス:

• 「LDREX と STREX」 (ページ 3-45)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-5ID 011811 Non-Confidential

Page 14: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.4 密結合メモリ

密結合メモリ(TCM)の目的は、キャッシュの特徴である予測不能性なしでプロ

セッサが使用できる低レイテンシメモリを提供することです。TCM は、キャッシュ

の不確定性が非常に望ましくない割り込み処理ルーチンやリアルタイムタスクなどの処理時間が重視されるルーチンを格納するのに使用できます。さらに、TCM は、

通常の変数、局所性がキャッシュに適していないデータ型、および割り込みスタックなどの重要なデータ構造を格納するのにも使用できます。

TCM は、システムの物理メモリマップの一部として使用され、同じ物理アドレスの

外部メモリによってバックアップされる必要がありません。そのような領域では、TCM に含まれるメモリ位置への書き込み時に外部書き込みは発生しません。

2.4.1 関連項目

その他の情報 • 『ARM アーキテクチャリファレンスマニュアル』,

http://infocenter/help/topic/com.arm.doc.subset.arch.reference/index.html

• 該当するプロセッサのテクニカルリファレンスマニュアル

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-6ID 011811 Non-Confidential

Page 15: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.5 メモリ管理

ARM のメモリ管理オプションを次に示します。

MMU メモリ管理ユニット(MMU)では、メモリシステムのきめ細かい制御

が可能です。これにより、オペレーティングシステムは、デマンドページング方式のメモリ管理などの機能を提供できます。ほとんどの詳細な制御は、メモリに格納されている変換テーブルを介して行われます。これらのテーブルのエントリによって、メモリのさまざまな領域のプロパティが定義されます。定義されるプロパティには以下のようなものがあります。

• 仮想アドレスから物理アドレスへのマッピング

• メモリアクセスパーミッション

• メモリタイプ

MPU メモリ保護ユニット(MPU)は、MMU に代わる大幅にシンプルな仕組

みです。その結果、MMU のすべての機能を必要としないシステムで

ハードウェアとソフトウェアの両方が簡略化されます。MPU を使用し

て、外部メモリをサイズおよび属性が異なる連続した複数の領域にパーティション分割できます。メモリのさまざまな領域のアクセスパーミッションおよびメモリ特性を制御することもできます。

MPU では、変換テーブルに外部メモリは必要ありません。MPU は、

MMU より予測性が高いパフォーマンスを提供するのに役立ちます。

2.5.1 関連項目

その他の情報 • 『ARM アーキテクチャリファレンスマニュアル』,

http://infocenter/help/topic/com.arm.doc.subset.arch.reference/index.html

• 該当するプロセッサのテクニカルリファレンスマニュアル

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-7ID 011811 Non-Confidential

Page 16: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.6 Thumb-2 テクノロジ

Thumb-2 テクノロジは、ARMv6T2 以降のアーキテクチャで使用できるテクノロジで

す。Thumb-2 は、16 ビット Thumb 命令セットのメジャーアップデートで、プログラ

ム内で 16 ビット命令と自由に混在させることのできる 32 ビット命令を追加します。

追加の 32 ビット命令により、Thumb-2 で ARM 命令セットの機能のほとんどをカ

バーできます。16 ビット命令と 32 ビット命令を利用できることにより、以前のバー

ジョンのコード密度と ARM 命令セットのパフォーマンスを Thumb-2 で兼ね備えま

す。

Thumb-2 命令セットと ARM 命令セットの重要な違いの 1 つは、ほとんどの 32 ビット Thumb 命令は条件なしであるのに対して、ほとんどの ARM 命令は条件付きである点

です。Thumb-2 では、条件付き実行命令 IT が導入されています。これは、後続の命

令に適用して、後続の命令を条件付きにする論理 if-then-else 演算です。

2.6.1 関連項目

その他の情報 • 『ARM アーキテクチャリファレンスマニュアル』,

http://infocenter/help/topic/com.arm.doc.subset.arch.reference/index.html

• 該当するプロセッサのテクニカルリファレンスマニュアル

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-8ID 011811 Non-Confidential

Page 17: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.7 ARM および Thumb の浮動小数点ビルドオプション(ARMv6 以前)

ARM コードおよび Thumb コードで浮動小数点演算を実行するコードをコンパイルす

るには、以下のオプションがあります。

ARM のみ 浮動小数点演算が含まれた関数専用の ARM コードをコンパイラで生成

するには、オプション --fpu vfpv2 を選択します。

オプション --fpu vfpv2 が選択されている場合、コンパイラは、コンパイ

ルの対象が ARM と Thumb のどちらであるかにかかわらず、浮動小数点

演算が含まれた任意の関数用の ARM コードを生成します。これは、

Thumb コードは VFP 命令を含んだり、VFP レジスタにアクセスしたり

することができないためです。この場合、ハードウェア VFP リンケー

ジが使用されます。つまり、浮動小数点引数が浮動小数点レジスタに渡されます。

ARM 用にのみコンパイルする場合は、--fpu=softvfp+vfpv2 ではなく、

--fpu=vfpv2 を使用します。ソフトウェアリンケージによって、VFP と ARM の間で値を転送するときにオーバーヘッドが生じるため、転送が

遅くなり、追加の命令が必要になります。

ARM/Thumb の混合

ARM/Thumb の混合コードをコンパイラで生成するには、オプション --fpu softvfp+vfpv2 を選択します。

オプション --fpu softvfp+vfpv2 が選択されている場合は、すべての関数

のコンパイルにソフトウェア浮動小数点リンケージが使用されます。つまり、関数との浮動小数点引数の受け渡しには、整数レジスタが使用されます。

Thumb 命令セットには VFP 命令が含まれないので、VFP レジスタにア

クセスできません。Thumb 用にコンパイルする場合は、

--fpu=softvfp+vfpv2 を設定して ARM コンパイラライブラリを使用できる

ようにすることにより、ソフトウェアリンケージを使用して VFP レジ

スタにアクセスできるようになります。

このライブラリは、ソフトウェア浮動小数点関数を含みます。これらは、ARM 用にコンパイルされ、VFP 命令を使用します。これらのライ

ブラリ関数により、完全なソフトウェア浮動小数点関数に比べてパフォーマンスが向上し、コードサイズが小さくなります。

コードサイズまたはパフォーマンスを 適化するオプションは、どのコードをコンパイルしようとしているかによって異なります。ARM 用にコンパイルする場合は、

オプション --fpu softvfp+vfpv2 および --fpu vfpv2 を使用して、必要なコードサイズと

パフォーマンスがどちらのオプションによって実現されるかを調べることができます。

ARM と Thumb を混用する場合は、--fpu オプションを試してみて下さい。

2.7.1 関連項目

参照

『アセンブラリファレンス』:

• 「--fpu=name」 (ページ 2-16)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-9ID 011811 Non-Confidential

Page 18: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

その他の情報 • 『ARM アーキテクチャリファレンスマニュアル』,

http://infocenter/help/topic/com.arm.doc.subset.arch.reference/index.html

• 該当するプロセッサのテクニカルリファレンスマニュアル

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-10ID 011811 Non-Confidential

Page 19: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.8 ARM および Thumb-2 の浮動小数点ビルドオプション(ARMv7 以降)

ARM/Thumb-2 の混合

ARM/Thumb の混合コードをコンパイラで生成するには、オプション --fpu softvfp+vfpv3 を選択します。

オプション --fpu softvfp+vfpv3 が選択されている場合は、すべての関数

のコンパイルにソフトウェア浮動小数点リンケージが使用されます。つまり、関数との浮動小数点引数の受け渡しには、ARM 整数レジスタが

使用されます。

ソフトウェア浮動小数点リンケージを使用すると、ソフトウェア浮動小数点リンケージを使用して自動的にビルドされた汎用ライブラリおよび従来のコードとリンクできるようになります。

ARM のみ ARM コードのみをコンパイラで生成するには、オプション --arm --fpu vfpv3 を選択します。これには、ハードウェア VFP リンケージが使用さ

れます。

Thumb-2 のみ

プログラム全体に Thumb-2 コードのみをコンパイラで生成するには、オ

プション --thumb --fpu vfpv3 を選択します。Thumb-2 は、VFP 命令をサ

ポートします。したがって、VFP 演算を実行するために ARM 状態に切

り替える必要はありません。これには、ハードウェア VFP リンケージ

が使用されます。

注 このオプションは、ARM および Thumb-2 の両方の命令セットから VFP

に直接アクセスできる、Cortex-A8 などの VFPv3 を備えた ARMv7 プロ

セッサでのみ使用できます。

2.8.1 関連項目

参照

『アセンブラリファレンス』:

• 「--fpu=name」 (ページ 2-16)

その他の情報 • 『ARM アーキテクチャリファレンスマニュアル』,

http://infocenter/help/topic/com.arm.doc.subset.arch.reference/index.html

• 該当するプロセッサのテクニカルリファレンスマニュアル

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-11ID 011811 Non-Confidential

Page 20: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.9 ARM アーキテクチャ v4T

ここでは、ARMv4T のコンパイルツールのサポートについて概説します。この ARM アーキテクチャのバリアントは、16 ビット Thumb 命令および 32 ビット ARM 命令

セットをサポートします。以下の表に、便利なコマンドラインオプションを示します。

2.9.1 主な機能

ARMv4T 用のコードをコンパイルする場合、コンパイラは Thumb 命令セットをサ

ポートします。これにより、優れたコード密度が実現されますが、次の点に注意する必要があります。

• 通常、Thumb コードはコード生成に多くの命令を使用するので、ARM コード

を使用して、処理時間が重視されるコードのパフォーマンスを 大化できます。

• 例外処理には、ARM 状態および関連する ARM 命令が必要です。

• (キャッシュ付きプロセッサ上の)キャッシュ設定および VFP を含め、コプロ

セッサのアクセスに ARM 命令が必要です。

2.9.2 境界整列のサポート

すべてのロード命令およびストア命令は、自然な整列境界で整列したアドレスを指定する必要があります。以下に例を示します。

• LDR および STR アドレスは、ワード境界で整列する必要があります。

• LDRH および STRH アドレスは、ハーフワード境界で整列する必要があります。

• LDRB および STRB アドレスは、任意の境界で整列できます。

自然な整列境界にないアドレスにアクセスすると動作が不安定になります。これを制御するには、非整列アドレスにアクセスするときにコンパイラがセーフコードを生成できるように、__packed を使用してコンパイラに通知する必要があります。

注 許可されている場合、非境界整列アクセスは、ロテート境界整列アクセスとして扱

われます。

表 2-2 便利なコマンドラインオプション

コマンドラインオプション

説明

--cpu=4T Thumb をサポートしている ARMv4。

--cpu=name name は特定の ARM プロセッサです(ARM7TDMI など)。

--apcs=qualifier ここで、qualifier は、インターワークおよび位置非依存の 1 つ以上の修飾子を示

します(- - apcs=/interwork など)。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-12ID 011811 Non-Confidential

Page 21: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.9.3 エンディアンのサポート

コンパイラのコマンドラインオプション --littleend および --bigend を使用すると、

それぞれリトルエンディアンコードまたはビッグエンディアンコードを生成できます。

ARMv4T は、以下のエンディアンモードをサポートします。

LE リトルエンディアン形式

BE-32 従来のビッグエンディアン形式

2.9.4 関連項目

参照

『コンパイラの使用』:

• 第 2 章 コンパイラの概要

『コンパイラリファレンス』:

• 「__packed」 (ページ 5-9)

『アセンブラリファレンス』:

• 「--apcs=qualifier…qualifier」 (ページ 2-5)

• 「--cpu=name」 (ページ 2-9)

• 「--bigend」 (ページ 2-7)

• 「--littleend」 (ページ 2-19)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-13ID 011811 Non-Confidential

Page 22: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.10 ARM アーキテクチャ v5TE

ここでは、ARMv5TE のコンパイルツールのサポートについて概説します。この ARM アーキテクチャのバリアントでは、デジタル信号処理(DSP)アルゴリズムの

演算サポートが強化されています。これは、ARM と Thumb の両方の命令セットをサ

ポートします。以下の表に、便利なコマンドラインオプションを示します。

2.10.1 主な機能

ARMv5TE 用のコードをコンパイルする場合、コンパイラは以下を行います。

• ARM と Thumb の間の向上したインターワーク(BLX など)をサポートします。

• 指定されたプロセッサに命令スケジューリングを実行します。命令は、インターロックを 小化してパフォーマンスを向上させるために再度順序付けられます。

• 16 ビットデータ項目に作用する乗算および積和命令を使用します。

• 命令の組み込み関数を使用して、符号付き飽和算術演算を実行する加算および減算命令を生成します。サチュレート算術演算では、計算が通常の整数範囲をオーバーフローした場合に、結果は循環して上書きされずに、正または負の大値が得られます。

• 2 ワードのデータに作用するロード(LDRD)およびストア(STRD)命令を使用し

ます。

2.10.2 境界整列のサポート

すべてのロード命令およびストア命令は、自然な整列境界で整列したアドレスを指定する必要があります。以下に例を示します。

• LDR および STR アドレスは、ワード境界で整列する必要があります。

• LDRH および STRH アドレスは、ハーフワード境界で整列する必要があります。

• LDRD および STRD アドレスは、ダブルワード境界で整列する必要があります。

• LDRB および STRB アドレスは、任意の境界で整列できます。

自然な整列境界にないアドレスにアクセスすると動作が不安定になります。これを制御するには、非整列アドレスにアクセスするときにコンパイラがセーフコードを生成できるように、__packed を使用してコンパイラに通知する必要があります。

表 2-3 便利なコマンドラインオプション

コマンドラインオプション

説明

--cpu=5TE Thumb、インターワーク、DSP 乗算、およびダブルワード命令をサポートしてい

る ARMv5

--cpu=5TEJ Thumb、インターワーク、DSP 乗算、ダブルワード命令、および Jazelle® 拡張を

サポートしている ARMv5a

--cpu=name name は特定の ARM プロセッサです。以下に例を示します。

• Thumb、Jazelle 拡張、物理的にマップされたキャッシュ、および MMU をサポートしている ARMv5 用 ARM926EJ-S

a. コンパイラは Jazelle バイトコードを生成できません。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-14ID 011811 Non-Confidential

Page 23: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

LDRD と STRD を除くすべての LDR および STR 命令は、ワード境界で整列されたアドレス

を指定する必要があります。ワード境界で整列されたアドレスを指定しない場合は、命令でアボートが生成されます。

注 許可されている場合、非境界整列アクセスは、ロテート境界整列アクセスとして扱

われます。

2.10.3 エンディアンのサポート

コンパイラのコマンドラインオプション --littleend および --bigend を使用すると、

それぞれリトルエンディアンコードまたはビッグエンディアンコードを生成できます。

ARMv5TE は、以下のエンディアンモードをサポートします。

LE リトルエンディアン形式

BE-32 従来のビッグエンディアン形式

2.10.4 関連項目

タスク

『コンパイラの使用』:

• 「コンパイラによる自然なバイト境界整列でのデータオブジェクトの格納」 (ページ 6-49)

概念

『コンパイラの使用』:

• 「__packed」 (ページ 5-9)

参照

『コンパイラリファレンス』:

• 「--unaligned_access、--no_unaligned_access」 (ページ 3-130)

『アセンブラリファレンス』:

• 「--cpu=name」 (ページ 2-9)

• 「--bigend」 (ページ 2-7)

• 「--littleend」 (ページ 2-19)

その他の情報

• 該当するプロセッサのテクニカルリファレンスマニュアル

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-15ID 011811 Non-Confidential

Page 24: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.11 ARM アーキテクチャ v6

ここでは、ARMv6 のコンパイルツールのサポートについて概説します。この ARM アーキテクチャのバリアントでは、元の ARM 命令セットが拡張されて、マルチプロ

セッサのサポートに加えて、追加のメモリモデル機能が追加されます。これは、ARM と Thumb の両方の命令セットをサポートします。以下の表に、便利なコマンド

ラインオプションを示します。

2.11.1 主な機能

ARMv6 用のコードをコンパイルする場合、コンパイラは、ARMv5TE の機能に加え、

以下を行います。

• 指定されたプロセッサに命令スケジューリングを実行します。命令は、インターロックを 小化してパフォーマンスを向上させるために再度順序付けられます。

• 必要に応じて、明示的な SXTB、SXTH、UXTB、および UXTH バイトまたはハーフワー

ド拡張命令を生成します。

• C の式によってエンディアンの反転が実行されると判断した場合は、エンディ

アン反転命令 REV、REV16、および REVSH を生成します。

• ARMv6 で使用可能な追加の Thumb 命令(CPS、CPY、REV、REV16、REVSH、SETEND、

SXTB、SXTH、UXTB、UXTH など)を生成します。

• ARMv6 用に特に 適化された関数(memcpy() など)を使用します。

SIMD 命令は C コードの式に適切にマップできないので、コンパイラは、通常の C コードまたは C++ コードから自動的に SIMD 命令を生成しません。SIMD コード生成

には、アセンブリ言語または組み込み関数を使用する必要があります。

以下の強化された命令を使用して、例外処理を向上させることができます。

• リンクレジスタ(LR)およびセーブドプログラムステータスレジスタ(SPSR)を保存および復元する SRS および RFE 命令

• カレントプログラムステータスレジスタ(CPSR)の状態切り替え、I および F ビットの変更を簡略化する CPS

• ベクタ割り込みコントローラをサポートするベクタ割り込みのアーキテクチャサポート

表 2-4 便利なコマンドラインオプション

オプション 説明

--cpu=6 Thumb、インターワーク、DSP 乗算、ダブルワード命令、非境界整列、混合エンディ

アン、Jazelle 拡張、およびメディア拡張をサポートしている ARMv6

--cpu=6Z セキュリティ拡張機能をサポートしている ARMv6

--cpu=6T2 Thumb-2 をサポートしている ARMv6

--cpu=name name は特定の ARM プロセッサです。以下に例を示します。

• ARM1136J-S を指定すると、ソフトウェア VFP をサポートする ARM1136J-S 用の

コードが生成されます。

• ARM1136JF-S を指定すると、ハードウェア VFP をサポートする ARM1136J-S 用の

コードが生成されます。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-16ID 011811 Non-Confidential

Page 25: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

• 低レイテンシ割り込みモード

• Thumb-2 コードを使用して Thumb 状態に例外を入力できる ARM1156T2-S

2.11.2 境界整列のサポート

コンパイラは、ARMv6 の非境界整列アクセスサポートをデフォルトで使用して、

パック構造体へのアクセスを高速化します。この際、LDR 命令と STR 命令を使用して、

データ自身と同じサイズの自然なワード境界上にないワードをロードおよびストアできるようになります。__packed で明示的に修飾されていない構造体はパックされま

せん。ARMv6 およびそれ以前のアーキテクチャ用のコンパイルを行う際の 1 バイト

境界整列の影響を以下の表に示します。

ARMv6 用にコンパイルされたコードは、プロセッサで非境界整列データアクセスを

有効にしている場合にのみ実行します。整列は、CP15 レジスタ c1 の U および A ビッ

トを使用するか、UBITINIT 入力をプロセッサ HIGH に入力することにより制御できま

す。

ARMv6 より前の非境界整列データアクセスの動作を使用するコードは、コンパイラ

オプション --no_unaligned_access を使用して生成できます。

注 非境界整列データアクセスは、BE-32 エンディアンモードでは使用できません。

LDRD と STRD はワード境界で整列させる必要があります。

2.11.3 エンディアンのサポート

コンパイラのコマンドラインオプション --littleend および --bigend を使用すると、

それぞれリトルエンディアンコードまたはビッグエンディアンコードを生成できます。

ARMv6 は、以下のエンディアンモードをサポートします。

LE リトルエンディアン形式

BE-8 ビッグエンディアン形式

BE-32 従来のビッグエンディアン形式

SETEND および REV 命令を使用することにより、混合エンディアンシステムも可能で

す。

表 2-5 1 バイト境界整列

__packed struct{

int i;char ch;short sh;

} foo;

ARMv6 より前のアーキテクチャ用

のコンパイルMOV R4,R0BL __aeabi_uread4LDRB R1, [R4,#4]LDRSB R2,[R4,#5]LDRB R12,[R4,#6]ORR R2,R12,R2 LSL#8

ARMv6 およびそれ以降のアーキテクチャ用

のコンパイルLDR R0, [R4,#0]LDRB R1,[R4,#4]LDRSH R2,[R4,#5]

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-17ID 011811 Non-Confidential

Page 26: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

ARMv6 エンディアンモード BE-8 用のコンパイル

コンパイラでは、ARMv6 およびビッグエンディアン用のコンパイル時に、BE-8 ビッ

グエンディアンコードがデフォルトで生成されます。また、BE-8 のコードであるこ

とを示すフラグがコードに設定されます。そのため、ARM プロセッサで BE-8 サポートを有効にするには、通常は E ビットを CPSR で設定する必要があります。

従来のコードを ARMv6 コードにリンクして、ARMv6 ベースのプロセッサ上で実行

することができます。ただし、この場合は、リンカによって従来のコードのバイト順序が BE-8 モードに切り替えられます。生成されるイメージは BE-8 モードになり

ます。

ARMv6 レガシーエンディアンモード BE-32 用のコンパイル

ARMv6 より前またはレガシーの BE-32 モードを使用するには、BIGENDINIT 入力をプロ

セッサ HIGH に関連付けるか、CP15 レジスタ c1 の B ビットを設定する必要がありま

す。

注 BE-32 と互換性のあるコードは、--be32 リンカオプションを使用してリンクする必要

があります。このオプションを指定しないと、ARMv6 属性によって BE-8 のイメー

ジが生成されます。

2.11.4 関連項目

参照

『アセンブラの使用』:

• 「メディア処理命令」 (ページ 3-27)

『コンパイラリファレンス』:

• 「--littleend」 (ページ 3-89)

• 「--unaligned_access、--no_unaligned_access」 (ページ 3-130)

『リンカリファレンス』:

• 「--be8」 (ページ 2-18)

• 「--be32」 (ページ 2-19)

『アセンブラリファレンス』:

• 「--cpu=name」 (ページ 2-9)

• 「--bigend」 (ページ 2-7)

• 「--littleend」 (ページ 2-19)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-18ID 011811 Non-Confidential

Page 27: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.12 ARM アーキテクチャ v6-M

ここでは、ARMv6-M(マイクロコントローラプロファイルをターゲットにした ARMv6 アーキテクチャ)のコンパイルツールのサポートについて概説します。マイ

クロコントローラプロファイルは、レジスタのハードウェアスタックおよび高水準言語による割り込みハンドラ作成をサポートした高速割り込み処理を行うために設計されたプログラムのモデルを実装します。このプロセッサは、FPGA に実装される

ように設計されており、超低電力アプリケーション用に 適です。これは、Thumb 命令セットおよび少数の 32 ビット Thumb-2 命令をサポートします。以下の表に、便

利なコマンドラインオプションを示します。

2.12.1 主な機能

ARMv6-M の主な機能

• コンパイラは、32 ビット Thumb-2 テクノロジを使用して Thumb 命令セットの

拡張をサポートします。32 ビット命令には、BL、DMB、DSB、ISB、MRS、および MSR があります。

2.12.2 境界整列のサポート

コンパイラは、ARMv6 の非境界整列アクセスサポートをデフォルトで使用して、

パック構造体へのアクセスを高速化します。この際、LDR 命令と STR 命令を使用して、

データ自身と同じサイズの自然なワード境界上にないワードをロードおよびストアできるようになります。

非境界整列データアクセスは、非境界整列アクセスのサイズおよび整列に応じて、2 個または 3 個の境界整列アクセスに変換されます。その結果、後続のアクセスは、

非境界整列アクセスが完了するまでストールします。整列は、DCode およびシステ

ムバスインタフェースを使用して制御できます。

2.12.3 エンディアンのサポート

コンパイラのコマンドラインオプション --littleend および --bigend を使用すると、

それぞれリトルエンディアンコードまたはビッグエンディアンコードを生成できます。

ARMv6-M は、以下のエンディアンモードをサポートします。

LE リトルエンディアン形式

BE-8 ビッグエンディアン形式

表 2-6 便利なコマンドラインオプション

コマンドラインオプション

説明

--cpu=6-M Thumb のみとプロセッサ状態命令をサポートしている ARMv6 マイクロコント

ローラプロファイル

--cpu=6S-M Thumb のみと、プロセッサ状態命令および OS 拡張をサポートしている ARMv6 マイクロコントローラプロファイル

--cpu=name name は特定の ARM プロセッサです。以下に例を示します。

• Thumb のみと、プロセッサ状態命令、OS 拡張、および BE-8 と LE データ

エンディアンをサポートしている ARMv6 の Cortex-M1

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-19ID 011811 Non-Confidential

Page 28: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.12.4 関連項目

参照

『コンパイラリファレンス』:

• 「--unaligned_access、--no_unaligned_access」 (ページ 3-130)

『アセンブラリファレンス』:

• 「--cpu=name」 (ページ 2-9)

• 「--bigend」 (ページ 2-7)

• 「--littleend」 (ページ 2-19)

その他の情報

• 『Cortex™-M1 テクニカルリファレンスマニュアル』, http://infocenter/help/topic/com.arm.doc.ddi0413-/index.html

• 『Cortex™-M0 テクニカルリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.ddi0432-/index.html

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-20ID 011811 Non-Confidential

Page 29: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.13 ARM アーキテクチャ v7-A

ここでは、ARMv7-A(アプリケーションプロファイルをターゲットにした ARMv7 アーキテクチャ)のコンパイルツールのサポートについて概説します。アプリケーションプロファイルは、複数のモードを使用する従来の ARM アーキテクチャを実装

し、MMU に基づく仮想メモリシステムアーキテクチャをサポートします。これらの

プロファイルは、ARM と Thumb の両方の命令セットをサポートします。以下の表

に、便利なコマンドラインオプションを示します。

2.13.1 主な機能

ARMv7-A の主な機能

• アドバンスド SIMD 拡張がサポートされます。

• Thumb Execution Environment (ThumbEE)がサポートされます。

2.13.2 境界整列のサポート

ARM アーキテクチャでサポートされているデータの境界整列の動作は、ARMv4 と ARMv7 で大幅に異なります。ARMv7 実装は、非境界整列データアクセスをサポー

トする必要があります。ロードおよびストア命令の整列要求は、CP15 レジスタ c1 の A ビットを使用して制御できます。

注 ARMv7 アーキテクチャは、ARMv6 より以前の境界整列をサポートしません。

2.13.3 エンディアンのサポート

コンパイラのコマンドラインオプション --littleend および --bigend を使用すると、

それぞれリトルエンディアンコードまたはビッグエンディアンコードを生成できます。

ARMv7-A は、以下のエンディアンモードをサポートします。

LE リトルエンディアン形式

BE-8 ARMv6 および ARMv7 で使用されるビッグエンディアン形式

表 2-7 便利なコマンドラインオプション

コマンドラインオプション

説明

--cpu=7 Thumb-2 のみをサポートし、ハードウェア除算をサポートしていない ARMv7a

--cpu=7-A 仮想 MMU ベースメモリシステムをサポートし、ARM 命令セット、Thumb 命令

セット、Thumb-2 命令セット、Thumb-2EE 命令セット、NEON™ サポート、およ

び 32 ビット SIMD サポートが指定された ARMv7 アプリケーションプロファイル

--cpu=name name は特定の ARM プロセッサです。以下に例を示します。

• ARM、Thumb、Thumb-2、ハードウェア VFP、NEON サポート、および 32 ビット SIMD サポートが指定された ARMv7 の Cortex-A8

a. ARM v7 は認識された ARM アーキテクチャではありません。しかし、ARMv7-A、ARMv7-R、および ARMv7-M のすべてのアーキテクチャに共通の機能を示しています。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-21ID 011811 Non-Confidential

Page 30: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

ARMv7 は、従来の BE-32 モードをサポートしません。ビッグエンディアンのバイト

順序が指定された命令を含む ARMv7 プロセッサ用の従来のコードがある場合、バイ

ト順序の反転を実行する必要があります。

2.13.4 関連項目

参照

『コンパイラの使用』:

• 「コンパイラによる自然なバイト境界整列でのデータオブジェクトの格納」 (ページ 6-49)

『コンパイラリファレンス』:

• 「--unaligned_access、--no_unaligned_access」 (ページ 3-130)

『アセンブラリファレンス』:

• 「--cpu=name」 (ページ 2-9)

• 「--bigend」 (ページ 2-7)

• 「--littleend」 (ページ 2-19)

その他の情報

• 『ARM アーキテクチャリファレンスマニュアル』, http://infocenter/help/topic/com.arm.doc.subset.arch.reference/index.html

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-22ID 011811 Non-Confidential

Page 31: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.14 ARM アーキテクチャ v7-R

ここでは、ARMv7-R(リアルタイムプロファイルをターゲットにした ARMv7 アー

キテクチャ)のコンパイルツールのサポートについて概説します。リアルタイムプロファイルは、複数のモードを使用する従来の ARM アーキテクチャを実装し、MPU に基づく保護メモリシステムアーキテクチャをサポートします。ARMv7-R アーキテ

クチャは、ARM と Thumb の両方の命令セットをサポートします。以下の表に、便利

なコマンドラインオプションを示します。

2.14.1 主な機能

ARMv7-R の主な機能

• SDIV および UDIV 命令をサポートします。

2.14.2 境界整列のサポート

ARM でサポートされているデータの境界整列の動作は、ARMv4 と ARMv7 で大幅に

変更されました。ARMv7 実装は、LDR、STR、LDRH、および STRH を使用して、いくつか

の非境界整列データアクセスを行うためのハードウェアサポートを提供します。その他のデータアクセスは、LDM、STM、LDRD、STRD、LDC、STC、LDREX、STREX、および SWP を使用して境界整列を維持する必要があります。

ロードおよびストア命令の整列要求は、CP15 レジスタ c1 の A ビットを使用して制御

できます。

2.14.3 エンディアンのサポート

コンパイラのコマンドラインオプション --littleend および --bigend を使用すると、

それぞれリトルエンディアンコードまたはビッグエンディアンコードを生成できます。

ARMv7-R は、以下のエンディアンモードをサポートします。

LE リトルエンディアン形式

BE-8 ビッグエンディアン形式

ARMv7 は、従来の BE-32 モードをサポートしません。ビッグエンディアンのバイト

順序が指定された命令を含む ARM v7 プロセッサ用の従来のコードがある場合、バイ

ト順序の反転を実行する必要があります。

表 2-8 便利なコマンドラインオプション

コマンドラインオプション

説明

--cpu=7 Thumb-2 のみをサポートし、ハードウェア除算をサポートしていない ARMv7a

--cpu=7-R ARM、Thumb、Thumb-2(オプション)、VFP、32 ビット SIMD のサポート、お

よびハードウェア除算が指定された ARMv7 リアルタイムプロファイル

--cpu=name name は特定の ARM プロセッサです。以下に例を示します。

• ARM、Thumb、Thumb-2、ハードウェア VFP、ハードウェア除算、および SIMD サポートが指定された ARMv7 の Cortex-R4F

a. ARM v7 は認識された ARM アーキテクチャではありません。しかし、ARMv7-A、ARMv7-R、および ARMv7-M のすべてのアーキテクチャに共通の機能を示しています。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-23ID 011811 Non-Confidential

Page 32: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

ARMv7-R は、リセットからの静的オプションとしてバイト順序反転ハードウェア

(オプション)をサポートします。

2.14.4 関連項目

参照

『コンパイラの使用』:

• 「コンパイラによる自然なバイト境界整列でのデータオブジェクトの格納」 (ページ 6-49)

『コンパイラリファレンス』:

• 「--unaligned_access、--no_unaligned_access」 (ページ 3-130)

『アセンブラリファレンス』:

• 「--cpu=name」 (ページ 2-9)

• 「--bigend」 (ページ 2-7)

• 「--littleend」 (ページ 2-19)

その他の情報

• 『ARM アーキテクチャリファレンスマニュアル』(ARMv7-A および ARMv7-R エディション), .http://infocenter/help/topic/com.arm.doc.ddi0406-/index.html

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-24ID 011811 Non-Confidential

Page 33: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.15 ARM アーキテクチャ v7-M

ここでは、ARMv7-M(マイクロコントローラプロファイルをターゲットにした ARMv7 アーキテクチャ)のコンパイルツールのサポートについて概説します。マイ

クロコントローラプロファイルは、レジスタのハードウェアスタックおよび高水準言語による割り込みハンドラ作成をサポートした高速割り込み処理を行うために設計されたプログラムのモデルを実装します。これは、ARMv7 保護メモリシステム

アーキテクチャのバリアントを実装し、Thumb-2 命令セットのみをサポートします。

以下の表に、便利なコマンドラインオプションを示します。

2.15.1 主な機能

ARMv7-M の主な機能

• SDIV および UDIV 命令をサポートします。

• ビットバンディングをサポートして、シングルビット値へのアトミックアクセスを有効にします。

• 割り込み組み込み関数を使用して、現在のプリエンプションの優先度を変更する CPSIE または CPSID 命令を生成します(表 2-10 を参照)。例えば、__disable_irq 組み込み関数を使用する場合、コンパイラは、PRIMASK を 1 に設定する CPSID i 命令を生成します。その結果、実行の優先度が 0 になり、設定可能な優先度を持

つ例外が入力できなくなります。以下の表に、割り込み組み込み関数を示します。

表 2-9 便利なコマンドラインオプション

コマンドラインオプション

説明

--cpu=7 Thumb-2 のみをサポートし、ハードウェア除算をサポートしていない ARMv7a

--cpu=7-M Thumb-2 のみとハードウェア除算をサポートしている ARMv7 マイクロコント

ローラプロファイル

--cpu=name name は特定の ARM プロセッサです。以下に例を示します。

• Thumb-2 のみ、ハードウェア除算、ARMv6 スタイル BE-8 と LE データエン

ディアンのサポート、および非境界整列アクセスが指定された ARMv7 の Cortex-M3

a. ARM v7 は認識された ARM アーキテクチャではありません。しかし、ARMv7-A、ARMv7-R、および ARMv7-M のすべてのアーキテクチャに共通の機能を示しています。

表 2-10 割り込み組み込み関数

組み込み関数オペコード

PRIMASK FAULTMASK

__enable_irq CPSIE i 0

__disable_irq CPSID i 1

__enable_fiq CPSIE f 0

__disable_fiq CPSID f 1

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-25ID 011811 Non-Confidential

Page 34: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM アーキテクチャバージョンの主な機能

2.15.2 境界整列のサポート

ARM でサポートされているデータの境界整列の動作は、ARMv4 と ARMv7 で大幅に

変更されました。ARMv7 実装は、非境界整列データアクセスをサポートする必要が

あります。ロードおよびストア命令の整列要求は、CP15 レジスタ c1 の A ビットを使

用して制御できます。

注 ARMv7 アーキテクチャは、ARMv6 より以前の境界整列をサポートしません。

2.15.3 エンディアンのサポート

コンパイラのコマンドラインオプション --littleend および --bigend を使用すると、

それぞれリトルエンディアンコードまたはビッグエンディアンコードを生成できます。

ARMv7-M は、以下のエンディアンモードをサポートします。

LE リトルエンディアン形式

BE-8 ビッグエンディアン形式

ARMv7 アーキテクチャは、従来の BE-32 モードをサポートしません。ビッグエン

ディアンのバイト順序が指定された命令を含む ARM v7 プロセッサ用の従来のコード

がある場合、バイト順序の反転を実行する必要があります。

2.15.4 関連項目

参照

『アセンブラリファレンス』:

• 「--cpu=name」 (ページ 2-9)

• 「--bigend」 (ページ 2-7)

• 「--littleend」 (ページ 2-19)

『コンパイラリファレンス』:

• 「--bitband」 (ページ 3-23)

その他の情報 • 『ARM アーキテクチャリファレンスマニュアル』,

http://infocenter/help/topic/com.arm.doc.subset.arch.reference/index.html

• 『ARMv7-M アーキテクチャリファレンスマニュアル』, http://infocenter/help/topic/com.arm.doc.ddi0406-/index.html

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 2-26ID 011811 Non-Confidential

Page 35: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

第 3 章 組み込みソフトウェアの開発

以下の各トピックでは、ターゲットシステムが存在する場合と存在しない場合の ARM コンパイラツールチェーンによる組み込みアプリケーションの開発方法について説明します。

• 「組み込みソフトウェアの開発について」 (ページ 3-3)• 「コンパイルツールのデフォルトの動作」 (ページ 3-4)• 「C ライブラリの構造」 (ページ 3-5)• 「デフォルトのメモリマップ」 (ページ 3-6)• 「アプリケーションの起動」 (ページ 3-8)• 「ターゲットハードウェアに合わせた C ライブラリのカスタマイズ」 (ページ 3-9)• 「ターゲットハードウェアに合わせたイメージのメモリマップのカスタマイズ」

(ページ 3-11)• 「スキャッタロード記述ファイル」 (ページ 3-12)• 「ルート領域」 (ページ 3-13)• 「スタックとヒープの配置」 (ページ 3-14)• 「ランタイムメモリモデル」 (ページ 3-15)• 「ビットバンドオブジェクトへのリンクを含むスキャッタロードファイル」 (ペー

ジ 3-17)• 「リセットと初期化」 (ページ 3-19)• 「ベクタテーブル」 (ページ 3-21)• 「ROM および RAM のリマップ」 (ページ 3-22)• 「ローカルメモリのセットアップに関する注意事項」 (ページ 3-23)• 「スタックポインタの初期化」 (ページ 3-24)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-1ID 011811 Non-Confidential

Page 36: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

• 「ハードウェアの初期化」 (ページ 3-25)• 「実行モードに関する注意事項」 (ページ 3-26)• 「ターゲットハードウェアおよびメモリマップ」 (ページ 3-27)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-2ID 011811 Non-Confidential

Page 37: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.1 組み込みソフトウェアの開発について

ほとんどの組み込みアプリケーションは、まず、 終製品で使用可能なリソースとはメモリやプロセッサパワーが異なるリソースを使用したプロトタイプ環境で開発されます。そのため、組み込みアプリケーションを、開発環境やデバッグ環境の機能に依存する環境からターゲッドハードウェア上でスタンドアロンで実行されるシステムに移行するプロセスを考慮することが重要です。

ツールチェーンを使用して組み込みソフトウェアを開発する場合は、以下の点を考慮する必要があります。

• デバッグビルドまたは開発ビルドからアプリケーションの完全なスタンドアロンの実稼動バージョンへの移行に必要な手順を理解するためにも、コンパイルツールのデフォルトの動作とターゲットの環境を理解すること。

• C ライブラリの一部の機能がデバッグ環境のリソースを使用して実行されるこ

と。このような機能を使用する場合は、ターゲットハードウェアを利用するように再実装する必要があります。

• ツールチェーンには、特定のターゲットのメモリマップに関する情報が保持されていないこと。イメージのメモリマップは、ターゲットハードウェアのメモリレイアウトに合わせてカスタマイズする必要があります。

• 組み込みアプリケーションは、メインアプリケーションを実行する前に、スタックとヒープの初期化などの何らかの初期化を実行する必要があること。完全な初期化シーケンスには、ユーザが実装するコードに加えて、ARM コンパ

イラ C ライブラリの初期化ルーチンが必要となります。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-3ID 011811 Non-Confidential

Page 38: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.2 コンパイルツールのデフォルトの動作

組み込みアプリケーションのソフトウェア開発に着手する際に、ユーザがターゲットハードウェアの技術的な仕様全体を把握していない場合があります。例えば、ターゲットの周辺機器、メモリマップ、さらにプロセッサ自体についても、詳細を把握していない場合があります。

このような詳細を把握していなくてもソフトウェア開発を進められるように、RealView Compilation Tools には、ユーザがアプリケーションコードのビルドとデバッ

グをすぐに開始できるようにするデフォルトの動作が用意されています。デフォルトのビルドから完全なスタンドアロンのアプリケーションへの移行に必要な手順を理解するためにも、このデフォルトの動作を知っておくことが重要です。

ARM C ライブラリでの ISO C 言語の機能(例えば、プログラム I/O)のサポートに

は、ホストデバッグ環境によってデバイスドライバレベルで提供されるものもあります。この機能を提供するメカニズムは、セミホスティングと呼ばれます。セミホスティングが実行されると、デバッグエージェントによってプログラムの実行が中断されます。デバッグエージェントは、次に、ホストのデバッグ機能(例えばデバッガコンソールへの printf 出力)を使用して、コードの実行がターゲット上で再開

される前に、セミホスティングオペレーションを処理します。ホストで実行されるタスクは、ターゲット上で実行されているプログラムから見えません。

3.2.1 関連項目

参照

• 第 8 章 セミホスティング

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-4ID 011811 Non-Confidential

Page 39: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.3 C ライブラリの構造

概念上、C ライブラリは、ISO C 標準に含まれる関数(例えば、printf())と ISO C 標準をサポートする関数に分類することができます。

例えば、図 3-1 は、デバッガコンソールウィンドウに書き込むという方法で関数 printf() を実装する C ライブラリを示します。この実装は、セミホスティング呼び出

しを実行するサポート関数である _sys_write() を呼び出すことによって提供されま

す。その結果、ターゲットのペリフェラルではなくデバッガが使用されるデフォルトの動作になります。

図 3-1 C ライブラリの構造

3.3.1 関連項目

タスク

『ARM C および C++ ライブラリと浮動小数点サポートの使用』:

• 第 2 章 ARM C ライブラリと C++ ライブラリ

参照

『ARM C ライブラリ、C++ ライブラリ、および浮動小数点サポートリファレンス』:

• 第 2 章 C ライブラリと C++ ライブラリ

ISO C

input/output

errorhandling

stack andheapsetup

other

Semihosting SupportDebugAgent

C Library

Functions called byyour application,for example, printf()

Device driver level.Use semihosting,for example,

Implemented bythe debuggingenvironment

_sys_write()

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-5ID 011811 Non-Confidential

Page 40: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.4 デフォルトのメモリマップ

メモリマップが記述されていないイメージでは、以下の図に示すように、リンカがデフォルトのメモリマップに従ってコードとデータを配置します。

図 3-2 デフォルトのメモリマップ

注 ARMv6-M および ARMv7-M アーキテクチャに基づくプロセッサには、固定されたメ

モリマップがあります。そのため、上記のプロセッサをベースにしたさまざまなシステムの間では、ソフトウェアのポート指定が容易になります。

デフォルトのメモリマップは以下のように記述されます。

• イメージは、アドレス 0x8000 でロードおよび実行されるようにリンクされま

す。すべての読み出し専用(RO)セクションが 初に配置され、その後、読み

出し / 書き込み(RW)セクション、ゼロで初期化された(ZI)セクションの順

に配置されます。

• ヒープは ZI の先頭から配置されるため、正確な位置はリンク時に決まります。

• スタックベースの位置は、アプリケーションの起動時のセミホスティングオペレーションによって決まります。このセミホスティングオペレーションによって返される値は、デバッグ環境によって異なります。

リンカは、一連の規則に基づいて、メモリ内でのコードとデータの配置場所を決定します。

ZI

RW

RO

STACK

HEAP

FromSemihosting

Calculatedby the linker

call

0x8000

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-6ID 011811 Non-Confidential

Page 41: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

図 3-3 リンカの配置規則

一般的に、リンカは、入力セクションをまず属性および名前でソートし、次に入力リスト内の位置に基づいてソートします。

コードとデータの配置を正確に制御するには、スキャッタロードメカニズムを使用する必要があります。

3.4.1 関連項目

概念

『リンカの使用』:

• 「イメージの構造」 (ページ 4-3)

• 「リンカによるセクションの配置」 (ページ 4-20)

• 「スキャッタロードについて」 (ページ 8-3)

参照

• 「ターゲットハードウェアに合わせたイメージのメモリマップのカスタマイズ」 (ページ 3-11)

『リンカリファレンス』:

• 第 4 章 スキャッタロード記述ファイルの正式な構文

その他の情報

• 『Cortex-M1 テクニカルリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.ddi0413-/index.html

• 『Cortex-M3 テクニカルリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337-/index.html

ZI

RW

RO

DATA

CODE

B

A

section Afrom file2.o

Section A from file1.o

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-7ID 011811 Non-Confidential

Page 42: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.5 アプリケーションの起動

ほとんどの組み込みシステムでは、メインタスクが実行される前に、初期シーケンスによってシステムのセットアップが実行されます。図 3-4 は、デフォルトの初期化

シーケンスを示しています。

図 3-4 デフォルトの初期化シーケンス

__main はメモリをセットアップし、__rt_entry はランタイム環境をセットアップしま

す。

__main によって、コードとデータのコピー、伸張、および ZI データのゼロ初期化が

実行されます。次に、__rt_entry に分岐して、スタックとヒープのセットアップ、ラ

イブラリ関数と静的データの初期化、およびトップレベルの C++ コンストラクタの

呼び出しが行われます。その後、__rt_entry は、アプリケーションのエントリである main() に分岐します。メインアプリケーションの実行が終了すると、__rt_entry によってライブラリがシャットダウンされ、制御がデバッガに戻されます。

関数ラベル main() には特別な意味があります。main() 関数が存在することにより、リ

ンカは __main および __rt_entry 内の初期化コードをリンクします。main() 関数が存在

しない場合は、初期化シーケンスがリンクされず、その結果、標準 C ライブラリの

一部の機能がサポートされなくなります。

3.5.1 関連項目

参照

『リンカリファレンス』:

• 「--startup=symbol?--no_startup」 (ページ 2-154)

C Library

__maincopy code and data

Initialize ZI data to zeros

User Code

main()

causes the linker to link in library initialization code

__rt_entry

set up application stackand heapinitialize library functionscall top-level constructors (C++)

Exit from application

Imageentry point

.copy or decompress RW data

.

.

.

.

..

.

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-8ID 011811 Non-Confidential

Page 43: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.6 ターゲットハードウェアに合わせた C ライブラリのカスタマイズ

デフォルトでは、C ライブラリはセミホスティングを使用してデバイスドライバレ

ベルの機能を提供し、ホストコンピュータを入出力デバイスとして使用できるようにします。開発時に使用するハードウェアには、完成時のシステムに備わる入出力機能がすべて用意されているとは限りません。

ターゲットハードウェアを利用し、C ライブラリの実装を優先してイメージに自動

的にリンクされる C ライブラリ関数を独自に実装することができます。図 3-5 は、C ライブラリのターゲット変更と呼ばれるこのプロセスを示しています。

図 3-5 C ライブラリのターゲット変更

例えば、LCD 画面などのペリフェラル I/O デバイスがある場合、ライブラリで実装

されているデバッガコンソールへの書き込みを行う fputc() を、LCD に出力する実装

でオーバーライドすることが必要な場合があります。この fputc() の実装は 終イ

メージにリンクされるため、printf() ファミリのすべての関数が LCD への出力を行

います。

3.6.1 fputc() の実装例

この fputc() の実装例では、fputc() の入力文字パラメータが、別のソースファイルで

実装されていると仮定されたシリアル出力関数 sendchar() に転送されます。このよう

に、fputc() は、ターゲットに依存する出力と C ライブラリ標準出力関数との間の抽

象レイヤとして機能します。

例 3-1 fputc() の実装

extern void sendchar(char *ch);int fputc(int ch, FILE *f){ /* 例えば、 LCD 画面に文字を書き込む */ char tempch = ch;

ISO C

Input/Output

SemihostingSupport

ISO C

Input/Output

Retarget

DebugAgent

C Library UserCode

TargetHardware

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-9ID 011811 Non-Confidential

Page 44: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

sendchar(&tempch); return ch;}

スタンドアロンのアプリケーションでは、セミホスティングオペレーションがサポートされない可能性があります。したがって、セミホスティング機能に対するすべての呼び出しを削除するか、非セミホスティング機能を使用してこれらの関数を再実装する必要があります。

3.6.2 関連項目

タスク

『ARM C および C++ ライブラリと浮動小数点サポートの使用』:

• 「非セミホスティング環境でのライブラリの使用」 (ページ 2-39)

参照

• 第 8 章 セミホスティング

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-10ID 011811 Non-Confidential

Page 45: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.7 ターゲットハードウェアに合わせたイメージのメモリマップのカスタマイズ

セミホスティング機能がサポートされない 終的な組み込みシステムでは、デフォルトのメモリマップが使用されない可能性があります。通常、ターゲットハードウェアでは、複数のメモリデバイスが異なるアドレス範囲に配置されています。このようなデバイスを 大限に活用するには、ロード時と実行時にそれぞれのメモリビューを使用する必要があります。

スキャッタロードにより、スキャッタロード記述ファイルと呼ばれるテキスト形式の記述ファイル内で、ロード時と実行時のコードとデータのメモリ位置を指定できます。このファイルは、コマンドラインで --scatter オプションを使用すると、リン

カに渡されます。以下に例を示します。

armlink --scatter scatter.scat file1.o file2.o

スキャッタロードでは、2 種類のメモリ領域を定義します。

• リセット時とロード時にアプリケーションコードとデータを保持するロード領域。

• アプリケーションの実行時にコードとデータを保持する実行領域。アプリケーションの起動中に、各ロード領域から 1 つまたは複数の実行領域が作成されま

す。

1 つのコードまたはデータセクションを配置できるのは、1 つの実行領域内だけで

す。分割することはできません。

起動中、__main 内の C ライブラリ初期化コードによって、イメージのロードビューか

ら実行ビューに移動する必要のあるコードとデータのコピーおよびゼロ初期化が実行されます。

注 ARMv6-M および ARMv7-M アーキテクチャに基づくデバイスのメモリマップの全体

的なレイアウトは、固定されています。そのため、上記のアーキテクチャをベースにしたさまざまなシステムの間では、ソフトウェアの移植が容易になります。

3.7.1 関連項目

タスク

『リンカの使用』:

• 第 8 章 スキャッタロード記述ファイルの使用

概念

• 「ビットバンドオブジェクトへのリンクを含むスキャッタロードファイル」 (ページ 3-17)

参照

• 『ARMv7-M アーキテクチャリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.ddi0403-/index.html

• 『ARMv6-M アーキテクチャリファレンスマニュアル』, http://infocenter.arm.com/help/topic/com.arm.doc.ddi0419-/index.html

『リンカリファレンス』:

• 「--scatter=file」 (ページ 2-141)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-11ID 011811 Non-Confidential

Page 46: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.8 スキャッタロード記述ファイル

以下の図に示すスキャッタロード記述ファイルの構文には、スキャッタロード自体に用意されている機能が反映されています。

図 3-6 スキャッタロード記述ファイルの構文

領域は、ヘッダタグで定義されます。ヘッダタグには、少なくとも領域の名前と開始アドレスが含まれていますが、必要に応じて、 大長やさまざまな属性を追加できます。

領域の内容は領域のタイプによって異なります。

• ロード領域には、少なくとも 1 つの実行領域が含まれている必要があります。

実際には、各ロード領域に複数の実行領域が含まれていることが一般的です。

• 領域が EMPTY 属性で宣言されている場合を除いて、実行領域には、少なくとも 1 つのコードセクションまたはデータセクションが含まれている必要があります。通常、EMPTY でない領域には、オブジェクトまたはライブラリコードが含ま

れています。ワイルドカード(*)構文を使用すると、スキャッタロード記述

ファイル内で指定されていない特定の属性を含むすべてのセクションをグループ化できます。

3.8.1 関連項目

タスク

『リンカの使用』:

• 第 8 章 スキャッタロード記述ファイルの使用

概念 • 「ビットバンドオブジェクトへのリンクを含むスキャッタロードファイル」

(ページ 3-17)

『リンカの使用』:

• 「メモリマップが単純なイメージ」 (ページ 8-7)

MY_REGION 0x0000 0x2000{ contents of region}

name of region start address

optional lengthparameter

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-12ID 011811 Non-Confidential

Page 47: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.9 ルート領域

ルート領域とは、実行アドレスがロードアドレスと同じ実行領域のことです。各スキャッタロード記述ファイルには、少なくとも 1 つのルート領域が必要です。

スキャッタロードでは、実行領域の作成に関与するコードとデータはそれ自身を別の場所にコピーできないという制約があります。そのため、ルート領域には以下のセクションが含まれている必要があります。

• コードとデータをコピーするコードを保持する __main.o および __scatter*.o• 伸張を実行する __dc*.o• コピーまたは伸張されるコードとデータのアドレスを保持する Region$$Table セ

クション

上記のセクションは読み出し専用として定義されるため、* (+RO) ワイルドカード構

文でグループ化されます。そのため、* (+RO) が非ルート領域で指定されている場合

は、InRoot$$Sections を使用して、上記のセクションをルート領域で明示的に宣言す

る必要があります。

3.9.1 関連項目

タスク

『リンカの使用』:

• 「ARM C および C++ ライブラリコードの配置について」 (ページ 8-50)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-13ID 011811 Non-Confidential

Page 48: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.10 スタックとヒープの配置

スキャッタロードメカニズムにより、コードと静的に割り当てられたデータの位置をイメージ内で指定できます。アプリケーションのスタックとヒープは、C ライブ

ラリの初期化中にセットアップされます。スタックとヒープの位置は、特定の名前が付けられた ARM_LIB_HEAP、ARM_LIB_STACK、または ARM_LIB_STACKHEAP 実行領域を使用し

てカスタマイズできます。別の方法として、スキャッタロード記述ファイルを使用しない場合は、__user_setup_stackheap() 関数を再実装できます。

3.10.1 関連項目

概念

「ランタイムメモリモデル」 (ページ 3-15)

リファレンス

『ARM C および C++ ライブラリと浮動小数点サポートの使用』:

• 「新しい実行環境に合わせた C ライブラリのカスタマイズ」 (ページ 2-59)

『リンカリファレンス』:

• 「スキャッタロード記述ファイルを使用したスタックとヒープの指定」 (ページ 8-12)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-14ID 011811 Non-Confidential

Page 49: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.11 ランタイムメモリモデル

ARM コンパイラツールチェーンには、以下のランタイムメモリモデルが用意されて

います。

1 領域モデル

アプリケーションのスタックとヒープは、同じメモリ領域内で相手に向かって拡大します。詳細については、図 3-7 を参照して下さい。このラ

インタイムメモリモデルでは、新しいヒープ空間が割り当てられた場合(malloc() が呼び出された場合など)、スタックポインタの値に照らし合

わせてチェックされます。

図 3-7 1 領域モデル

例 3-2 1 領域モデルのルーチン

LOAD_FLASH ...{

...ARM_LIB_STACKHEAP 0x20000 EMPTY 0x20000 ; ヒ ープ と ス タ ッ クは、 同一領域内で

{ } ; 互いの方向に向か っ て拡大する...

}

2 領域モデル

スタックとヒープは、メモリの個別の領域に配置されます。「2 領域モ

デル」 (ページ 3-16)を参照して下さい。例えば、高速 RAM の一部を

スタック専用に予約しておく場合があるとします。2 領域モデルに対し

ては、__use_two_region_memory をインポートする必要があります。

このラインタイムメモリモデルでは、新しいヒープ空間が割り当てられた場合、ヒープリミットに照らし合わせてヒープがチェックされます。

STACK

HEAP

Stack Base

Heap Base

0x40000

0x20000

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-15ID 011811 Non-Confidential

Page 50: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

図 3-8 2 領域モデル

例 3-3 2 領域モデルのルーチン

LOAD_FLASH ...{

...ARM_LIB_STACK 0x40000 EMPTY -0x20000 ; ス タ ッ ク領域は下方向に拡大する{ } ; ARM_LIB_HEAP 0x28000000 EMPTY 0x80000 ; ヒ ープ領域は上方向に拡大する{ }...

}

どちらのランタイムメモリモデルでも、スタックはチェックされずに拡大します。

3.11.1 関連項目

概念

『ARM® C および C++ ライブラリと浮動小数点サポートの使用』:

• 「スタックポインタの初期化とヒープの上下限」 (ページ 2-95)

STACK

HEAP

Heap Limit

Heap Base

Stack Base

0x28080000

0x28000000

0x40000

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-16ID 011811 Non-Confidential

Page 51: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.12 ビットバンドオブジェクトへのリンクを含むスキャッタロードファイル

ARMv7-M アーキテクチャが使用されているデバイスでは、SRAM 領域とペリフェラ

ル領域それぞれにビットバンド機能があります。ビットバンド領域内の各ビットには、ビットバンドエイリアスと呼ばれる別のアドレスで個別にアクセスできます。例えば、0x20000001 のワードのビット[13]には、アドレス 0x2200002D を使用して

アクセスできます。

表 2.2 に、SRAM およびペリフェラルメモリ領域におけるビットバンド領域とエイリ

アスを示します。

ビットバンドオブジェクトをリンクするスキャッタロードファイルの例を以下に示します。

FLASH_LOAD 0x20000000{

RW 0x20000000 ; ビ ッ トバン ド領域の先頭の RW デー タ{* (+RW-DATA)

}RO +0 FIXED ; 後続の RO デー タ{

* (+RO-DATA)}

CODEDATA +0 ; 後続のその他のデー タ{ * (+RO-CODE)* (+ZI) ; 直後の ZI

}

ARM_LIB_HEAP +0 EMPTY 0x10000 ; ヒ ープの開始位置{}

ARM_LIB_STACK 0x20100000 EMPTY -0x10000 ; ス タ ッ ク の開始位置は

; ビ ッ トバン ド領域の先頭{}

}

3.12.1 関連項目

概念 • 「ターゲットハードウェアに合わせたイメージのメモリマップのカスタマイズ」

(ページ 3-11)

表 3-1 ARMv7-M のビットバンド領域とエイリアス

メモリ領域 説明 アドレス範囲

SRAM ビットバンド領域 0x20000000 ~ 0x200FFFFF

ビットバンドエイリアス 0x22000000 ~ 0x23FFFFFF

ペリフェラル ビットバンド領域 0x40000000 ~ 0x400FFFFF

ビットバンドエイリアス 0x42000000 ~ 0x43FFFFFF

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-17ID 011811 Non-Confidential

Page 52: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

• 「スキャッタロード記述ファイル」 (ページ 3-12)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-18ID 011811 Non-Confidential

Page 53: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.13 リセットと初期化

C ライブラリ初期化ルーチンへのエントリポイントは __main です。ただし、ターゲッ

トハードウェア上の組み込みアプリケーションによって、起動時に何らかのシステムレベルの初期化が実行されます。

3.13.1 組み込みシステムの初期化シーケンス

以下の図は、ARM アーキテクチャベースの組み込みシステムで考えられる初期化

シーケンスを示しています。

図 3-9 初期化シーケンス

スキャッタロード記述ファイルを使用してスタックとヒープの配置をカスタマイズする場合、リンカは、これらの領域名のリンカ定義シンボル(ARM_LIB_*)を使用し

て、ライブラリヒープとスタックセットアップコードのバージョンを含めます。独自の実装を作成することもできます。

リセットハンドラは、通常、アセンブラでコーディングされた小さなモジュールであり、システムの起動直後に実行されます。リセットハンドラは、少なくとも、アプリケーションが実行されているモードのスタックポインタを初期化します。キャッシュ、TCM、MMU、MPU などのローカルのメモリシステムを使用するプロ

セッサの場合は、この初期化プロセスの段階で何らかの設定を行う必要があります。通常、実行後にリセットハンドラが __main に分岐して、C ライブラリ初期化シーケン

スを開始します。

割り込みの有効化など、システムの初期化にはいくつかのコンポーネントがあり、一般的には C ライブラリ初期化コードの実行終了後に実行されます。これらの処理

は、$Sub$$main() というコードブロックで、メインアプリケーションが実行される直

前に実行されます。

C Library User Code

__user_setup_stackheap()set up application stack and heap

main()causes the linker to link in library initialization code

$Sub$$main()enable caches and interrupts

reset handlerinitialize stack pointersconfigure MMU/MPUsetup cache/enable TCM

1

2

3

4

5

6

__rt_entry

initialize library functionscall top-level constructors (C++)

Exit from application

..

. .

.

.

...__main

copy code and datacopy/decompress RW data. initialize ZI data to zeros

..Image Entry Point

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-19ID 011811 Non-Confidential

Page 54: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.13.2 関連項目

その他の情報

『ARM C および C++ ライブラリと浮動小数点サポートの使用』:

• 「$Super$$ と $Sub$$ を使用したシンボル定義へのパッチの適用」 (ページ 7-30)

『リンカリファレンス』:

• 「スキャッタロード記述ファイルを使用したスタックとヒープの指定」 (ページ 8-12)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-20ID 011811 Non-Confidential

Page 55: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.14 ベクタテーブル

すべての ARM システムには、ベクタテーブルがあります。ベクタテーブルは、初期

化シーケンスの一部ではありませんが、例外を処理するために必要です。これは、特定のアドレス(通常 0x0)に配置する必要があります。そのためには、以下の例に

示すように、スキャッタロードディレクティブ +FIRST を使用できます。

例 3-4 特定のアドレスへのベクタテーブルの配置

ROM_LOAD 0x0000 0x4000{ ROM_EXEC 0x0000 0x4000 ; ルー ト領域 { vectors.o (Vect, +FIRST) ; ベ ク タ テーブル

* (InRoot$$Sections) ; ルー ト領域に配置する必要があるすべての

; ラ イ ブ ラ リ セ ク シ ョ ン (__main.o、 ; __scatter*.o、 __dc*.o、 * Region$$Table など) } RAM 0x10000 0x8000 { * (+RO, +RW, +ZI) ; その他のセ ク シ ョ ン }}

マイクロコントローラプロファイルのベクタテーブルは、ほとんどの ARM アーキテ

クチャとは大幅に異なります。

3.14.1 関連項目

参照

• 「ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのベクタテーブ

ル」 (ページ 6-7)

• 「ARMv6-M および ARMv7-M プロファイルのベクタテーブル」 (ページ 6-40)

• 「ARMv6-M および ARMv7-M プロファイルの例外テーブルの書き込み」 (ページ 6-42)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-21ID 011811 Non-Confidential

Page 56: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.15 ROM および RAM のリマップ

注 この情報は、ARMv6-M プロファイルおよび ARMv7-M プロファイルには適用されま

せん。

ユーザは、 初に実行される命令のアドレス 0x0 にどのようなメモリを配置するのか

を検討する必要があります。

注 ここでは、ARM プロセッサによる命令フェッチが 0x0 で開始されることを想定して

います。これは、ARM プロセッサベースのシステムの標準の動作です。ただし、一

部の ARM プロセッサでは、命令フェッチを 0xFFFF0000 から開始するように設定でき

ます。

起動時にはアドレス 0x0 に有効な命令が存在している必要があるため、電源オンリ

セット時に不揮発性メモリが 0x0 に配置されるようにする必要があります。1 つの方

法としては、ROM を 0x0 に配置することができます。ただし、この設定にはいくつ

かの欠点があります。

3.15.1 ROM/RAM のリマップの例

以下の例に、リセット後に ROM/RAM のリマップを実装するソリューションを示し

ます。この例に示されている定数は Versatile ボードに固有のものですが、リマップ

を同様の方法で実装するどのプラットフォームにも同じ方法を使用できます。スキャッタロード記述ファイルでは、リマップ後のメモリマップを記述する必要があります。

例 3-5 ROM/RAM のリマップ

; シス テム メ モ リ の場所

Versatile_ctl_reg EQU 0x101E0000 ; 制御レジス タ のア ド レ ス

DEVCHIP_Remap_bit EQU 0x100 ; ビ ッ ト 8 は制御レジス タ の リ マ ッ プ ビ ッ ト ENTRY; コ ー ド の実行は リ セ ッ ト時に こ こ か ら開始される

; リ セ ッ ト時、 ROM のエ イ リ ア スは 0x0 にあるため、 '実際の ' ROM にジ ャ ン プする LDR pc, =Instruct_2Instruct_2; 制御レジス タ の リ マ ッ プ ビ ッ ト を設定し て リ マ ッ プする

; 制御レジス タ の ビ ッ ト 8 に 1 を書き込んで DEVCHIP_Remap_bit を ク リ アする LDR R1, =Versatile_ctl_reg LDR R0, [R1] ORR R0, R0, #DEVCHIP_Remap_bit STR R0, [R1]; RAM が 0x0 に配置される

; 例外ベ ク タ を ROM か ら RAM に コ ピーする必要がある

; コ ピー処理は、 __main 内の C ラ イ ブ ラ リ コ ー ド に よ っ て後で実行される

; こ こ に Reset_Handler を配置する

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-22ID 011811 Non-Confidential

Page 57: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.16 ローカルメモリのセットアップに関する注意事項

多くの ARM プロセッサには、MMU や MPU などのオンチップメモリ管理システム

が搭載されています。通常、これらのデバイスは、システムの起動時にセットアップされ有効にされます。そのため、ローカルメモリシステムを搭載するプロセッサの初期化シーケンスには、特別な配慮が必要です。

__main の C ライブラリ初期化コードでは、イメージの実行時メモリマップがセット

アップされます。そのため、プロセッサのランタイムメモリビューは、__main への分

岐の前にセットアップする必要があります。つまり、MMU または MPU は、リセッ

トハンドラ内でセットアップし有効にする必要があります。

また、一般的に、コードとデータは TCM にスキャッタロードされるため、TCM も __main への分岐の前(通常は MMU または MPU のセットアップの前)に有効にする

必要があります。TCM が有効になっている場合には、TCM によってマスクされるメ

モリにアクセスする必要がないということに注意する必要があります。

また、__main への分岐の前にキャッシュが有効にされた場合は、キャッシュコヒーレ

ンシに関する問題も発生します。__main のコードは、実質的には命令をデータとして

処理し、コード領域をロードアドレスから実行アドレスにコピーします。その結果、一部の命令はデータキャッシュ内にキャッシュされる可能性があり、その場合、これらの命令が命令パスから見えなくなります。

このようなコヒーレンシの問題を回避するには、C ライブラリ初期化シーケンスの

実行が完了した後にキャッシュを有効にします。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-23ID 011811 Non-Confidential

Page 58: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.17 スタックポインタの初期化

リセットハンドラは、少なくとも、アプリケーションで使用される実行モードのスタックポインタに初期値を割り当てる必要があります。

3.17.1 スタックポインタの初期化の例

この例では、スタックが stack_base に配置されます。

例 3-6 スタックポインタの初期化

; ***************************************************************; こ の例は、 ARMv6-M および ARMv7-M プ ロ フ ァ イ ルには適用されない; ***************************************************************Len_FIQ_Stack EQU 256Len_IRQ_Stack EQU 256stack_base DCD 0x18000;Reset_Handler

; stack_base を上に定義するか、 ま たはスキ ャ ッ タ フ ァ イ ルに配置するLDR R0, stack_base ;; 各モード を順に入力し、 ス タ ッ ク ポ イ ン タ を設定する

MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; 割り込みを無効にするMOV sp, R0SUB R0, R0, #Len_FIQ_StackMSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit ; 割り込みを無効にするMOV sp, R0SUB R0, R0, #Len_IRQ_StackMSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit ; 割り込みを無効にするMOV sp, R0; プ ロセ ッ サを SVC モー ド に保つ

この stack_base シンボルにはハードコーディングされたアドレスを指定することがで

きます。または、別のアセンブラソースファイルで定義し、スキャッタロード記述ファイルによって配置することもできます。

この例では、高速割り込み要求(FIQ)モードおよび割り込み要求(IRQ)モードに 256 バイトのスタックを割り当てていますが、他の実行モードにも同じように割り当

てることができますスタックポインタをセットアップするには、割り込みを無効にして各モードに入り、スタックポインタに適切な値を割り当てます。

リセットハンドラでセットアップされるスタックポインタの値は、C ライブラリ初

期化コードにより、パラメータとして __user_initial_stackheap() に自動的に渡されま

す。そのため、この値は __user_initial_stackheap() によって変更することはできませ

ん。

3.17.2 関連項目

タスク

『リンカの使用』:

• 「スキャッタロード記述ファイルを使用したスタックとヒープの指定」 (ページ 8-12)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-24ID 011811 Non-Confidential

Page 59: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.18 ハードウェアの初期化

注 これは、ARMv6-M および ARMv7-M プロファイルには適用されません。

一般的に、システム初期化コードはすべてメインアプリケーションから切り離した方が有効です。ただし、キャッシュや割り込みの有効化など、システム初期化のいくつかのコンポーネントは、C ライブラリ初期化コードの実行後に実行される必要

があります。

$Sub および $Super という関数ラッパシンボルを使用すると、メインアプリケーショ

ンに入る直前に実行されるルーチンを(効果的に)挿入できます。このメカニズムにより、ソースコードを変更することなく、関数を拡張できます。

以下の例は、この $Sub および $Super の使用方法を示しています。

例 3-7 $Sub と $Super の使用方法

extern void $Super$$main(void);void $Sub$$main(void){ cache_enable(); // キ ャ ッ シ ュ を有効にする

int_enable(); // 割り込みを有効にする

$Super$$main(); // 元の main() を呼び出す}

リンカは、main() への関数呼び出しを、$Sub$$main() への呼び出しに置き換えます。

ここからキャッシュを有効にするルーチンと割り込みを有効にする別のルーチンを呼び出すことができます。

このコードは、$Super$$main() を呼び出すことで、実際の main() に分岐します。

3.18.1 関連項目

概念

『リンカの使用』:

• 「$Super$$ と $Sub$$ を使用したシンボル定義へのパッチの適用」 (ページ 7-30)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-25ID 011811 Non-Confidential

Page 60: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.19 実行モードに関する注意事項

注 これは、ARMv6-M および ARMv7-M プロファイルには適用されません。

メインアプリケーションを実行するモードを検討する必要があります。選択するモードによって、システムの初期化の実装方法が異なります。

起動時にリセットハンドラおよび $Sub$$main の両方で実装する可能性のある多くの機

能は、特権モードで実行する場合にしか使用できません。例えば、オンチップメモリの操作や割り込みの有効化などが挙げられます。

アプリケーションを特権モードで実行する場合、これは問題になりません。リセットハンドラを終了する前に適切なモードに変更するようにして下さい。

アプリケーションをユーザモードで実行する場合は、必要なタスクを特権モードで実行した後にしかユーザモードに変更できません。通常、この変更は $Sub$$main() で行われます。

注 C ライブラリ初期化コードは、アプリケーションと同じスタックを使用する必要が

あります。$Sub$$main で非ユーザモードを使用し、アプリケーションでユーザモード

を使用する必要がある場合は、ユーザモードスタックポインタを使用するシステムモードのリセットハンドラを終了する必要があります。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-26ID 011811 Non-Confidential

Page 61: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

組み込みソフトウェアの開発

3.20 ターゲットハードウェアおよびメモリマップ

これまでのセクションでは、スキャッタロード記述ファイルでのコードとデータの配置について説明してきました。ただし、ターゲットハードウェアのペリフェラルの位置と、スタックリミットとヒープリミットは、ソースファイルまたはヘッダファイルでハードコーディングされていることを前提としていました。ターゲットのメモリマップに関するすべての情報を記述ファイルに保存して、ソースコードから絶対アドレスへのすべての参照を削除することを推奨します。

通常、ペリフェラルレジスタのアドレスは、プロジェクトのソースファイルまたはヘッダファイルにハードコーディングされています。また、ペリフェラルレジスタにマップされる構造体を宣言し、これらの構造体をスキャッタロード記述ファイルに配置することもできます。

例えば、32 ビットのメモリマップレジスタを 2 つ使用するタイマペリフェラルが

ターゲットに実装されている場合、これらのレジスタにマップされる C の構造体は

以下のようになります。

例 3-8 ペリフェラルレジスタへのマップ

__attribute__ ((zero_init)) struct{ volatile unsigned ctrl; /* タ イ マ制御 */ volatile unsigned tmr; /* タ イ マ値 */} timer_regs;

この構造体をメモリマップ内の特定のアドレスに配置するには、構造体を定義するモジュールを含む実行領域を作成できます。以下の例は、TIMER という実行領域を示

します。この実行領域は、timer_regs 構造体を 0x40000000 に配置します。

例 3-9 マップされた構造体の配置

ROM_LOAD 0x24000000 0x04000000{; ...TIMER 0x40000000 UNINIT { timer_regs.o (+ZI) } ; ...}

レジスタの内容は、アプリケーションの起動時にゼロで初期化しないことが重要です。ゼロで初期化するとシステムの状態が変更される場合があります。実行領域に UNINIT 属性を指定すると、その領域内の ZI データが __main によってゼロで初期化さ

れるのを防ぐことができます。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 3-27ID 011811 Non-Confidential

Page 62: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

第 4 章 C、C++、およびアセンブリ言語の混用

以下の各トピックでは、ARM アーキテクチャ向けに C、C++、およびアセンブリ言語の

混合コードを記述する方法について説明します。

• 「命令の組み込み関数、インラインアセンブラ、および組み込みアセンブラ」 (ページ 4-2)

• 「アセンブリコードから C グローバル変数へのアクセス」 (ページ 4-4)• 「C++ からのシステム C ヘッダファイルのインクルード」 (ページ 4-5)• 「C++ からの独自の C ヘッダファイルのインクルード」 (ページ 4-6)• 「混合言語プログラミング」 (ページ 4-7)• 「C、C++、およびアセンブリ言語間の呼び出しに関する規則」 (ページ 4-8)• 「C およびアセンブリ言語からの C++ 関数の呼び出しに関する規則」 (ページ 4-9)• 「C++ に関する情報」 (ページ 4-10)• 「言語間の呼び出しのサンプル」 (ページ 4-11)• 「C からのアセンブリ言語の呼び出し」 (ページ 4-12)• 「アセンブリ言語からの C の呼び出し」 (ページ 4-13)• 「C++ からの C の呼び出し」 (ページ 4-14)• 「C++ からのアセンブリ言語の呼び出し」 (ページ 4-15)• 「C からの C++ の呼び出し」 (ページ 4-16)• 「アセンブリ言語からの C++ の呼び出し」 (ページ 4-17)• 「C 言語またはアセンブリ言語からの C++ 言語の呼び出し」 (ページ 4-18)• 「C 言語と C++ 言語間での参照の受け渡し」 (ページ 4-21)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-1ID 011811 Non-Confidential

Page 63: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.1 命令の組み込み関数、インラインアセンブラ、および組み込みアセンブラ

コンパイラには、C または C++ 言語から直接アクセスできないターゲットプロセッ

サの機能を使用するために、命令の組み込み関数、インラインアセンブラ、および組み込みアセンブラが組み込まれています。以下に例を示します。

• 飽和算術演算

• カスタムコプロセッサ

• プログラム状態レジスタ(PSR)

命令の組み込み関数

命令の組み込み関数を使用すると、アセンブリ言語による複雑な実装手段をとらずに、C および C++ ソースコードにターゲットプロセッサの機

能を簡単に組み込むことができます。命令の組み込み関数は、C または C++ の関数呼び出しのように見えますが、コンパイル時にアセンブリ言

語の命令に置き換えられます。

注 命令の組み込み関数は、ARM 命令セットに固有なので、その他のアー

キテクチャには移植できません。

インラインアセンブラ

インラインアセンブラでは、C および C++ 言語とのインターワークがサ

ポートされています。どのレジスタオペランドにも、任意の C または C++ の式を使用できます。また、インラインアセンブラでは、複雑な命

令を展開し、アセンブリ言語コードを 適化します。

注 出力オブジェクトコードは、コンパイラによって 適化されるために入

力と完全に一致しない場合があります。

組み込みアセンブラ

組み込みアセンブラを使用すると、アセンブラディレクティブを含む、すべての ARM アセンブラ命令セットを使用できます。組み込みアセン

ブリコードは、C および C++ で記述されたコードとは別にアセンブルさ

れます。コンパイルされたオブジェクトは、生成された後、C および C++ のソースのコンパイルによって生成されたオブジェクトと結合され

ます。

以下の表は、命令の組み込み関数、インラインアセンブラ、および組み込みアセンブラの主な相違点について説明しています。

表 4-1 相違点

機能 命令の組み込み関数 インラインアセンブラ 組み込みアセンブラ

命令セット ARM および Thumb。 ARM のみ。 ARM および Thumb。

ARM アセンブラディレク

ティブ

サポートされていません。

サポートされていません。

すべてサポートされています。

C または C++ の式 C または C++ のすべて

の式。

C または C++ のすべて

の式。

定数式のみ。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-2ID 011811 Non-Confidential

Page 64: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.1.1 関連項目

タスク

『コンパイラの使用』:

• 第 8 章 ARM コンパイラのインラインアセンブラと組み込みアセンブラの使用

概念

『コンパイラの使用』:

• 「コンパイラ組み込み関数」 (ページ 5-5)

『アセンブラの使用』:

• 「サチュレート命令」 (ページ 3-103)

参照

『コンパイラリファレンス』:

• 「命令のコンパイラ組み込み関数」 (ページ 5-69)

アセンブリコードの 適化 完全に 適化されます。 完全に 適化されます。

適化されません。

インライン展開 自動的にインライン展開されます。

自動的にインライン展開されます。

正しいサイズとリンカのインライン展開が有効になっていると、リンカによってインライン展開できます。

レジスタへのアクセス 物理レジスタ(PC、LR、および SP を含

む)。

PC、LR、および SP 以外の仮想レジスタ。

物理レジスタ(PC、LR、および SP を含む)。

復帰命令 自動的に生成されます。 自動的に生成されます。BX、BXJ、および BLX 命令はサポートされていません。

コードに追加する必要があります。

BKPT 命令 サポートされています。 サポートされていません。

サポートされています。

表 4-1 相違点 (続き)

機能 命令の組み込み関数 インラインアセンブラ 組み込みアセンブラ

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-3ID 011811 Non-Confidential

Page 65: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.2 アセンブリコードから C グローバル変数へのアクセス

グローバル変数には、その変数のアドレスを使用して間接的にしかアクセスできません。グローバル変数にアクセスするには、IMPORT ディレクティブを使用してグロー

バル変数をインポートし、アドレスをレジスタにロードします。そのグローバル変数には、その型によって、ロード命令およびストア命令を使用してアクセスできます。

符号なし変数には、以下の命令を使用します。

• char 型の場合は LDRB または STRB• short 型の場合は LDRH または STRH• int 型の場合は LDR または STR

符号付き変数では、LDRSB や LDRSH など、上記の命令と等価な符号付き命令を使用しま

す。

8 ワード未満の小さな構造体全体には、LDM および STM 命令を使用してアクセスできま

す。構造体の各メンバには、適切なタイプのロード命令またはストア命令を使用してアクセスできます。各メンバにアクセスするには、構造体の開始位置からメンバのオフセットを把握しておく必要があります。

以下の例では、整数のグローバル変数 globvar のアドレスを R1 にロードし、そのアド

レスに格納された値を R0 にロードして 2 を加算してから、その新しい値を globvar に返します。

例 4-1 グローバル変数へのアクセス

PRESERVE8 AREA globals,CODE,READONLY EXPORT asmsubroutine IMPORT globvarasmsubroutine LDR R1, =globvar ; globvar のア ド レ ス を R1 に読み込む

LDR R0, [R1] ; globvar の値を ロー ドする ADD R0, R0, #2 STR R0, [R1] ; 新しい値を globvar に格納する BX lr END

4.2.1 関連項目

概念

『アセンブラの使用』:

• 第 3 章 ARM 命令と Thumb 命令

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-4ID 011811 Non-Confidential

Page 66: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.3 C++ からのシステム C ヘッダファイルのインクルード

C ヘッダファイルを C++ からインクルードするには、extern "C" ディレクティブで

ラップする必要があります。標準システム C ヘッダファイルには適切な extern "C" ディレクティブが含まれているので、インクルードするために特別な手順を実行する必要はありません。#include 構文により、使用するネームスペースが決定されるの

で、アクセスのタイプも決定されます。

以下に例を示します。

#include <stdio.h>int main(){ ... // C++ コ ー ド return 0;}

この構文を使用してヘッダをインクルードすると、すべてのライブラリ名がグローバルネームスペースに配置されます。

C++ 標準では、C ヘッダファイルの機能が C++ 固有のヘッダファイルから使用でき

るように定義されています。これらのファイルは、標準 C ヘッダファイルと共に install_directory\include にインストールされ、通常の方法で参照できます。以下に

例を示します。

#include <cstdio>

ARM C++ では、C ヘッダファイルのインクルード(#include)が行われます。この構

文を使用してヘッダをインクルードすると、C ライブラリの名前を含む、C++ 標準ラ

イブラリ名のすべてがネームスペース std 内で定義されます。つまり、すべてのライ

ブラリ名は、以下のいずれかの方法を使用して修飾する必要があります。

• 以下のように標準ネームスペースを指定します。

std::printf("example\n");

• 以下のように C++ キーワードの using を使用して名前をグローバルネームス

ペースにインポートします。

using namespace std;printf("example\n");

• コンパイラオプション --using_std を使用します。

4.3.1 関連項目

参照

『コンパイラリファレンス』:

• 「--using_std、--no_using_std」 (ページ 3-132)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-5ID 011811 Non-Confidential

Page 67: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.4 C++ からの独自の C ヘッダファイルのインクルード

独自の C ヘッダファイルをインクルードするには、#include ディレクティブを extern "C" ステートメントでラップする必要があります。以下の方法で行うことができま

す。

• ファイルのインクルード(#include)時にラップします(次の例を参照)。

• extern "C" ステートメントをヘッダファイルに追加してラップします(「ヘッダ

ファイル内に配置されたディレクティブ」の例を参照)。

例 4-2 インクルードファイルの前に配置されたディレクティブ

// C++ コ ー ドextern "C" {#include "my-header1.h"#include "my-header2.h"}int main(){ // ... return 0;}

例 4-3 ヘッダファイル内に配置されたディレクティブ

/* C ヘ ッ ダ フ ァ イ ル */#ifdef __cplusplus /* extern C 構文の先頭を挿入 */extern "C" {#endif/* ヘ ッ ダ フ ァ イ ルの本文 */#ifdef __cplusplus /* extern C 構文の末尾を挿入。 */} /* C ヘ ッ ダ フ ァ イ ルを */#endif /* C ま たは C++ コ ー ド に イ ン ク ルー ド でき る。 */

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-6ID 011811 Non-Confidential

Page 68: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.5 混合言語プログラミング

ARM アーキテクチャ向けプロシージャコール標準(AAPCS)に準拠している場合

は、C、C++、およびアセンブリ言語で記述したルーチン間の呼び出しを混在させる

ことができます。

注 このセクションの情報は実装に依存するものであり、今後のリリースで変更される

可能性があります。

組み込みアセンブラを使用し、Base Standard Application Binary Interface for the ARM Architecture(BSABI)に準拠することで、複数言語を混用したプログラミングを簡

単に実装できるようになります。これにより、以下の内容がサポートされます。

• __cpp キーワードを使用した名前の符号化

• 暗黙の this パラメータを渡す方法

• 仮想関数の呼び出し方法

• 参照の表現

• ベースクラスまたは仮想メンバ関数を持つ C++ クラス型のレイアウト

• Plain Old Data Structure (PODS)構造体以外のクラスオブジェクトを渡す方法

4.5.1 関連項目

概念

• 「C、C++、およびアセンブリ言語間の呼び出しに関する規則」 (ページ 4-8)

• 「C およびアセンブリ言語からの C++ 関数の呼び出しに関する規則」 (ページ 4-9)

『コンパイラの使用』:

• 「コンパイラ」 (ページ 2-2).

参照

• 『Application Binary Interface for the ARM Architecture』(Base Standard), http://infocenter.arm.com/help/topic/com.arm.doc.ihi0036-/index.html

• 『Procedure Call Standard for the ARM Architecture』, http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042-/index.html

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-7ID 011811 Non-Confidential

Page 69: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.6 C、C++、およびアセンブリ言語間の呼び出しに関する規則

C、C++、およびアセンブリ言語間の呼び出しには、以下の一般規則が適用されま

す。

• C の呼び出し規則を使用します。

• C ヘッダファイルを C++ からインクルードするには、extern "C" ディレクティブ

でラップする必要があります。

• C++ では、非メンバ関数を extern "C" として宣言し、C リンケージを使用するよ

うに指定できます。ARM コンパイラツールチェーンの本リリースでは、C リン

ケージを使用すると、関数を定義するシンボルが符号化されません。C リン

ケージを使用すると、ある言語で関数を実装し、その関数を別の言語から呼び出すことができます。

注 extern "C" として宣言される関数はオーバーロードできません。

• アセンブリ言語モジュールは、アプリケーションで使用されているメモリモデルに適した AAPCS 標準に準拠する必要があります。

4.6.1 関連項目

概念

• 「混合言語プログラミング」 (ページ 4-7)

• 「C およびアセンブリ言語からの C++ 関数の呼び出しに関する規則」 (ページ 4-9)

『コンパイラの使用』:

• 「コンパイラ」 (ページ 2-2).

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-8ID 011811 Non-Confidential

Page 70: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.7 C およびアセンブリ言語からの C++ 関数の呼び出しに関する規則

C およびアセンブリ言語からの C++ 関数の呼び出しには、以下の規則が適用されま

す。

• C++ のグローバル(非メンバ)関数を呼び出すには、この関数を extern "C" として宣言して、C リンケージを指定します。

• メンバ関数(スタティック関数と非スタティック関数の両方)の名前は必ず符号化する必要があります。組み込みアセンブラの __cpp キーワードを使用する

と、符号化された名前を手動で検索する必要がなくなります。

• C++ インライン関数は、C++ コンパイラでその関数のアウトオブラインコピー

が生成されるようにした場合を除き、C から呼び出すことができません。例え

ば、この関数のアドレスを取得すると、アウトオブラインコピーが生成されます。

• 非スタティックメンバ関数は、暗黙の this パラメータを R0 の 初の引数として

受け取ります。また、この関数が int に類似していない構造体を返す場合は、R1 の 2 番目の引数として受け取ります。スタティックメンバ関数は、暗黙の this パラメータを受け取りません。

4.7.1 関連項目

概念

• 「混合言語プログラミング」 (ページ 4-7)

• 「C、C++、およびアセンブリ言語間の呼び出しに関する規則」 (ページ 4-8)

『コンパイラの使用』:

• 「コンパイラ」 (ページ 2-2).

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-9ID 011811 Non-Confidential

Page 71: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.8 C++ に関する情報

以下の情報は、C++ のみに当てはまります。

4.8.1 C++ の呼び出し規則

ARM C++ では、1 つの例外を除き、ARM C と同じ呼び出し規則が使用されます。

• 非スタティックメンバ関数は、暗黙の this パラメータを 初の引数として、ま

たは呼び出される関数が int に類似していない struct を返す場合は 2 番目の引

数として使用することで呼び出されます。この規則は今後の実装で変更される可能性があります。

4.8.2 C++ データ型

ARM C++ では、以下の例外と追加点を除き、ARM C と同じデータ型が使用されま

す。

• struct 型または class 型の C++ オブジェクトには、ベースクラスまたは仮想関

数が含まれていない場合に ARM C で予測されるレイアウトと同じレイアウト

が使用されます。このような struct 型のオブジェクトにユーザ定義のコピー代

入演算子もユーザ定義のデストラクタも含まれていない場合、このオブジェクトは Plain Old Data 構造体として処理されます。

• 参照はポインタとして表現されます。

• C 関数へのポインタと C++ 非メンバ関数へのポインタは区別されません。

4.8.3 シンボル名の符号化

リンカは、メッセージ内のシンボル名を符号化しません。

C で記述する名前は、C++ プログラムでは extern "C" として宣言する必要がありま

す。この宣言は、既に ARM ISO C ヘッダで行われています。

4.8.4 関連項目

参照

• 「混合言語プログラミング」 (ページ 4-7)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-10ID 011811 Non-Confidential

Page 72: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.9 言語間の呼び出しのサンプル

以下のコード例では、複数言語の呼び出しを混用する方法を示します。

• 「C からのアセンブリ言語の呼び出し」 (ページ 4-12)• 「アセンブリ言語からの C の呼び出し」 (ページ 4-13)• 「C++ からの C の呼び出し」 (ページ 4-14)• 「C++ からのアセンブリ言語の呼び出し」 (ページ 4-15)• 「C からの C++ の呼び出し」 (ページ 4-16)• 「アセンブリ言語からの C++ の呼び出し」 (ページ 4-17)• 「C 言語またはアセンブリ言語からの C++ 言語の呼び出し」 (ページ 4-18)• 「C 言語と C++ 言語間での参照の受け渡し」 (ページ 4-21)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-11ID 011811 Non-Confidential

Page 73: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.10 C からのアセンブリ言語の呼び出し

アセンブリ言語ルーチンを C から呼び出すには、EXPORT ディレクティブを使用して関

数シンボルをエクスポートする必要があります。

例 4-4 アセンブリ言語を使用したストリングコピーサブルーチン

PRESERVE8 AREA SCopy, CODE, READONLY EXPORT strcopystrcopy ; R0 はデス テ ィ ネーシ ョ ン文字列を指す

; R1 はソース文字列を指す

LDRB R2, [R1],#1 ; バイ ト を ロー ド し、 ア ド レ ス を更新する

STRB R2, [R0],#1 ; バイ ト を格納し、 ア ド レ ス を更新する

CMP R2, #0 ; NULL 終端文字をチ ェ ッ ク する

BNE strcopy ; NULL でない場合は続行する

BX lr ; 復帰 END

このアセンブリ言語サブルーチンを C から呼び出すには、extern を使用して宣言しま

す。

例 4-5 C からのアセンブリ言語の呼び出し

#include <stdio.h>extern void strcopy(char *d, const char *s);int main(){ const char *srcstr = "First string - source "; char dststr[] = "Second string - destination ";/* dststr は、 変更対象の配列 */ printf("Before copying:\n"); printf(" %s\n %s\n",srcstr,dststr); strcopy(dststr,srcstr); printf("After copying:\n"); printf(" %s\n %s\n",srcstr,dststr); return (0);}

4.10.1 関連項目

概念

• 「アセンブリ言語からの C の呼び出し」 (ページ 4-13)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-12ID 011811 Non-Confidential

Page 74: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.11 アセンブリ言語からの C の呼び出し

以下の例は、アセンブラコードから呼び出される C 関数です。

例 4-6 C 言語における関数の定義

int g(int a, int b, int c, int d, int e){ return a + b + c + d + e;}

この C 関数をアセンブリ言語から呼び出すには、g 関数シンボルを IMPORT ディレク

ティブと共に指定します。

例 4-7 アセンブリ言語の呼び出し

; int f(int i) { return g(i, 2*i, 3*i, 4*i, 5*i); } PRESERVE8 EXPORT f AREA f, CODE, READONLY IMPORT g ; i は R0 内 STR lr, [sp, #-4]!; lr を保持する

ADD R1, R0, R0 ; 2*i (第 2 パ ラ メ ー タ) を計算する

ADD R2, R1, R0 ; 3*i (第 3 パ ラ メ ー タ) を計算する

ADD R3, R1, R2 ; 5*i を計算する

STR R3, [sp, #-4]!; ス タ ッ ク の第 5 パ ラ メ ー タ

ADD R3, R1, R1 ; 4*i (第 4 パ ラ メ ー タ) を計算する

BL g ; C 関数に分岐する

ADD sp, sp, #4 ; 第 5 パ ラ メ ー タ を削除する

LDR pc, [sp], #4 ; 復帰 END

4.11.1 関連項目

概念

• 「C からのアセンブリ言語の呼び出し」 (ページ 4-12)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-13ID 011811 Non-Confidential

Page 75: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.12 C++ からの C の呼び出し

以下の例は、C++ から呼び出される C 関数です。

例 4-8 C 言語における関数の定義

struct S { int i;};void cfunc(struct S *p) {/* C++ か ら呼び出される C 関数の定義 */ p->i += 5;}

この C 関数を C++ から呼び出すには、extern "C" を使用して宣言します。

例 4-9 C++ 言語からの C 関数の呼び出し

struct S { // ベース ク ラ ス または

// 仮想関数が含まれていない S(int s) : i(s) { } int i;};extern "C" void cfunc(S *);// C++ か ら呼び出される C 関数を宣言するint f(){ S s(2); // 's' を初期化する

cfunc(&s); // 'cfunc' を呼び出し て 's' を変更でき る よ う にする return s.i * 3;}

4.12.1 関連項目

概念

• 「C++ からのアセンブリ言語の呼び出し」 (ページ 4-15)

• 「C からの C++ の呼び出し」 (ページ 4-16)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-14ID 011811 Non-Confidential

Page 76: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.13 C++ からのアセンブリ言語の呼び出し

アセンブリ言語ルーチンを C++ から呼び出すには、EXPORT ディレクティブを使用して

関数シンボルをエクスポートする必要があります。

例 4-10 アセンブリ言語で記述された関数の定義

PRESERVE8 AREA Asm, CODE EXPORT asmfuncasmfunc ; C++ か ら呼び出される

LDR R1, [R0] ; Asm 関数の定義 ADD R1, R1, #5 STR R1, [R0] BX lr END

アセンブリ言語ルーチンを C++ から呼び出すには、extern "C" を使用して宣言しま

す。

例 4-11 C++ 言語からのアセンブリ言語の呼び出し

struct S { // ベース ク ラ ス ま たは

// 仮想関数が含まれていない S(int s) : i(s) { } int i;};extern "C" void asmfunc(S *); // 呼び出される Asm 関数を

// 宣言するint f() { S s(2); // 's' を初期化する

asmfunc(&s); // 'asmfunc' を呼び出し て

// 's' を変更でき る よ う にする return s.i * 3;}

4.13.1 関連項目

概念

• 「C++ からの C の呼び出し」 (ページ 4-14)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-15ID 011811 Non-Confidential

Page 77: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.14 C からの C++ の呼び出し

C++ 関数を C から呼び出すには、extern "C" を使用して C++ 関数を定義します。

例 4-12 C から呼び出される C++ 関数の定義

struct S { // ベース ク ラ ス ま たは仮想関数が含まれていない S(int s) : i(s) { } int i;};extern "C" void cppfunc(S *p) {// C か ら呼び出される C++ 関数の定義

// こ の関数は C++ で記述されている。 リ ン ケージのみが C。 p->i += 5;}

C では、extern を使用して C++ 関数を宣言します。

例 4-13 C 言語での関数の宣言と呼び出し

struct S { int i;};extern void cppfunc(struct S *p);/* C か ら呼び出される C++ 関数の宣言 */int f(void) { struct S s; s.i = 2; /* 's' を初期化する */ cppfunc(&s); /* 'cppfunc' を呼び出し て */ /* 's' を変更でき る よ う にする */ return s.i * 3;}

4.14.1 関連項目

概念

• 「C からのアセンブリ言語の呼び出し」 (ページ 4-12)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-16ID 011811 Non-Confidential

Page 78: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.15 アセンブリ言語からの C++ の呼び出し

C++ 関数をアセンブリ言語から呼び出すには、extern "C" 宣言を使用します。

例 4-14 C++ で呼び出される関数の定義

struct S { // ベース ク ラ ス または仮想関数が含まれていない S(int s) : i(s) { } int i;};extern "C" void cppfunc(S * p) {// ASM か ら呼び出される C++ 関数の定義

// 本体は C++。 リ ン ケージのみが C。 p->i += 5;}

ARM アセンブリ言語では、C++ 関数の名前をインポートし、リンク付き分岐(BL)

命令を使用してその関数を呼び出します。

例 4-15 アセンブリ言語で記述された関数の定義

AREA Asm, CODE IMPORT cppfunc ; Asm か ら呼び出される ; C++ 関数の名前を イ ンポー トする EXPORT ff STMFD sp!,{lr} MOV R0,#2 STR R0,[sp,#-4]!; struct を初期化する

MOV R0,sp ; 引数は struct へのポイ ン タ

BL cppfunc ; 'cppfunc' を呼び出し て struct を変更でき る よ う にするLDR R0, [sp], #4

ADD R0, R0, R0,LSL #1 LDMFD sp!,{pc} END

4.15.1 関連項目

概念

• 「C++ からのアセンブリ言語の呼び出し」 (ページ 4-15)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-17ID 011811 Non-Confidential

Page 79: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.16 C 言語またはアセンブリ言語からの C++ 言語の呼び出し

この例では、非スタティックな非仮想 C++ メンバ関数を C から呼び出す方法を示し

ます。

例 4-16 C++ メンバ関数の呼び出し

struct T { T(int i) : t(i) { } int t; int f(int i);};int T::f(int i) { return i + t; }// C か ら呼び出される C++ 関数の定義extern "C" int cfunc(T*);// C++ か ら呼び出される C 関数の宣言int f() { T t(5); // T 型のオ ブジ ェ ク ト を作成する return cfunc(&t);}

関数の符号化された名前を参照するには、コンパイラのアセンブラ出力を使用して下さい。例えば、このコードがファイル test.cpp に含まれている場合は、以下のコマ

ンドを入力します。

armcc -c --cpp --asm test.cpp

以下の内容を含むアセンブラファイル test.s が生成されます。

... AREA ||.text||, CODE, READONLY, ALIGN=2

_Z1fv PROC PUSH {r3,lr} MOV r0,#5 STR r0,[sp,#0] MOV r0,sp BL cfunc POP {r3,pc} ENDP

_ZN1T1fEi PROC LDR r0,[r0,#0] ADD r0,r0,r1 BX lr ENDP...

符号化された名前 _ZN1T1fEi を使用して、C 関数を定義します。

例 4-17 C 関数の定義

struct T;extern int _ZN1T1fEi(struct T*, int); /* 呼び出される C++ 関数の */ /* 符号化された名前 */int cfunc(struct T* t) {

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-18ID 011811 Non-Confidential

Page 80: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

/* C++ か ら呼び出される C 関数の定義 */ return 3 * _ZN1T1fEi(t, 2); /* like '3 * t->f(2)' */}

アセンブリ言語で関数を実装するには、以下のように記述します。

例 4-18 アセンブリ言語での関数の実装

EXPORT cfunc AREA foo, CODE IMPORT _ZN1T1fEicfunc STMFD sp!,{lr} ; R0 には既にオ ブジ ェ ク ト ポ イ ン タ が含まれている MOV R1, #2 BL _ZN1T1fEi ADD R0, R0, R0, LSL #1 ; 3 で乗算する LDMFD sp!,{pc} END

または、組み込みアセンブリを使用して、C++ メンバ関数およびアセンブリ言語の

関数への呼び出しを実装できます。この例では、関数の参照に __cpp キーワードが使

用されます。そのため、関数の符号化された名前を把握しておく必要はありません。

例 4-19 組み込みアセンブリでの関数の実装

struct T { T(int i) : t(i) { } int t; int f(int i);};int T::f(int i) { return i + t; }// C++ か ら呼び出される asm 関数の定義__asm int asm_func(T*) { STMFD sp!, {lr} MOV R1, #2; BL __cpp(T::f); ADD R0, R0, R0, LSL #1 ; 3 で乗算する LDMFD sp!, {pc}}int f() { T t(5); // T 型のオ ブジ ェ ク ト を作成する return asm_func(&t);}

4.16.1 関連項目

概念

• 「C からのアセンブリ言語の呼び出し」 (ページ 4-12)

• 「C++ からのアセンブリ言語の呼び出し」 (ページ 4-15)

• 「アセンブリ言語からの C の呼び出し」 (ページ 4-13)

• 「アセンブリ言語からの C++ の呼び出し」 (ページ 4-17)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-19ID 011811 Non-Confidential

Page 81: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

参照 • 『ARM C ライブラリ、C++ ライブラリ、および浮動小数点サポートリファレン

ス』

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-20ID 011811 Non-Confidential

Page 82: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

C、C++、およびアセンブリ言語の混用

4.17 C 言語と C++ 言語間での参照の受け渡し

C 言語と C++ 言語間で参照を受け渡すには、extern "C" を使用します。

例 4-20 C++ 関数の定義

extern "C" int cfunc(const int&);// C++ か ら呼び出される C 関数の宣言

extern "C" int cppfunc(const int& r) {// C か ら呼び出される C++ 関数の定義 return 7 * r;}int f() { int i = 3; return cfunc(i); // ポ イ ン タ を 'i' に渡す}

C 関数で、extern を使用して C++ 参照を定義します。

例 4-21 C 関数の定義

extern int cppfunc(const int*);/* C か ら呼び出される C++ 関数の宣言 */int cfunc(const int *p) {/* C++ か ら呼び出される C 関数の定義 */ int k = *p + 4; return cppfunc(&k);}

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 4-21ID 011811 Non-Confidential

Page 83: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

第 5 章 ARM と Thumb のインターワーク

以下の各トピックでは、ARM および Thumb 命令セットを実装するプロセッサ用のコー

ドを記述する際に ARM 状態と Thumb 状態を切り替える方法について説明します。

• 「インターワークについて」 (ページ 5-2)• 「インターワークに適した状況」 (ページ 5-3)• 「アセンブリ言語のインターワーク」 (ページ 5-5)• 「C および C++ のインターワーク」 (ページ 5-6)• 「Thumb 状態の関数へのポインタ」 (ページ 5-7)• 「同一関数の 2 つのコピーの使用」 (ページ 5-8)• 「アセンブリ言語のインターワークの例」 (ページ 5-9)• 「ベニアを使用したインターワーク」 (ページ 5-11)• 「C 言語と C++ 言語のインターワーク」 (ページ 5-13)• 「ベニアを使用した C、C++、およびアセンブリ言語のインターワーク」 (ページ

5-15)

注 これらのトピックの内容は、ARMv6-M および ARMv7-M には適用されません。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-1ID 011811 Non-Confidential

Page 84: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.1 インターワークについて

インターワークを使用すると、ARM コードと Thumb コードを混用することにより、

以下の動作を実現できます。

• ARM ルーチンから Thumb 状態の呼び出し元への復帰

• Thumb ルーチンから ARM 状態の呼び出し元への復帰

つまり、インターワーク用のコードをコンパイルまたはアセンブルした場合、モジュールで使用される命令セットを考慮することなく、コードから異なるモジュールのルーチンを呼び出すことができます。コンパイラおよびアセンブラでは、両方とも --apcs=/interwork コマンドラインオプションを使用してインターワークを有効に

します。

ARM および Thumb 用にコンパイルまたはアセンブリされたコードは、AAPCS に準

拠していれば、自由に混在させることができます。

リンカで以下が検出された場合、エラーが生成されます。

• 呼ばれた側のルーチンがインターワーク用にビルドされていない直接的な ARM または Thumb インターワーク呼び出し

• 互換性のない AAPCS オプションを使用するアセンブリ言語ソースファイル

ARM リンカは、インターワーク関数が別の状態からいつ呼び出されるのかを検出し

ます。必要に応じて、呼び出し命令と復帰命令が変更され、ベニアと呼ばれる小さなコードセグメントが挿入されてプロセッサ状態が変更されます。

ARM アーキテクチャ v5T 以降では、特別な命令を使用しなくてもプロセッサ状態を

変更できます。ARMv5T 以降のプロセッサではインターワークによるオーバーヘッ

ドはほとんどありません。

注 ARMv5T 以降のアーキテクチャ用のコンパイルはインターワークを前提としており、

常にインターワークセーフのコードが生成されます。ただし、ARMv5T 用にビルド

されたアセンブリコードはインターワークを前提としていないため、--apcs=/interwork アセンブラオプションを使用してアセンブリコードをビルドする必要があります。

5.1.1 関連項目

リファレンス

• ARM アーキテクチャ向けプロシージャコール標準 , http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042-/index.html。

『アセンブラリファレンス』:

• 「--apcs=qualifier…qualifier」 (ページ 2-5)

その他の情報

『リンカリファレンス』:

• 「ベニアの概要」 (ページ 4-27)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-2ID 011811 Non-Confidential

Page 85: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.2 インターワークに適した状況

Thumb 命令をサポートする ARM プロセッサ用のコードを記述する場合、アプリケー

ションの大部分が Thumb 状態で実行されるようにビルドすることがほとんどです。

この方法を使用すると、コード密度を 大限に向上させることができます。さらに、8 ビット幅または 16 ビット幅のメモリを使用することで 高のパフォーマンスを得

ることができます。しかし、以下のような理由で、アプリケーションの一部を ARM 状態で実行する場合も考えられます。

速度 アプリケーションには、速度が重要になる部分があります。このような

セクションは、Thumb 状態よりも ARM 状態で実行した方が効率的な場

合があります。

例えば、小容量の高速 32 ビットメモリを実装しているシステムがある

とします。このメモリから ARM コードを実行する場合、8 ビットまた

は 16 ビットのメモリから各命令をフェッチすることによるオーバー

ヘッドが発生せずに済みます。

機能

Thumb 命令は、等価な ARM 命令に比べると柔軟性の点で劣ります。ま

た、操作によっては Thumb 状態では実行できないものもあります。以

下の操作を実行するには、ARM 状態に切り替える必要があります。

• 割り込みの有効や無効およびモードの切り替えを行うための CPSR へのアクセス

• コプロセッサへのアクセス

• C 言語で実行できない Digital Signal Processor(DSP)演算命令の実

例外処理

プロセッサ例外が発生すると、プロセッサは自動的に ARM 状態に移行

します。つまり、例外ハンドラが後で Thumb 状態に移行して例外のメ

イン処理を実行する場合でも、この例外ハンドラの 初の部分は ARM 命令でコーディングする必要があります。このような処理の 後にハンドラからメインアプリケーションに戻るには、プロセッサは ARM 状態

に戻る必要があります。

スタンドアロンの Thumb プログラム

Thumb 命令をサポートする ARM プロセッサは、常に ARM 状態で起動

します。単純な Thumb アセンブリ言語プログラムを実行するには、

Thumb 状態への切り替えを実行してからメイン Thumb ルーチンを呼び

出す ARM ヘッダを追加する必要があります。

注 速度または機能を理由とした ARM 状態への変更は、主に Thumb-2 をサポートしない

で Thumb だけをサポートするプロセッサで生じる問題です。Thumb-2 命令セットは、

ARM 命令セットとほぼ同一の機能を提供します。

5.2.1 関連項目

概念

• 「アセンブリ言語のインターワーク」 (ページ 5-5)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-3ID 011811 Non-Confidential

Page 86: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

参照

『アセンブラリファレンス』:

• 「CPS」 (ページ 3-149)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-4ID 011811 Non-Confidential

Page 87: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.3 アセンブリ言語のインターワーク

--apcs=/interwork コマンドラインオプションを使用すると、別のプロセッサ状態から

呼び出すことのできるコードを ARM アセンブラでアセンブルできます。

armasm --thumb --apcs=/interworkarmasm --arm --apcs=/interwork

アセンブリ言語のソースファイルには、いくつかのエリアを設けることができます。これらは、ARM Executable and Linkable Format(ELF)セクションに対応します。各

エリアは、ARM 命令と Thumb 命令の一方または両方を保持できます。

リンカを使用して、呼び出し元とは異なる命令セットを使用するルーチンとの間の呼び出しを設定できます。これを行うには、BL を使用してルーチンを呼び出します。

必要であれば、命令セットを明示的に変更するコードを記述することもできます。状況によっては、この方法で、サイズが小さいコードや実行速度が速いコードを記述できます。BX、BLX、LDR、LDM、および POP 命令を使用して、プロセッサ状態の変更

を実行できます。

ARM アセンブラでは、Thumb コードと ARM コードの両方をアセンブルできま

す。--thumb オプションを指定して呼び出さない限り、アセンブラはデフォルトで ARM コードをアセンブルします。

Thumb をサポートする ARM プロセッサは ARM 状態で起動されるため、BX 命令を使

用して Thumb 状態への分岐と切り替えを行い、以下のアセンブラディレクティブを

使用して、アセンブリモードを切り替えるようアセンブラに指定する必要があります。

ARM および THUMB ディレクティブを使用して、適切な命令セットの命令をアセンブル

するようアセンブラに指定できます。

5.3.1 関連項目

概念

• 「アセンブリ言語のインターワークの例」 (ページ 5-9)

• 「ベニアを使用したインターワーク」 (ページ 5-11)

参照

『アセンブラリファレンス』:

• 「--apcs=qualifier…qualifier」 (ページ 2-5)• 「--arm」 (ページ 2-6)• 「--thumb」 (ページ 2-26)• 「B、BL、BX、BLX、BXJ」 (ページ 3-124)• 「ARM、THUMB、THUMBX、CODE16、CODE32」 (ページ 6-64)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-5ID 011811 Non-Confidential

Page 88: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.4 C および C++ のインターワーク

--apcs=/interwork コマンドラインオプションを使用すると、別のプロセッサ状態から

呼び出すことのできる C および C++ コードをコンパイラでコンパイルできます。

armcc --thumb --apcs=/interworkarmcc --arm --apcs=/interwork

本体に関数呼び出しが含まれないリーフ関数の場合、コンパイラは、復帰命令 BX lr を生成します。

Thumb 状態の ARMv4T 用にビルドされた非リーフ関数では、コンパイラは例えば以

下のような 1 つの復帰命令を置き換える必要があります。

POP {R4-R7,pc}

この命令は、以下のようなシーケンスに置き換える必要があります。

POP {R4-R7} POP {R3} BX R3

これによるパフォーマンスへの影響はほとんどありません。

また、--apcs=/interwork オプションを使用すると、モジュールのコンパイルによって

生成されるコードエリアにインターワーク属性が設定されます。リンカでは、この属性を検出して適切なベニアを挿入します。ベニアによって使用される容量を確認するには、リンカコマンドラインオプション --info=veneers を使用します。

インターワークを使用するモジュールがないことが確実に分かっている場合を除き、ソースモジュールはすべてインターワーク用にコンパイルすることをお勧めします。

注 ARMv4T 以前のアーキテクチャのプロセッサには BX 命令が実装されていません。そ

のため、インターワーク用にコンパイルされた ARM コードは、ARMv4T 以降でしか

使用できません。

5.4.1 関連項目

参照

『コンパイラリファレンス』:

• 「--apcs=qualifer...qualifier」 (ページ 3-9)• 「--arm」 (ページ 3-13)• 「--thumb」 (ページ 3-124)

『リンカリファレンス』:• 「--info=topic[,topic,...]」 (ページ 2-77)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-6ID 011811 Non-Confidential

Page 89: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.5 Thumb 状態の関数へのポインタ

Thumb 関数(Thumb コードで構成されており、Thumb 状態で実行される関数)への

ポインタは、 下位ビットがセットされている必要があります。これにより、インターワークが正常に行われます。

リンカでは、Thumb 命令を参照するラベルの値を再配置するときに、再配置する値

の 下位ビットを自動的にセットします。Thumb 関数の絶対アドレスを使用した場

合、リンカではこの操作を実行できません。このため、コードで Thumb 関数の絶対

アドレスを使用する必要がある場合は、そのアドレスに 1 を加算する必要がありま

す。以下の例を参照して下さい。

例 5-1 Thumb 関数への絶対アドレス

typedef int (*FN)();myfunc() { FN fnptrs[] = { (FN)(0x8084 + 1), // 有効な Thumb ア ド レ ス

(FN)(0x8074) // 無効な Thumb ア ド レ ス }; FN* myfunctions = fnptrs; myfunctions[0](); // 呼び出しは成功

myfunctions[1](); // 呼び出しは失敗}

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-7ID 011811 Non-Confidential

Page 90: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.6 同一関数の 2 つのコピーの使用

2 つの関数に同じ名前を付け、一方を ARM コード用、他方を Thumb コード用にコン

パイルできます。

リンカでは、シンボルの複数の定義をイメージ内に共存させることができます。ただし、各定義は異なるプロセッサ状態に関連付けられている必要があります。ARM と Thumb の同義語を使用してシンボルを参照するとき、リンカでは以下のような規

則が適用されます。

• ARM 状態のシンボルへの B、BL、または BLX 命令は、ARM 定義に従って解決さ

れます。

• Thumb 状態のシンボルへの B、BL、または BLX 命令は、Thumb 定義に従って解決

されます。

シンボルへのその他の参照は、リンカが 初に検出した定義に従って解決されます。リンカでは、警告を生成し、選択したシンボルを明示します。

注 ARM コード内と Thumb コード内での同じ関数名またはシンボル名の定義は非推奨で

す。

5.6.1 関連項目

概念

『リンカの使用』:

• 第 7 章 armlink によるシンボルのアクセスと管理 .

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-8ID 011811 Non-Confidential

Page 91: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.7 アセンブリ言語のインターワークの例

この例は、ADR 命令が続く短いヘッダセクション(SECTION 1)を実装してアドレス

のラベル THUMBProg を取得し、アドレスの 下位ビットをセットします。BX 命令に

よって、状態が Thumb 状態に変更されます。

SECTION2 では、アドレスのラベル ARMProg を取得する ADR 命令を使用して、Thumb コー

ドが 2 つのレジスタの内容を加算し、 下位ビットをクリアしたままにします。次

の BX 命令で ARM 状態に戻ります。

SECTION3 では、ARM コードは、2 つのレジスタの内容を加算して終了します。

例 5-2 アセンブリ言語のインターワーク

; ******** ; addreg.s ; ********

PRESERVE8 AREA AddReg,CODE,READONLY ; こ の コ ー ド ブ ロ ッ ク に名前を付ける。

ENTRY ; 初に呼び出す関数を マー クする。; SECTION1start ADR R0, ThumbProg:OR:1 ; 分岐先ア ド レ ス を生成し、

; ビ ッ ト 0 を設定する。 その結果、 Thumb 状態の

; タ ーゲ ッ ト に到達する。

BX R0 ; ThumbProg への分岐と切り替え。; SECTION2 THUMB ; 後に続 く命令は Thumb コ ー ド。ThumbProg MOVS R2, #2 ; R2 に値 2 を ロ ー ドする。

MOVS R3, #3 ; R3 に値 3 を ロ ー ドする。 ADDS R2, R2, R3 ; R2 = R2 + R3 ADR R0, ARMProg BX R0 ; ARMProg への分岐と切り替え。; SECTION3 ARM ; 後に続 く命令は ARM コ ー ド。ARMProg MOV R4, #4 MOV R5, #5 ADD R4, R4, R5; SECTION 4stop MOV R0, #0x18 ; angel_SWIreason_ReportException LDR R1, =0x20026 ; ADP_Stopped_ApplicationExit SVC 0x123456 ; ARM セ ミ ホス テ ィ ン グ

END ; こ の フ ァ イ ルの終わ り を マー クする。

5.7.1 例のビルド

このモジュールのビルドとリンクを行うには、以下の手順を実行します。

1. 以下のように入力して、ソースファイルをインターワーク用にアセンブルします。

armasm --debug --apcs=/interwork addreg.s

2. 以下のように入力して、オブジェクトファイルをリンクします。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-9ID 011811 Non-Confidential

Page 92: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

armlink addreg.o -o addreg.axf

または、以下のように入力して、インターワークベニアのサイズを確認します。

armlink addreg.o -o addreg.axf --info=veneers

3. 適切なデバッグターゲットで、互換性のあるデバッガを使用してイメージを実行します。

5.7.2 関連項目

概念

• 「ベニアを使用したインターワーク」 (ページ 5-11)

• 「C 言語と C++ 言語のインターワーク」 (ページ 5-13)

• 「ベニアを使用した C、C++、およびアセンブリ言語のインターワーク」 (ペー

ジ 5-15)

参照

『アセンブラリファレンス』:

• 「--apcs=qualifier…qualifier」 (ページ 2-5)• 「--debug」 (ページ 2-9)

『リンカリファレンス』:• 「--info=topic[,topic,...]」 (ページ 2-77)• 「--output=file」 (ページ 2-111)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-10ID 011811 Non-Confidential

Page 93: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.8 ベニアを使用したインターワーク

この例は、アセンブリコードでレジスタ R0 から R2 をそれぞれ値 1、2、および 3 に設

定するソースコードのインターワークを示しています。レジスタ R0 および R2 は、

ARM コードによってセットされます。R1 は、Thumb コードによってセットされま

す。リンカによってインターワークベニアが自動的に追加されます。ベニアを使用する場合は、次の点に注意して下さい。

• --apcs=/interwork オプションでコードをアセンブルする必要があります。

• MOV pc,lr ではなく、BX lr 命令を使用して復帰します。

5.8.1 ベニアを使用したアセンブリ言語のインターワークの例

以下の例に、ベニアを使用したアセンブリ言語のインターワークを示します。

例 5-3 ベニアを使用したアセンブリ言語のインターワーク

; ***** ; arm.s ; *****

PRESERVE8 AREA Arm,CODE,READONLY ; こ の コ ー ド ブ ロ ッ ク に名前を付ける。 IMPORT ThumbProg ENTRY ; 初に呼び出す関数を マー クする。ARMProg MOV R0,#1 ; ARM コ ー ドで示すよ う に R0 を設定する。

BL ThumbProg ; Thumb サブルーチ ン を呼び出す。

MOV R2,#3 ; ARM に返された値を示すよ う に R2 を設定する。

; 実行を終了する。 MOV R0, #0x18 ; angel_SWIreason_ReportException LDR R1, =0x20026 ; ADP_Stopped_ApplicationExit SVC 0x123456 ; ARM セ ミ ホス テ ィ ン グ (以前の SWI) END

; ******* ; thumb.s ; *******

AREA Thumb,CODE,READONLY ; こ の コ ー ド ブ ロ ッ ク に名前を付ける。

THUMB ; 後に続 く命令は Thumb コ ー ド。 EXPORT ThumbProgThumbProg MOVS R1, #2 ; 到達し た Thumb コ ー ド を示すよ う に R1 を設定する。

BX lr ; ARM 関数に復帰する。

END ; こ の フ ァ イ ルの終わ り を マー クする。

5.8.2 例のビルド

このモジュールのビルドとリンクを行うには、以下の手順を実行します。

1. 以下のように入力して、ARM コードをインターワーク用にアセンブルします。

armasm --debug --apcs=/interwork arm.s

2. 以下のように入力して、Thumb コードをインターワーク用にアセンブルしま

す。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-11ID 011811 Non-Confidential

Page 94: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

armasm --thumb --debug --apcs=/interwork thumb.s

3. 以下のように入力して、オブジェクトファイルをリンクします。

armlink arm.o thumb.o -o count.axf

または、以下のように入力して、インターワークベニアのサイズを確認します。

armlink arm.o thumb.o -o count.axf --info=veneers

4. 適切なデバッグターゲットで、互換性のあるデバッガを使用してイメージを実行します。

5.8.3 関連項目

概念

• 「アセンブリ言語のインターワークの例」 (ページ 5-9)

• 「C 言語と C++ 言語のインターワーク」 (ページ 5-13)

• 「ベニアを使用した C、C++、およびアセンブリ言語のインターワーク」 (ペー

ジ 5-15)

参照

『アセンブラリファレンス』:

• 「--apcs=qualifier…qualifier」 (ページ 2-5)• 「--debug」 (ページ 2-9)• 「--thumb」 (ページ 2-26)

『リンカリファレンス』:• 「--info=topic[,topic,...]」 (ページ 2-77)• 「--output=file」 (ページ 2-111)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-12ID 011811 Non-Confidential

Page 95: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.9 C 言語と C++ 言語のインターワーク

このサンプルは、ARM サブルーチンのインターワーク呼び出しを実行する Thumb ルーチンを示しています。この ARM サブルーチンによって、Thumb ライブラリ内の printf() のインターワーク呼び出しが実行されます。

例 5-4 C 言語と C++ 言語のインターワーク

/********************* * thumbmain.c * **********************/

#include <stdio.h>

extern void arm_function(void);

int main(void) { printf("Hello from Thumb\n"); arm_function(); printf("And goodbye from Thumb\n"); return (0); }

/********************* * armsub.c * **********************/ #include <stdio.h>

void arm_function(void) { printf("Hello and Goodbye from ARM\n"); }

5.9.1 例のビルド

このモジュールのビルドとリンクを行うには、以下の手順を実行します。

1. 以下のように入力して、Thumb コードをインターワーク用にコンパイルしま

す。

armcc --thumb -c --debug --apcs=/interwork thumbmain.c -o thumbmain.o

2. 以下のように入力して、ARM コードをインターワーク用にコンパイルします。

armcc -c --debug --apcs=/interwork armsub.c -o armsub.o

3. 以下のように入力して、オブジェクトファイルをリンクします。

armlink thumbmain.o armsub.o -o thumbtoarm.axf

または、以下のように入力して、インターワークベニアのサイズを確認します。

armlink armsub.o thumbmain.o -o thumbtoarm.axf --info=veneers

4. 適切なデバッグターゲットで、互換性のあるデバッガを使用してイメージを実行します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-13ID 011811 Non-Confidential

Page 96: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.9.2 関連項目

概念

• 「アセンブリ言語のインターワークの例」 (ページ 5-9)

• 「ベニアを使用したインターワーク」 (ページ 5-11)

• 「ベニアを使用した C、C++、およびアセンブリ言語のインターワーク」 (ペー

ジ 5-15)

参照

『コンパイラリファレンス』:

• 「--apcs=qualifer...qualifier」 (ページ 3-9)• 「-c」 (ページ 3-26)• 「--debug、--no_debug」 (ページ 3-42)• 「-o filename」 (ページ 3-98)• 「--thumb」 (ページ 3-124)

『リンカリファレンス』:• 「--info=topic[,topic,...]」 (ページ 2-77)• 「--output=file」 (ページ 2-111)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-14ID 011811 Non-Confidential

Page 97: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.10 ベニアを使用した C、C++、およびアセンブリ言語のインターワーク

この例は、ベニアを使用した C 言語の Thumb コードとアセンブリ言語の ARM コー

ドのインターワークを示しています。

例 5-5 ベニアを使用した C、C++、およびアセンブリ言語のインターワーク

/********************** * thumb.c * **********************/

#include <stdio.h> extern int arm_function(int); int main(void) { int i = 1; printf("i = %d\n", i); printf("And i+4 = %d\n", arm_function(i)); return (0); }

; ***** ; arm.s ; *****

PRESERVE8 AREA Arm,CODE,READONLY ; こ の コ ー ド ブ ロ ッ ク に名前を付ける。 EXPORT arm_functionarm_function ADD R0,R0,#4 ; 4 を第 1 パ ラ メ ー タ に追加する。

BX lr ; 復帰 END

5.10.1 例のビルド

このモジュールのビルドとリンクを行うには、以下の手順を実行します。

1. 以下のように入力して、Thumb コードをインターワーク用にコンパイルしま

す。

armcc --thumb --debug -c --apcs=/interwork thumb.c

2. 以下のように入力して、ARM コードをインターワーク用にアセンブルします。

armasm --debug --apcs=/interwork arm.s

3. 以下のように入力して、オブジェクトファイルをリンクします。

armlink arm.o thumb.o -o add.axf

または、以下のように入力して、インターワークベニアのサイズを確認します。

armlink arm.o thumb.o -o add.axf --info=veneers

4. 適切なデバッグターゲットで、互換性のあるデバッガを使用してイメージを実行します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-15ID 011811 Non-Confidential

Page 98: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

ARM と Thumb のインターワーク

5.10.2 関連項目

概念

• 「アセンブリ言語のインターワークの例」 (ページ 5-9)

• 「ベニアを使用したインターワーク」 (ページ 5-11)

• 「C 言語と C++ 言語のインターワーク」 (ページ 5-13)

参照

『コンパイラリファレンス』:

• 「--apcs=qualifer...qualifier」 (ページ 3-9)• 「-c」 (ページ 3-26)• 「--debug、--no_debug」 (ページ 3-42)• 「-o filename」 (ページ 3-98)• 「--thumb」 (ページ 3-124)

『アセンブラリファレンス』:

• 「--apcs=qualifier…qualifier」 (ページ 2-5)• 「--debug」 (ページ 2-9)

『リンカリファレンス』:• 「--info=topic[,topic,...]」 (ページ 2-77)• 「--output=file」 (ページ 2-111)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 5-16ID 011811 Non-Confidential

Page 99: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

第 6 章 プロセッサ例外処理

以下の各トピックでは、ARM アーキテクチャがサポートしている各種の例外の処理方

法について説明します。

• 「プロセッサ例外について」 (ページ 6-3)• 「例外処理プロセス」 (ページ 6-4)• 「ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルの例外のタイプ」

(ページ 6-5)• 「ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのベクタテーブル」

(ページ 6-7)• 「ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのプロセッサモー

ドおよびレジスタ」 (ページ 6-8)• 「例外処理のためのシステムモードの使用」 (ページ 6-9)• 「例外に対するプロセッサの応答」 (ページ 6-10)• 「例外ハンドラからの復帰」 (ページ 6-11)• 「リセットハンドラ」 (ページ 6-12)• 「データアボートハンドラ」 (ページ 6-13)• 「割り込みハンドラと外部割り込みのレベル」 (ページ 6-14)• 「再入可能割り込みハンドラ」 (ページ 6-15)• 「アセンブリ言語を使用した割り込みハンドラの例」 (ページ 6-18)• 「シングルチャネル DMA 転送」 (ページ 6-19)• 「デュアルチャネル DMA 転送」 (ページ 6-20)• 「割り込みの優先度」 (ページ 6-21)• 「コンテキストスイッチ」 (ページ 6-23)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-1ID 011811 Non-Confidential

Page 100: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

• 「SVC ハンドラ」 (ページ 6-24)• 「呼び出す SVC の決定」 (ページ 6-26)• 「アセンブリ言語を使用した SVC ハンドラ」 (ページ 6-27)• 「C 言語およびアセンブリ言語を使用した SVC ハンドラ」 (ページ 6-28)• 「スーパーバイザモードでの SVC の使用」 (ページ 6-30)• 「アプリケーションからの SVC の呼び出し」 (ページ 6-31)• 「アプリケーションからの動的な SVC の呼び出し」 (ページ 6-33)• 「プリフェッチアボートハンドラ」 (ページ 6-35)• 「未定義命令ハンドラ」 (ページ 6-36)• 「ARMv6-M および ARMv7-M プロファイル」 (ページ 6-37)• 「メインスタックおよびプロセススタック」 (ページ 6-38)• 「マイクロコントローラプロファイルの例外のタイプ」 (ページ 6-39)• 「ARMv6-M および ARMv7-M プロファイルのベクタテーブル」 (ページ 6-40)• 「ベクタテーブルオフセットレジスタ(ARMv7-M のみ)」 (ページ 6-41)• 「ARMv6-M および ARMv7-M プロファイルの例外テーブルの書き込み」 (ページ

6-42)• 「ネストされたベクタ割り込みコントローラ」 (ページ 6-43)• 「例外処理」 (ページ 6-44)• 「システム制御空間レジスタの設定」 (ページ 6-46)• 「個別の IRQ の設定」 (ページ 6-48)• 「スーパーバイザコール」 (ページ 6-49)• 「システムタイマ」 (ページ 6-51)• 「SysTick の設定」 (ページ 6-52)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-2ID 011811 Non-Confidential

Page 101: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.1 プロセッサ例外について

プログラムの通常の実行フローにおいて、近くのラベルへの分岐やサブルーチンへのリンクによって、プログラムカウンタ(PC)はアドレス空間の中でシーケンシャ

ルに増加していきます。

プロセッサ例外は、内部ソースまたは外部ソースによって生成されるイベントをプロセッサが処理できるように、この通常の実行フローがそらされるときに発生します。このイベントには以下のようなものがあります。

• 外部で生成された割り込み

• 未定義命令を実行しようとするプロセッサの試行

• オペレーティングシステムの特権付き機能へのアクセス

6.1.1 関連項目

概念

• 「例外処理プロセス」 (ページ 6-4)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-3ID 011811 Non-Confidential

Page 102: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.2 例外処理プロセス

以下の図は、例外処理プロセスを示しています。

図 6-1 例外処理

例外が発生すると、ベクタテーブルと呼ばれるメモリ領域に制御が渡されます。これは予約エリアであり、通常はメモリマップの 下位に配置されます。テーブルでは、1 ワードが個々の種類の例外に割り当てられています。このワードは、分岐命令

の形式または(ARMv6-M および ARMv7-M の場合)関係する例外ハンドラのアドレ

スのいずれかを含みます。

該当する命令セットがプロセッサでサポートされている場合、例外ハンドラを ARM または Thumb-2 コードで記述できます。ARMv7-M および ARMv6-M プロファイルの

場合、プロセッサは、ベクタテーブルで指定されている例外ハンドラに入ります。その他の ARM プロセッサの場合、トップレベルハンドラから、例外を処理するコー

ドに分岐する必要があります。状態の変更が必要な場合は、分岐と切り替え(BX)

を使用します。例外を処理する際、適切な例外処理ルーチンが完了したときにプログラムを再開できるように、現在のプロセッサモード、状態、およびレジスタを保持する必要があります。

ARMv7-A、ARMv7-R、および ARMv6 とそれ以前のアーキテクチャで使用される例

外処理モデルは、ARMv6-M および ARMv7-M のマイクロコントローラプロファイル

で使用されるモデルとは異なります。

6.2.1 関連項目

概念

• 「ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルの例外のタイプ」 (ページ 6-5)

• 「ARMv6-M および ARMv7-M プロファイル」 (ページ 6-37)

参照

• 第 5 章 ARM と Thumb のインターワーク

Applicationcode

Exception occurs

Vectortable

Handle

exception

Save CPU andregister state

Restore CPUandregister state

the

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-4ID 011811 Non-Confidential

Page 103: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.3 ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルの例外のタイプ

以下の表は、ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルで認識

される各種の例外を示しています。複数の例外が同時に発生した場合、これらの例外は決まった優先度順に処理されます。各例外が順に処理されてから、元のアプリケーションに戻ります。すべての例外が同時に発生することはあり得ません。例えば、未定義命令(Undef)例外とスーパーバイザコール(SVC)例外は、どちらも 1 つの命令の実行によってトリガされるため、同時に発生することはありません。

例外の発生時には、以下の処理が行われます。

• すべての例外に対して割り込み要求(IRQ)が無効になります。

• FIQ 例外とリセット例外に対して高速割り込み要求(FIQ)が無効になります。

データアボート例外は FIQ 例外よりも優先度が高いので、FIQ の処理前に登録されま

す。データアボートを処理するときに FIQ が有効になったままなので、データア

ボートハンドラが起動しますが、制御はすぐに FIQ ハンドラに渡されます。FIQ の処

理が完了すると、データアボートハンドラに制御が戻ります。これにより、FIQ が初に処理されてデータ転送エラーが検出を免れることはありません。

表 6-1 優先度別の例外のタイプ

優先度(1= 高、

6= 低)例外のタイプ 例外モード 説明

1 リセット スーパーバイザ プロセッサリセットピンがアサートされると発生します。この例外は、起動またはリセット(プロセッサが既に起動している場合)が通知された場合にのみ発生します。ソフトリセットは、リセットベクタに分岐させることによって実行できます。

2 データアボート アボート データ転送命令によって不正なアドレスでのデータのロードまたはストアが試行された場合に発生しますa。

3 FIQ FIQ プロセッサ外部高速割り込み要求ピンがアサートされ(LOW)、CPSR 内の F ビットがクリアされている

ときに発生します。

4 IRQ IRQ プロセッサ外部割り込み要求ピンがアサートされ(LOW)、CPSR 内の I ビットがクリアされているとき

に発生します。

5 プリフェッチアボート

アボート アドレスが不正であったためにフェッチされなかった命令をプロセッサが実行しようとしたときに発生します a。

6 SVC スーパーバイザ ユーザ定義の同期割り込み命令です。ユーザモードで実行中のプログラムは、スーパーバイザモードで実行される RTOS 関数などの特権操作を要求できるよ

うにします。

6 未定義命令 未定義 実行中の命令が、プロセッサや接続されているどのコプロセッサにも認識されない場合に発生します。

a. 不正な仮想アドレスとは、物理メモリのアドレスと現時点で対応していないアドレスか、現在のモードではプロ

セッサからアクセスできないとメモリ管理サブシステムが判断したアドレスを指します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-5ID 011811 Non-Confidential

Page 104: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.3.1 関連項目

参照

• 「ARMv6-M および ARMv7-M プロファイル」 (ページ 6-37)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-6ID 011811 Non-Confidential

Page 105: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.4 ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのベクタテーブル

ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのベクタテーブルに

は、関連するハンドラへの分岐またはロード PC 命令が含まれています。必要な場合

は、可能な限り効率的に処理されるように FIQ ハンドラをベクタテーブルの末尾に

インクルードできます(以下の例を参照)。リテラルプールを使用すると、必要な場合、後でアドレスを簡単に変更できます。

例 6-1 リテラルプールを使用する一般的なベクタテーブル

AREA vectors, CODE, READONLYENTRY

Vector_TableLDR pc, Reset_AddrLDR pc, Undefined_AddrLDR pc, SVC_AddrLDR pc, Prefetch_AddrLDR pc, Abort_AddrNOP ;予約ベ ク タLDR pc, IRQ_Addr

FIQ_Handler; FIQ ハン ド ラ コ ー ド。 大 4KB

Reset_Addr DCD Reset_HandlerUndefined_Addr DCD Undefined_HandlerSVC_Addr DCD SVC_HandlerPrefetch_Addr DCD Prefetch_HandlerAbort_Addr DCD Abort_Handler DCD 0 ;予約ベ ク タIRQ_Addr DCD IRQ_Handler

...END

この例では、リセット時に 0x0 に ROM を配置したことを前提としています。別の方

法としては、スキャッタロードメカニズムを使用して、ベクタテーブルのロード / 実行アドレスを定義することもできます。この場合は、C ライブラリによってベクタ

テーブルがコピーされます。

注 ARMv6 とそれ以前のアーキテクチャのベクタテーブルは、ARM 命令だけをサポー

トします。ARMv6T2 以降のアーキテクチャは、ベクタテーブルで Thumb-2 と ARM の両方の命令をサポートします。これは、ARMv6-M および ARMv7-M プロファイル

には適用されません。

6.4.1 関連項目

概念

『リンカの使用』:

• 第 8 章 スキャッタロード記述ファイルの使用

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-7ID 011811 Non-Confidential

Page 106: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.5 ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのプロセッサモー

ドおよびレジスタ

ARM アーキテクチャは、15 本の汎用レジスタ、1 つの PC、および 1 つの CPSR を含

む非特権ユーザモードを定義しています。さらに、その他の特権モードもあります。個々の特権モードは、1 つの SPSR および複数のバンクレジスタを含みます。

通常、アプリケーションはユーザモードで実行されますが、例外処理は特権モードで実行される必要があります。例外が発生するとプロセッサモードが変更されます。その結果、各例外ハンドラは、以下のような特定のバンクレジスタのサブセットにアクセスできるようになります。

• 専用の スタックポインタ(SP)• 専用の LR• 専用の SPSR• 5 本の追加汎用レジスタ(FIQ のみ)

各例外ハンドラは、終了時に他のレジスタを元の内容に復元する必要があります。この操作は、ハンドラが必要とするすべてのレジスタの内容をスタックに保存し、復帰前にこれらを復元することで可能となります。

6.5.1 関連項目

参照 • 「再入可能割り込みハンドラ」 (ページ 6-15)• 「アセンブリ言語を使用した割り込みハンドラの例」 (ページ 6-18)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-8ID 011811 Non-Confidential

Page 107: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.6 例外処理のためのシステムモードの使用

リンクレジスタの破損は、同じ種類の例外を複数処理する際に問題となることがあります。

ARMv4 以降のアーキテクチャには、この問題を解決するためにシステムモードと呼

ばれる特権モードが追加されています。システムモードはユーザモードと同じレジスタを共有し、特権アクセスが必要なタスクを実行できます。例外はリンクレジスタを上書きしません。

注 例外からシステムモードに入ることはできません。例外ハンドラはシステムモード

に入るときに CPSR を変更します。

6.6.1 関連項目

概念 • 「ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのプロセッサ

モードおよびレジスタ」 (ページ 6-8)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-9ID 011811 Non-Confidential

Page 108: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.7 例外に対するプロセッサの応答

ここでは、例外に対するプロセッサの応答について説明します。例外ハンドラでは、確実に、例外の発生時にシステム状態を保存し、復帰時にシステム状態を復元する必要があります。

Thumb 状態対応プロセッサの基本的な例外処理メカニズムは、Thumb 状態に対応し

ていないプロセッサと同じです。例外が発生すると、適切なベクタテーブルエントリから次の命令がフェッチされます。

例外が生成されると、プロセッサは以下のように動作します。

1. CPSR が適切な SPSR にコピーされます。これにより、現在のモード、割り込み

マスク、および条件フラグが保存されます。

2. 現在の状態が例外ベクタテーブルで使用されている命令セットに一致しない場合は、状態が自動的に切り替わります。

3. 以下を行うために、適切な CPSR モードビットを変更します。

• 適切なモードに切り替え、そのモードの適切なバンクレジスタにマップする。

• 割り込みを無効にする。どの例外が発生しても IRQ は無効にされます。

FIQ は、FIQ の発生時とリセット時に無効にされます。

4. 適切な LR が復帰アドレスに設定されます。

5. PC に、例外のベクタアドレスをセットします。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-10ID 011811 Non-Confidential

Page 109: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.8 例外ハンドラからの復帰

ここでは、例外に対するプロセッサの応答と、例外処理後にメインプログラムに戻る方法について説明します。例外ハンドラでは、確実に、例外の発生時にシステム状態を保存し、復帰時にシステム状態を復元する必要があります。

例外からの復帰方法は、例外ハンドラがスタック処理を行うかどうかによって異なります。いずれの場合も、例外発生時の場所に制御を戻すには、例外ハンドラが以下の処理を行う必要があります。

• 適切な SPSR から CPSR を復元する。

• リターンアドレスを使用して適切な LR から PC を復元する。

復帰先のモードのレジスタをスタックから復元する必要のない単純な復帰では、例外ハンドラは以下を使用するデータ処理命令を実行することによって、これらの処理を行います。

• セットされた S フラグ

• 復帰先のレジスタとして使用されるプログラムカウンタ

必要な復帰命令は、例外タイプによって異なります。

注 リセットハンドラはメインコードを直接実行するため、リセットハンドラから復帰

する必要はありません。

例外ハンドラのエントリコードが、スタックを使用して例外処理中も保存しておかなければならないレジスタを格納した場合には、^ 修飾子を付けた多重ロード命令を

使用して復帰できます。例えば、以下の命令を使用して復帰できます。

LDMFD sp!,{R0-R12,pc}^

上記の命令で復帰できるのは、以下のレジスタがスタックに保存された場合です。

• ハンドラ呼び出し時に使用されていたすべての作業レジスタ

• データ処理命令と同じ結果が得られるように修正されたリンクレジスタ

^ 修飾子を使うことで、CPSR が SPSR から復元することが指定されます。この修飾

子は、特権モードから使用する必要があります。

注 16 ビット Thumb 命令は CPSR を復元できないので、例外から復帰するために 16 ビッ

ト Thumb 命令を使用することはできません。

6.8.1 関連項目

参照

『アセンブラの使用』:

• 「LDM および STM を使用したスタックの実装」 (ページ 5-25)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-11ID 011811 Non-Confidential

Page 110: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.9 リセットハンドラ

リセットハンドラの動作は、ソフトウェア開発対象のシステムによって異なります。

例えば、以下のような動作が考えられます。

• 例外ベクタのセットアップ

• スタックとレジスタの初期化

• MMU を使用している場合の、メモリシステムの初期化

• 重要な I/O デバイスの初期化

• 割り込みの有効化

• プロセッサのモードまたは状態、あるいはその両方の変更

• C 言語に必要な変数の初期化とメインアプリケーションの呼び出し

6.9.1 関連項目

参照

• 「ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルのベクタテーブ

ル」 (ページ 6-7)

• 第 3 章 組み込みソフトウェアの開発

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-12ID 011811 Non-Confidential

Page 111: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.10 データアボートハンドラ

システムに MMU が存在しない場合は、データアボートハンドラでエラーを通知し

て終了する必要があります。MMU が存在する場合は、データアボートハンドラに

よって仮想メモリのメモリ障害を解決する必要があります。

lr_ABT はデータアボートを発生させた命令よりも 2 つ先の命令を指すため、データア

ボートを発生させた命令の位置は lr_ABT-8 となります。

このアボートを発生する可能性のある命令には以下のような種類があります。

単一レジスタロード / ストア命令

応答はプロセッサタイプによって異なります。

• アボートが ARM7TDMI などの ARM7™ で発生した場合、命令に指

定されているベースレジスタが更新されているので、変更を元に戻す必要があります。

• アボートが ARM9™ 以降のプロセッサで発生した場合、プロセッサ

は命令開始前に保持されていた値をそのアドレスに復元します。この変更を元に戻すコードは必要ありません。

スワップ命令(SWP) この命令に関連してアドレスレジスタが更新されることはあ

りません。

多重ロード / ストア命令

応答はプロセッサタイプによって異なります。

• アボートが ARM 7 ベースのプロセッサで発生し、ライトバックが

有効にされている場合には、転送全体が発生したかのようにベースレジスタが更新されます。

レジスタリスト内にベースレジスタを指定して LDM を使用した場

合、プロセッサは後で回復できるように、上書きされた値を修正されたベース値で置き換えます。元のベースアドレスは、使用されるレジスタの数を使用して再計算されます。

• アボートが ARM9 以降のプロセッサで発生し、ライトバックが有

効にされている場合には、命令開始前に保持されていた値をベースレジスタに復元します。

上記 3 つのどのケースでも、MMU は要求された仮想メモリを物理メモリにロードで

きます。MMU のフォールトアドレスレジスタ(FAR)には、アボートを発生させた

アドレスが保持されます。これにより、ハンドラは復帰して命令を再実行することができます。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-13ID 011811 Non-Confidential

Page 112: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.11 割り込みハンドラと外部割り込みのレベル

ARM プロセッサには FIQ と IRQ という 2 つのレベルの外部割り込みがあります。こ

れらはどちらも負論理のレベルセンシティブな割り込みです。割り込みを発生させるには、CPSR 内の適切な無効ビットをクリアしておく必要があります。

FIQ は、以下のように IRQ よりも優先されます。

• 複数の割り込みが発生すると、FIQ が 初に処理されます。

• FIQ の処理によって IRQ および後続の FIQ が無効にされ、FIQ ハンドラが IRQ を再度有効にするまで IRQ の処理は開始されません。IRQ は、ハンドラの終わ

りで CPSR から SPSR を復元することによって再度有効にするのが一般的です。

FIQ ベクタはベクタテーブルの 後のエントリであるため、FIQ ハンドラをこのベク

タ位置に直接配置して、そのアドレスからシーケンシャルに実行できます。したがって分岐の必要やそれに伴う遅延が発生せず、システムにキャッシュが搭載されている場合は、ベクタテーブルと FIQ ハンドラのすべてがキャッシュ内の 1 つのブ

ロックにロックされます。FIQ はできるだけ速く割り込みを処理することを目的とし

て設計されているため、これは重要です。さらに FIQ モードの 5 つのバンクレジス

タによって、ハンドラの呼び出しと呼び出しの間、状態を保持できるため、さらに実行速度を上げることができます。

注 割り込みハンドラには、割り込みソースをクリアするコードを含める必要がありま

す。

6.11.1 関連項目

概念 • 「再入可能割り込みハンドラ」 (ページ 6-15)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-14ID 011811 Non-Confidential

Page 113: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.12 再入可能割り込みハンドラ

サブルーチンの呼び出しおよび別の割り込みの発生前に、割り込みハンドラが割り込みを有効にした場合、IRQ モード LR に格納されているサブルーチンのリターンア

ドレスは 2 番目の IRQ の発生時に破壊されます。これは、新しい割り込みがサブ

ルーチンの復帰アドレスを上書きできるよう、プロセッサが復帰アドレスを IRQ モード LR に自動的に保存するためです。その結果、元の割り込み内のサブルーチン

が復帰しようとすると無限ループが発生します。

再入可能割り込みハンドラは、IRQ 状態を保存し、プロセッサモードを切り替え、

入れ子のサブルーチンまたは C 関数に分岐する前に新しいプロセッサモードの状態

を保存する必要があります。また、LDRD または STRD 命令あるいは 8 バイト境界で整列

されたスタック割り当てデータを使用する可能性のある AAPCS 準拠のコンパイル済

み C コードを呼び出す前に、新しいプロセッサモードに対してスタックが 8 バイト

境界で整列されていることを確認する必要があります。

C 言語で __irq キーワードを使用しても、再入可能割り込みハンドラに必要な SPSR の保存と復元は行われないため、トップレベル割り込みハンドラはアセンブリ言語で記述する必要があります。

ARMv4 以降では、特権アクセスが必要な場合はシステムモードに切り替えることが

できます。

注 この方法は、IRQ と FIQ の両方の割り込みに使用できます。しかし、FIQ 割り込みは

できるだけ速く処理されることに加えて、通常は 1 つの割り込みソースしか存在し

ないため、再入可能なように実装する必要はない場合があります。

IRQ ハンドラで安全に割り込みを有効にするには、以下の手順に従います。

1. 復帰アドレスを作成し、IRQ スタックに保存します。

2. 作業レジスタ、呼ばれた側で保存されないレジスタ、および IRQ モード SPSR を保存します。

3. 割り込みソースをクリアします。

4. IRQ を無効にしたまま、システムモードに切り替えます。

5. スタックが 8 バイト境界で整列されていることを確認し、必要に応じて調整し

ます。

6. ユーザモード LR と、ユーザモード SP で使用される調整値 (アーキテクチャ v4 または v5TE 用の 0 または 4)を保存します。

7. 割り込みを有効にし、C 割り込みハンドラ関数を呼び出します。

8. C 言語の割り込みハンドラが復帰したら、割り込みを無効にします。

9. ユーザモード LR とスタック調整値を復元します。

10. 必要に応じてスタックを再調整します。

11. IRQ モードに切り替えます。

12. 他のレジスタと IRQ モード SPSR を復元します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-15ID 011811 Non-Confidential

Page 114: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

13. この IRQ から復帰します。

以下の例は、システムモードでこれを実装するコードを示しています。

例 6-2 ARMv4/v5TE 用の再入可能割り込みハンドラ

PRESERVE8AREA INTERRUPT, CODE, READONLYIMPORT C_irq_handlerIMPORT identify_and_clear_source

IRQ_Handler SUB lr, lr, #4 ; 復帰ア ド レ ス を作成し、

PUSH {lr} ; 調整された lr_IRQ を プ ッ シ ュ

MRS lr, SPSR ; spsr_IRQ を lr に コ ピー

PUSH {R0-R4,R12,lr} ; AAPCS レジス タ および spsr_IRQ を保存BL identify_and_clear_sourceMSR CPSR_c, #0x9F ; IRQ を無効に し た ま ま、

; システムモー ド に切り替え。 USR モー ド

; レジス タ が現在のレジス タ になる。

AND R1, sp, #4 ; ス タ ッ ク の整列をテス ト

SUB sp, sp, R1 ; 調整不良を削除 (0 ま たは 4)PUSH {R1,lr} ; 調整および lr_USR を保存

MSR CPSR_c, #0x1F ; IRQ を有効にする BL C_irq_handler MSR CPSR_c, #0x9F ; システムモー ドのま ま、 IRQ を無効にする

POP {R1,lr} ; ス タ ッ ク調整と lr_USR を復元

ADD sp, sp, R1 ; ス タ ッ ク調整 (0 または 4) を追加

MSR CPSR_c, #0x92 ; IRQ モー ド に切り替え、 IRQ を ; 無効状態に保つ。 FIQ は有効状態のま ま。

POP {R0-R4,R12,lr} ; レジス タ と MSR SPSR_cxsf, lr ; spsr_IRQ を復元

LDM sp!, {pc}^ ; IRQ か ら復帰。 END

例 6-3 ARMv6 の再入可能割り込み(非ベクタ割り込み)

PRESERVE8AREA INTERRUPT, CODE, READONLYIMPORT C_irq_handlerIMPORT identify_and_clear_source

IRQ_HandlerSUB lr, lr, #4SRSDB sp!,#31 ; LR_irq と SPSR_irq をシステムモー ド ス タ ッ ク に保存

CPS #031 ; シス テムモー ド に切り替え

PUSH {R0-R3,R12} ; 他の AAPCS レジス タ を保存AND R1, sp, #4SUB sp, sp, R1PUSH {R1, lr}BL identify_and_clear_sourceCPSIE i ; IRQ を有効にするBL C_irq_handlerCPSID i ; IRQ を無効にするPOP {R1,lr}ADD sp, sp, R1

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-16ID 011811 Non-Confidential

Page 115: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

POP {R0-R3, R12} ; レジス タ を復元

RFEIA sp! ; シス テムモー ド ス タ ッ ク か ら RFE を使用し て復帰END

これらの例では、FIQ が永久に有効にされていると想定しています。

6.12.1 関連項目

リファレンス • 「例外処理のためのシステムモードの使用」 (ページ 6-9)

その他の情報 • 『ABI for the ARM Architecture Advisory Note - SP must be 8-byte aligned on entry to

AAPCS-conforming functions』, http://infocenter/help/topic/com.arm.doc.ihi0046-/index.html • 『Application Note 30: Software Prioritization of Interrupts』,

http://infocenter/help/topic/com.arm.doc.dai0030-/index.html

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-17ID 011811 Non-Confidential

Page 116: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.13 アセンブリ言語を使用した割り込みハンドラの例

割り込みハンドラは、できるだけ速く実行できるようにアセンブリ言語で記述するのが一般的です。以下に、例を示します。

• 「シングルチャネル DMA 転送」 (ページ 6-19)• 「デュアルチャネル DMA 転送」 (ページ 6-20)• 「割り込みの優先度」 (ページ 6-21)• 「コンテキストスイッチ」 (ページ 6-23)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-18ID 011811 Non-Confidential

Page 117: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.14 シングルチャネル DMA 転送

以下の例は、ソフト DMA、即ち割り込み駆動型 I/O デバイスとメモリの間でデータ

転送を行う割り込みハンドラを示しています。このコードは FIQ ハンドラです。バ

ンク FIQ レジスタを使用して、割り込みの間、状態が保持されます。このコードは、

0x1C に配置するのが も適切です。

このコード例では、以下のようになります。

R8 データが読み出される I/O デバイスのベースアドレスを指します。

IOData ベースアドレスから、データが読み出される 32 ビットのレジスタまで

のオフセットです。このレジスタの読み出しによって、割り込みがクリアされます。

R9 データ転送先のメモリ位置を指します。

R10 転送先の 後のアドレスを指します。

通常の転送を処理する全体のシーケンスには 4 つの命令が使用されます。条件付き

の復帰後に配置されているコードは、転送が完了したことを通知するために使用されます。

例 6-4 FIQ ハンドラ

LDR R11, [R8, #IOData] ; I/O デバイ スか ら ポー ト デー タ を ロー ドする。

STR R11, [R9], #4 ; デー タ を メ モ リ に保存する。 ポ イ ン タ を更新する。

CMP R9, R10 ; 終わ り に到達し たか ? SUBLSS pc, lr, #4 ; 到達し ていない場合は復帰する。

; こ こ に転送終了コ ード を

; 挿入する。

ロード命令をバイトロード命令に置き換えることにより、バイト転送を実行できます。メモリから I/O デバイスへの転送は、ロード命令とストア命令の間でアドレシン

グモードをスワップすることによって実行されます。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-19ID 011811 Non-Confidential

Page 118: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.15 デュアルチャネル DMA 転送

この 「FIQ ハンドラ」の例は 「FIQ ハンドラ」 (ページ 6-19)の例と似ていますが、

ここでは 2 つのチャネルが処理されます。このコードは FIQ ハンドラです。バンク FIQ レジスタを使用して、割り込みの間、状態が保持されます。このコードは、0x1C に配置するのが も適切です。

このコード例では、以下のようになります。

R8 データが読み出される I/O デバイスのベースアドレスを指します。

IOStat ベースアドレスから、2 つのポートのどちらが割り込みを発生さ

せたかを示すレジスタへのオフセットです。

IOPort1Active 第 1 ポートが割り込みを発生させたことを示すビットマスクで

す。これ以外の場合は、第 2 ポートが割り込みを発生させたとみ

なされます。

IOPort1, IOPort2 読み出される 2 つのデータレジスタへのオフセットです。データ

レジスタの読み出しによって、対応するポートの割り込みがクリアされます。

R9 第 1 ポートからのデータを転送する先のメモリ位置を指します。

R10 第 2 ポートからのデータを転送する先のメモリ位置を指します。

R11, R12 転送先の 後のアドレスを指します。これは第 1 ポートでは R11 で、第 2 ポートでは R12 です。

通常の転送を処理する全体のシーケンスには 9 つの命令が使用されます。条件付き

の復帰後に配置されているコードは、転送が完了したことを通知するために使用されます。

例 6-5 FIQ ハンドラ

LDR sp, [R8, #IOStat] ; ス テー タ ス レジス タ を ロー ド し て、 割り込みを

; 発生させたポー ト を見つける。 TST sp, #IOPort1Active LDREQ sp, [R8, #IOPort1] ; ポー ト 1 デー タ を ロ ー ドする。

LDRNE sp, [R8, #IOPort2] ; ポー ト 2 デー タ を ロ ー ドする。

STREQ sp, [R9], #4 ; バ ッ フ ァ 1 に保存する。

STRNE sp, [R10], #4 ; バ ッ フ ァ 2 に保存する。

CMP R9, R11 ; 終わ り に到達し たか ? CMPLE R10, R12 ; 両方のチ ャ ネルで ?

SUBSNE pc, lr, #4 ; 復帰

; こ こ に転送終了コ ード を挿入する。

ロード命令をバイトロード命令に置き換えることにより、バイト転送を実行できます。メモリから I/O デバイスへの転送は、条件付きロード命令と条件付きストア命令

の間でアドレシングモードをスワップすることによって実行されます。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-20ID 011811 Non-Confidential

Page 119: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.16 割り込みの優先度

以下の例では、 高 32 個の割り込みソースが適切なハンドラに送信されます。この

例は通常の割り込みベクタ IRQ に使用される目的で設計されているため、0x18 から

分岐させる必要があります。

外部ベクタ割り込みコントローラ(VIC)ハードウェアは、割り込みの優先度を決定

し、I/O レジスタに優先度の高いアクティブな割り込みを割り当てるために使用しま

す。

このコード例では、以下のようになります。

IntBase 割り込みコントローラのベースアドレスを保持します。

IntLevel 高優先度のアクティブな割り込みを含むレジスタのオフセットを保持

します。

R13 小さなフル下降スタックを指します。

割り込みは、このコードへの分岐も含め、10 命令実行後に有効にされます。

各割り込みに固有のハンドラは、さらに 2 命令実行後に、すべてのレジスタがス

タックに保存された状態で開始されます。

また、各ハンドラの 後の 3 命令は割り込みをもう一度オフにした状態で実行され

るため、SPSR は安全にスタックから復元できます。

例 6-6 割り込みハンドラの送信

; 初に重要な状態を保存する

SUB lr, lr, #4 ; 保存する前に復帰ア ド レ ス を

; 調整する。

STMDB sp!, {lr} ; 復帰ア ド レ ス を ス タ ッ ク

MRS lr, SPSR ; SPSR を取得し ...PUSH {R12,lr} ; ... 作業レジス タ を加算し て

; ス タ ッ ク する。

; 高優先度のア ク テ ィ ブな割り込みの

; 優先度レベルを取得する。

MOV R12, #IntBase ; 割り込みコ ン ト ロー ラ の

; ベース ア ド レ ス を取得する。

LDR R12, [R12, #IntLevel] ; 割り込みレベル (0 ~ 31) を取得する。

; CPSR の読み出し -変更-書き込みを行っ て

; 割り込みを有効にする。

MRS lr, APSR ; ス テー タ ス レジス タ を読み出す。

BIC lr, lr, #0x80 ; I ビ ッ ト を ク リ アする

; (0x40 を F ビ ッ ト に使用する)。

MSR CPSR_c, lr ; ラ イ トバ ッ ク し て割り込みを

; 再び有効化し、

LDR pc, [pc, R12, LSL #2] ; 適切なハン ド ラ へジ ャ ン プする。

; PC ベース ア ド レ スはこ の

; 命令 + 8 を指すため

NOP ; PC はこ のテーブルに イ ンデ ク ス を付ける。

; ハン ド ラ開始ア ド レ スのテーブル DCD Priority0Handler DCD Priority1Handler DCD Priority2Handler; ...

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-21ID 011811 Non-Confidential

Page 120: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

Priority0HandlerPUSH {R0-R11} ; 他の作業レジス タ を保存する。

; こ こ にハン ド ラ の コ ー ド を挿入する。; ...

POP {R0-R11} ; 作業レジス タ (R12 ではない) を復元する。

; CPSR の読み出し -変更-書き込みを行っ て

; 割り込みを無効にする。

MRS R12, APSR ; ス テー タ ス レジス タ を読み出す。

ORR R12, R12, #0x80 ; I ビ ッ ト を設定する

; (0x40 を F ビ ッ ト に使用する)。

MSR CPSR_c, R12 ; ラ イ トバ ッ ク し て割り込みを無効にする。

; 割り込みを無効に し たので、 安全に

; SPSR を復元し、 復帰でき る。

POP {r12,lr} ; R12 を復元し、 SPSR を取得する。

MSR SPSR_cxsf, lr ; ス テー タ ス レジス タ を R14 か ら復元する。

LDM sp!, {pc}^ ; ハン ド ラ か ら復帰する。Priority1Handler; ...

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-22ID 011811 Non-Confidential

Page 121: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.17 コンテキストスイッチ

以下の例では、ユーザモードのプロセスへのコンテキストスイッチが実行されます。このコードでは、実行準備が整ったプロセスのプロセス制御ブロック(PCB)を指

すポインタのリストが使用されています。

この図は、この例で使用されている PCB のレイアウトを示しています。

図 6-2 PCB のレイアウト

R12 は次に実行されるプロセスの PCB を指すポインタを指します。このリストの終わ

りにはゼロポインタが配置されます。レジスタ R13 は PCB へのポインタであり、タ

イムスライスの際には保存されるため、エントリ時には実行中のプロセスの PCB を指します。

例 6-7 ユーザモードのプロセスへのコンテキストスイッチ

STM sp,{R0-lr}^ ; R13 を超えるユーザレジス タ を ダ ン プする。

MRS R0, SPSR ; ユーザス テー タ ス を ピ ッ ク ア ッ プ し、

STMDB sp, {R0, lr} ; 以下の復帰ア ド レ ス を使用し て ダ ン プする。

LDR sp, [R12], #4 ; 次のプ ロセス情報ポイ ン タ を ロー ドする。

CMP sp, #0 ; ゼロの場合は無効。

LDMDBNE sp, {R0, lr} ; ス テー タ ス と復帰ア ド レ ス を ピ ッ ク ア ッ プする。

MSRNE SPSR_cxsf, R0 ; ス テー タ ス を復元する。

LDMNE sp, {R0 - lr}^ ; レジス タ の残り の部分を取得し、 NOP SUBSNE pc, lr, #4 ; 復帰し た後、 CPSR を復元する。

; こ こ に "次のプ ロセスはない こ と を示すコ ー ド " を挿入する。

r8r7r6r5r4r3r2r1r0lr

spsr

r9r10r11r12r13r14

PCB pointer

User mode registers

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-23ID 011811 Non-Confidential

Page 122: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.18 SVC ハンドラ

例外ハンドラによって、例外発生時にプロセッサが ARM 状態と Thumb 状態のどち

らにあったかを判断しなければならない場合があります。

特に、SVC ハンドラでプロセッサ状態を読み出す必要がある場合があります。プロ

セッサ状態は、SPSR の T ビットを検査することで参照できます。このビットは、

Thumb 状態ではセットされ、ARM 状態ではクリアされます。

ARM と Thumb のどちらの命令セットにも SVC 命令があります。Thumb 状態から SVC を呼び出す場合には、以下の点に注意する必要があります。

• 命令のアドレスは、lr-4 ではなく lr-2 にあります。

• 命令自体は 16 ビットであるため、ハーフワードをロードする必要があります

(図 6-3 を参照)。

• SVC 番号は、ARM 状態のときの 24 ビットでなく 8 ビットで保持されます。

図 6-3 Thumb SVC 命令

以下の例に、SVC 例外を処理する ARM コードを示します。Thumb 状態からアクセ

ス可能な SVC 番号の範囲は、SVC を動的に呼び出すことによって拡張できます。

例 6-8 SVC ハンドラ

PRESERVE8AREA SVC_Area, CODE, READONLYEXPORT SVC_Handler

IMPORT C_irq_handlerT_bit EQU 0x20 ; CPSR/SPSR の Thumb ビ ッ ト (5)SVC_Handler

STMFD sp!, {r0-r3, r12, lr} ; レジス タ を保存

MOV r1, sp ; ポイ ン タ をパ ラ メ ー タ に設定

MRS r0, spsr ; spsr を取得

STMFD sp!, {r0, r3} ; spsr を ス タ ッ ク および別の

; レジス タ に保存し て、 8 バイ ト で整列されたス タ ッ ク を保持する

TST r0, #T_bit ; Thumb 状態で発生し たか ?LDRNEH r0, [lr,#-2] ; はい : ハー フ ワー ド を ロー ド し ...BICNE r0, r0, #0xFF00 ; ... コ メ ン ト フ ィ ール ド を抽出する

LDREQ r0, [lr,#-4] ; いいえ : ワー ド を ロー ド し ...BICEQ r0, r0, #0xFF000000 ; ... コ メ ン ト フ ィ ール ド を抽出する

; r0 は SVC 番号を含む

; r1 はス タ ッ ク レジス タ へのポイ ン タ を含む

BL C_SVC_Handler ; ハン ド ラ の本体を呼び出す

LDMFD sp!, {r0, r3} ; ス タ ッ ク か ら spsr を取得する

15 14 13121110 9 8 7 0

comment field

8_bit_immediate1 1 11 1 110

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-24ID 011811 Non-Confidential

Page 123: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

MSR SPSR_cxsf, r0 ; spsr を復元する

LDMFD sp!, {r0-r3, r12, pc}^ ; レジス タ を復元し、 復帰するEND

6.18.1 関連項目

概念

• 「呼び出す SVC の決定」 (ページ 6-26)

• 「アセンブリ言語を使用した SVC ハンドラ」 (ページ 6-27)

• 「C 言語およびアセンブリ言語を使用した SVC ハンドラ」 (ページ 6-28)

• 「スーパーバイザモードでの SVC の使用」 (ページ 6-30)

• 「アプリケーションからの SVC の呼び出し」 (ページ 6-31)

• 「アプリケーションからの動的な SVC の呼び出し」 (ページ 6-33)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-25ID 011811 Non-Confidential

Page 124: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.19 呼び出す SVC の決定

SVC ハンドラは起動時に、どの SVC が呼び出されているかを特定する必要がありま

す。この情報は、図 6-4 に示すように命令自体の 0 ~ 23 ビットに保存するか、1 つの

整数レジスタに渡されます。通常、この整数レジスタには R0 ~ R3 のいずれかが使用

されます。

図 6-4 ARM SVC 命令

トップレベルの SVC ハンドラでは、SVC 命令を LR の相対アドレスにロードできます。

このロードは、アセンブリ言語か、C/C++ インラインアセンブラまたは組み込みア

センブラで行います。

SVC ハンドラは、まず例外を発生させた SVC 命令をレジスタにロードする必要があり

ます。この時点で、SVC LR には、SVC 命令の次の命令のアドレスが保持されている

ので、SVC が以下を使用してレジスタ(この場合は R0)にロードされます。

LDR R0, [lr,#-4]

SVC ハンドラは次にコメントフィールドビットを検査し、要求されている処理を特

定します。SVC 番号は、オペコードの上位 8 ビットをクリアすることによって抽出

されます。

BIC R0, R0, #0xFF000000

以下の例は、これらの命令を組み合わせてトップレベルの SVC ハンドラを作成する

方法を示しています。ARM 状態と Thumb 状態の両方で SVC 命令を処理するハンドラ

の例については、「SVC ハンドラ」 (ページ 6-24)の例を参照して下さい。

例 6-9 トップレベルの SVC ハンドラ

PRESERVE8 AREA TopLevelSVC, CODE, READONLY ; こ の コ ー ド ブ ロ ッ ク に名前を付ける。 EXPORT SVC_HandlerSVC_Handler

PUSH {R0-R12,lr} ; レジス タ を保存する。

LDR R0,[lr,#-4] ; SVC 命令のア ド レ ス を計算し、

; R0 に ロー ドする。

BIC R0,R0,#0xFF000000 ; 命令の上位 8 ビ ッ ト を マ ス ク し て、

; SVC 番号を与える。 ; ; R0 の値を使用し て、 実行する SVC ルーチ ン を判定する。 ; LDM sp!, {R0-R12,pc}^ ; レジス タ を復元し、 復帰する。 END

31 28 27 26 25 24 23 0cond 24_bit_immediate1 1 1 1

comment field

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-26ID 011811 Non-Confidential

Page 125: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.20 アセンブリ言語を使用した SVC ハンドラ

要求された SVC 番号のハンドラを呼び出す も簡単な方法は、ジャンプテーブルを

使用する方法です。R0 に SVC 番号が含まれている場合、以下の例に示したコードを 「トップレベルの SVC ハンドラ」 (ページ 6-26)の例のトップレベルハンドラの BIC 命令に続けて挿入できます。

例 6-10 SVC ジャンプテーブル

AREA SVC_Area, CODE, READONLYPRESERVE8IMPORT SVCOutOfRangeIMPORT MaxSVC

CMP R0,#MaxSVC ; 範囲チ ェ ッ ク LDRLS pc, [pc,R0,LSL #2] B SVCOutOfRangeSVCJumpTable DCD SVCnum0 DCD SVCnum1 ; 他のそれぞれの SVC ルーチ ンの DCDSVCnum0 ; SVC 番号 0 の コ ー ド B EndofSVCSVCnum1 ; SVC 番号 1 の コ ー ド B EndofSVC ; SVC 処理コードの残り の部分EndofSVC ; 実行を ト ッ プ レベル

; SVC ハン ド ラ に返し て、 レジス タ を復元し、

; プ ロ グ ラ ムに復帰する。END

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-27ID 011811 Non-Confidential

Page 126: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.21 C 言語およびアセンブリ言語を使用した SVC ハンドラ

トップレベルのハンドラは常に ARM アセンブリ言語で記述する必要がありますが、

各 SVC を処理するルーチンはアセンブリ言語でも C 言語でも記述できます。

トップレベルのハンドラでは、BL 命令を使用して適切な C 関数にジャンプします。

SVC 番号はアセンブリルーチンによって R0 にロードされるため、この値は 初のパ

ラメータとして C 関数に渡されます。C 関数はこの値を switch() ステートメントなど

で使用できます。以下の例を参照して下さい。

この C 関数を呼び出すには、「トップレベルの SVC ハンドラ」 (ページ 6-26)の例の SVC_Handler ルーチンに以下の行を追加します。

BL C_SVC_Handler ; SVC を処理するための C ルーチ ン を呼び出す

例 6-11 C 関数の SVC ハンドラ

void C_SVC_handler (unsigned number){ switch (number) { case 0 :/* SVC 番号 0 の コ ー ド */

... break; case 1 :/* SVC 番号 1 の コ ー ド */

... break;

... default :/* 不明な SVC - レポー ト エ ラ ー */ }}

場合によってスーパーバイザモードのスタック空間には制限があるため、大量のスタック空間を必要とする関数の使用は避けて下さい。

MOV R1, sp ; C ルーチ ンの第 2 パ ラ メ ー タ ... ; ... は、 レジス タ値へのポイ ン タ。

BL C_SVC_Handler ; SVC を処理するための C ルーチ ン を呼び出す。

トップレベルのハンドラがスタックポインタの値を第 2 パラメータとして R1 の C 関数に渡し、C 関数がこの値にアクセスするために更新される場合には、C 言語で記述

した SVC ハンドラとの間で値を受け渡すことができます。

void C_SVC_handler(unsigned number, unsigned *reg)

これでこの C 関数は、メインアプリケーションコード内で SVC 命令が検出されたとき

にレジスタに保持されている値にアクセスできます(以下の例を参照)。値はレジスタから以下のように読み出します。

value_in_reg_0 = reg [0]; value_in_reg_1 = reg [1]; value_in_reg_2 = reg [2]; value_in_reg_3 = reg [3];

そして、以下のように書き戻します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-28ID 011811 Non-Confidential

Page 127: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

reg [0] = updated_value_0; reg [1] = updated_value_1; reg [2] = updated_value_2; reg [3] = updated_value_3;

これにより、更新された値が適切なスタック位置に書き込まれ、トップレベルのハンドラによってレジスタに復元されます。

図 6-5 スーパーバイザモードのスタックへのアクセス

6.21.1 関連項目

概念

• 「スーパーバイザモードでの SVC の使用」 (ページ 6-30)

lr_SVC

r0

r1

r2

r3

Previous sp_SVC

sp_SVC

r12

reg [3]

reg [0]

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-29ID 011811 Non-Confidential

Page 128: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.22 スーパーバイザモードでの SVC の使用

SVC 命令が実行される場合、以下のようになります。

1. プロセッサがスーパーバイザモードに入ります。

2. CPSR が SVC SPSR に格納されます。

3. 復帰アドレスが SVC LR に格納されます。「例外に対するプロセッサの応答」 (ページ 6-10)を参照して下さい。

プロセッサが既にスーパーバイザモードにあるときは、SVC LR および SPSR が破壊

されます。

スーパーバイザモードで SVC を呼び出す場合は、LR と SPSR の元の値が失われない

ように SVC LR および SPSR を保存しておく必要があります。例えば、特定の SVC 番号のハンドラルーチンが別の SVC を呼び出す場合は、そのハンドラルーチンで SVC LR と SPSR の両方をスタックに格納する必要があります。この動作の結果、ハンド

ラが呼び出されるごとに、ハンドラを呼び出した SVC に続く命令に復帰するために必

要な情報が保存されることが保証されます。以下の例は、この方法を示しています。

例 6-12 SVC ハンドラ

AREA SVC_Area, CODE, READONLY PRESERVE8 EXPORT SVC_Handler IMPORT C_SVC_HandlerT_bit EQU 0x20SVC_Handler

PUSH {R0-R3,R12,lr} ; レジス タ を保存する。

MOV R1, sp ; ポ イ ン タ をパ ラ メ ー タ に設定する。

MRS R0, SPSR ; SPSR を取得する。

PUSH {R0,R3} ; SPSR を ス タ ッ ク および別のレジス タ に保存し て、

; 8 バイ ト で整列されたス タ ッ ク を保持する。 入れ子にな っ た SVC でのみ必要。

TST R0,#0x20 ; Thumb 状態で発生し たか ?LDRHNE R0,[lr,#-2] ; はい : ハー フ ワー ド を ロー ド し ...BICNE R0,R0,#0xFF00 ; ... コ メ ン ト フ ィ ール ド を抽出する。

LDREQ R0,[lr,#-4] ; いいえ : ワー ド を ロ ー ド し ...BICEQ R0,R0,#0xFF000000 ; ... コ メ ン ト フ ィ ール ド を抽出する。

; R0 は SVC 番号を含む

; R1 はス タ ッ ク レジス タ へのポイ ン タ を含む

BL C_SVC_Handler ; SVC を処理するための C ルーチ ン を呼び出す。

POP {R0,R3} ; ス タ ッ ク か ら SPSR を取得する。

MSR SPSR_cf, R0 ; SPSR を復元する。

LDM sp!, {R0-R3,R12,pc}^ ; レジス タ を復元し、 復帰する。 END

6.22.1 C/C++ で記述した入れ子構造の SVC

C または C++ で入れ子になった SVC を記述できます。コンパイラによって生成され

るコードは、必要に応じて lr_SVC のストアと再ロードを実行します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-30ID 011811 Non-Confidential

Page 129: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.23 アプリケーションからの SVC の呼び出し

SVC はアセンブリ言語または C/C++ から呼び出すことができます。

アセンブリ言語では、必要なレジスタ値を設定して関連 SVC を発行します。以下に

例を示します。

MOV R0, #65 ; R0 に値 65 を ロー ドする

SVC 0x0 ; R0 のパ ラ メ ー タ値を使用し て SVC 0x0 を呼び出す

SVC 命令は、ほぼすべての ARM 命令と同じように、条件付きで実行できます。

C/C++ からは SVC を __SVC 関数として宣言し、これを呼び出します。以下に例を示し

ます。

__svc(0) void my_svc(int); . . . my_svc(65);

これにより、以下の条件下で、呼び出しのオーバーヘッドを新たに発生させることなく SVC をインラインでコンパイルできます。

• すべての引数を R0 ~ R3 のみで渡す。

• すべての結果を R0 ~ R3 のみで返す。

SVC が実際の関数呼び出しであるかのように、パラメータが SVC に渡されます。し

かし、2 ~ 4 個の戻り値がある場合には、それらの戻り値が構造体で返されることを

コンパイラに通知する必要があるため、__value_in_regs ディレクティブを使用しま

す。これは通常、struct の値を取る関数が、結果の構造体が配置されるアドレスを第 1 引数に取る void 関数と同じように処理されるためです。

以下の例は、0x0、0x1、0x2、および 0x3 の SVC 番号を取る SVC ハンドラを示していま

す SVC 0x0 および SVC 0x1 は、それぞれ 2 つの整数パラメータを使用し、1 つの結果を

返します。SVC 0x2 は 4 つのパラメータを使用し、1 つの結果を返します。SVC 0x3 は 4 つのパラメータを使用し、4 つの結果を返します。

例 6-13 main.c

#include <stdio.h>#include "svc.h"unsigned *svc_vec = (unsigned *)0x08;extern void SVC_Handler(void);int main( void ){ int result1, result2; struct four_results res_3; Install_Handler( (unsigned) SVC_Handler, svc_vec ); printf("result1 = multiply_two(2,4) = %d\n", result1 = multiply_two(2,4)); printf("result2 = multiply_two(3,6) = %d\n", result2 = multiply_two(3,6)); printf("add_two( result1, result2 ) = %d\n", add_two( result1, result2 )); printf("add_multiply_two(2,4,3,6) = %d\n", add_multiply_two(2,4,3,6)); res_3 = many_operations( 12, 4, 3, 1 ); printf("res_3.a = %d\n", res_3.a ); printf("res_3.b = %d\n", res_3.b ); printf("res_3.c = %d\n", res_3.c );

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-31ID 011811 Non-Confidential

Page 130: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

printf("res_3.d = %d\n", res_3.d ); return 0;}

例 6-14 svc.h

__svc(0) int multiply_two(int, int);__svc(1) int add_two(int, int);__svc(2) int add_multiply_two(int, int, int, int);struct four_results{ int a; int b; int c; int d;};__svc(3) __value_in_regs struct four_results many_operations(int, int, int, int);

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-32ID 011811 Non-Confidential

Page 131: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.24 アプリケーションからの動的な SVC の呼び出し

状況によっては、SVC 番号が実行時までわからない SVC を呼び出さなければならな

い場合があります。このような状況は、例えば 1 つのオブジェクト上で実行される

複数の処理が関連し合っていて、各処理ごとに SVC があるような場合に発生します。

このような場合には、前述の方法は適切ではありません。

この状況には、以下のような方法で対処できます。

• SVC 番号から SVC 命令を構成し、それをどこかに格納した後で実行する。

• それ自身の引数に対して実行される実際の処理のためのコードを別の引数として取る汎用 SVC を使用する。この汎用 SVC によって処理がデコードされ、実

行されます。

2 番目の方法としては、要求される処理を示す値をレジスタ(通常は R0 または R12)に渡すことで、アセンブリ言語で実装できます。これで、SVC ハンドラが適切なレ

ジスタ内の値を基に動作するように書き直すことができます。

場合によっては値をコメントフィールドの SVC に渡す必要があるため、これらの 2 つの方法を組み合わせて使用することもあります。

例えば、オペレーティングシステムが 1 つの SVC 命令しか使用せず、レジスタを使用

して要求される処理番号を渡すとします。この場合は残りの SVC 空間をアプリケー

ション固有の SVC に使用することができます。この方法は、特定のアプリケーショ

ンで、命令からの処理番号の抽出にかかるオーバーヘッドが大きすぎる場合に利用できます。ARM および Thumb のセミホスト命令は、この方法で実装されます。

以下の例は、C の関数呼び出しをセミホスティング呼び出しに対応付けるときの __svc の使用方法を示しています。

例 6-15 C 関数のセミホスティング呼び出しへの対応付け

#ifdef __thumb/* Thumb セ ミ ホス テ ィ ン グ */#define SemiSVC 0xAB#else/* ARM セ ミ ホス テ ィ ン グ */#define SemiSVC 0x123456#endif/* 文字を書き込むためのセ ミ ホステ ィ ン グ呼び出し */__svc(SemiSVC) void Semihosting(unsigned op, char *c);#define WriteC(c) Semihosting (0x3,c)void write_a_character(int ch){ char tempch = ch; WriteC( &tempch );}

コンパイラには、R12 を使用して要求される処理番号の受け渡しを行うためのメカニ

ズムが組み込まれています。AAPCS では R12 は ip レジスタであり、関数呼び出しの

間だけ専用の役割が与えられます。それ以外のときは、このレジスタをスクラッチレジスタとして使用できます。前述のとおり、汎用 SVC への引数はレジスタ R0 ~ R3 で渡され、それらの値は必要に応じて R0 ~ R3 に返されます(「アプリケーション

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-33ID 011811 Non-Confidential

Page 132: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

からの SVC の呼び出し」 (ページ 6-31)を参照)。R12 に渡す処理番号は、汎用 SVC によって呼び出される SVC の値にすることができますが、必ずしもそうする必要は

ありません。

以下の例は、汎用(間接)SVC を使用する C コードを示しています。

例 6-16 間接 SVC の使用

__svc_indirect(0x80) unsigned SVC_ManipulateObject(unsigned operationNumber, unsigned object,unsigned parameter);unsigned DoSelectedManipulation(unsigned object, unsigned parameter, unsigned operation){ return SVC_ManipulateObject(operation, object, parameter);}

これによって以下のコードが生成されます。

DoSelectedManipulationPUSH {R4,lr}

MOV R12,R2 SVC #0x80 POP {R4,pc} END

また、__svc のメカニズムを使用して、C 言語から SVC 番号を R0 に入れて渡すことも

可能です。例えば、SVC 0x0 が汎用 SVC として使用され、処理 0 が文字の読み出し、

処理 1 が文字の書き込みである場合は、以下のように設定できます。

__svc (0) char __ReadCharacter (unsigned op);__svc (0) void __WriteCharacter (unsigned op, char c);

上記は、以下のように定義しておくとわかりやすくなります。

#define ReadCharacter () __ReadCharacter (0);#define WriteCharacter (c) __WriteCharacter (1, c);

しかし、R0 をこの方法で使用した場合、SVC にパラメータを渡すレジスタには 3 つのレジスタしか使用できません。通常、R0 ~ R3 よりも多くのパラメータをサブルー

チンに渡す必要がある場合には、スタックを使用します。ただし、スタックに格納されるパラメータは、SVC ハンドラが使用するスーパーバイザモードスタックでは

なくユーザモードスタックに格納されるのが一般的であるため、SVC ハンドラから

は簡単にアクセスできません。

別の方法としては、レジスタの 1 つ(通常は R1)を使用して、他のパラメータが保

存されているメモリブロックを参照する方法があります。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-34ID 011811 Non-Confidential

Page 133: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.25 プリフェッチアボートハンドラ

システムに MMU が存在しない場合は、プリフェッチアボートハンドラでエラーを

通知して実行を終了できます。MMU が存在する場合には、アボートを発生させたア

ドレスが物理メモリに復元される必要があります。lr_ABT は、アボートの原因となっ

たアドレスの次のアドレスにある命令を指しているため、復元する必要のあるアドレスは lr_ABT-4 となります。そのアドレスに対して仮想メモリのメモリ障害が処理さ

れると、命令フェッチが再試行されます。プリフェッチアボートハンドラは、次の命令ではなく、アボートを発生させた命令に復帰します。以下に例を示します。

SUBS pc,lr,#4

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-35ID 011811 Non-Confidential

Page 134: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.26 未定義命令ハンドラ

未定義命令例外は、次の場合に生成されます。

• プロセッサが命令を認識しない場合

• プロセッサがコプロセッサ命令として命令を認識しているにもかかわらず、コプロセッサがその命令を認識しない場合

例えば、命令がコプロセッサ用の命令であるにもかかわらず、それに関連する VFP などのコプロセッサがシステムに接続されていないか、無効にされているケースが考えられます。ただし、そのようなコプロセッサ用のソフトウェアエミュレータを使用することも可能です。

このようなエミュレータは、以下のような処理を行う必要があります。

1. 未定義命令ベクタに接続し、古い内容を保存します。

2. 未定義命令を検査し、エミュレートする必要があるかどうかをチェックします。このチェックは、SVC ハンドラが SVC 番号を抽出する方法と似ています

が、エミュレータでは下位 24 ビットを抽出するのではなく、ビット 27 ~ 24 を抽出する必要があります。

これらのビットに基づき、以下の方法でその命令がコプロセッサ命令であるかどうかが判断されます。

• ビット 27 ~ 24 が b1110 または b110x の場合、その命令はコプロセッサ命

令です。

• ビット 8 ~ 11 が、コプロセッサエミュレータによってその命令を処理す

る必要があることを示している場合、エミュレータはその命令を処理してユーザプログラムに復帰する必要があります。

3. 上記以外の場合、エミュレータはインストール時に保存されたベクタを使用して、その例外を元のハンドラまたはチェイン内の次のエミュレータに渡す必要があります。

チェイン内のどのエミュレータもその命令を処理できない場合には、未定義命令ハンドラがエラーを通知して終了する必要があります。

注 ARMv6T2 以前の Thumb 命令セットにはコプロセッサ命令がないため、未定義命令ハ

ンドラでそのような命令をエミュレートする必要はありません。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-36ID 011811 Non-Confidential

Page 135: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.27 ARMv6-M および ARMv7-M プロファイル

ここでは、マイクロコントローラプロファイル(Cortex-M1 や Cortex-M3 など)がサ

ポートしている各種の例外の処理方法について説明します。

マイクロコントローラプロファイルは、以下をサポートします。

• スレッドモードとハンドラモードの 2 つの動作モード

• 特権モードとユーザモードの 2 つの実行モード

スレッドモードは、リセット時、および通常は例外からの復帰時に開始されます。スレッドモードでは、特権モードまたはユーザモードのいずれかでコードを実行できます。

ハンドラモードは、例外が発生した結果、開始されます。コードはすべて特権モードで実行されます。例外が発生すると、プロセッサは自動的に特権モードに切り替わります。

特権モードにはフルアクセス権が備わっています。

ユーザモードのアクセス権は制限されています。制限は以下のとおりです。

• 命令の使用に対する制限(MSR 命令で使用可能なフィールドなど)

• 特定のコプロセッサレジスタの使用に対する制限

• システム設計に基づいたメモリおよびペリフェラルへのアクセスに対する制限

• MPU コンフィギュレーションによって課されたメモリおよびペリフェラルへの

アクセスに対する制限

MSR 命令を使用して CONTROL[0] をクリアすることで、特権スレッドモードからユー

ザスレッドモードに切り替えることができます。ただし、SVC などの例外を経由せ

ずにユーザモードから特権モードに直接切り替えることはできません。

6.27.1 関連項目

概念

• 「スーパーバイザコール」 (ページ 6-49)

• 「ARMv6 とそれ以前、ARMv7-A、および ARMv7-R プロファイルの例外のタイプ」 (ページ 6-5)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-37ID 011811 Non-Confidential

Page 136: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.28 メインスタックおよびプロセススタック

マイクロコントローラプロファイルは、メインスタックとプロセススタックの 2 種類のスタックをサポートしています。プロセッサには、スタックそれぞれに対応した 2 つのスタック ポインタがあります。使用中のスタックに応じて、1 つのスタック

ポインタのみが一度に使用されます。

メイン スタックは、リセット時、および例外ハンドラへのエントリ時に使用されま

す。プロセススタックを使用するには、このスタックを選択する必要があります。この操作は、MSR 命令を使用して CONTROL[1] に書き込むことによってスレッドモー

ドで行うことができます。

注 初期化またはコンテキスト切り替えコードでプロセススタックポインタを初期化す

る必要があります。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-38ID 011811 Non-Confidential

Page 137: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.29 マイクロコントローラプロファイルの例外のタイプ

以下の表は、マイクロコントローラプロファイルによって認識される例外のタイプを示しています。複数の例外が同時に発生した場合、これらの例外は決まった優先度順に処理されます。各例外が順に処理されてから、元のアプリケーションに戻ります。

低い優先度番号を持つ例外に高い優先度ステータスが設定されます。例えば、プロセッサがハンドラモードの場合、その優先度番号が、現在処理中の例外よりも低い場合には、例外が発生します。同じまたは高い優先度番号を持つ例外は、保留されます。

例外ハンドラの終了時には、以下の操作が行われます。

• 保留中の例外が存在しない場合、プロセッサはスレッドモードに復帰し、例外はアプリケーションプログラムに復帰します。

• 保留中の例外が存在する場合は、 も低い優先度番号を持つ保留中の例外のハンドラに制御が渡されます。 も低い優先度番号を持つ保留中の例外が 2 つ存

在する場合は、より低い例外番号を持つ例外が先に処理されます。

表 6-2 優先度別の例外のタイプ

位置 例外 優先度 無効 説明

1 リセット –3 なし

2 NMI –2 なし マスク不可割り込み(NMI)

3 HardFault –1 なし 他の例外によってカバーされないすべてのエラー

4 MemManage 設定可能 可能 メモリ保護エラー(ARMv7-M のみ)

5 BusFault 設定可能 可能 他のメモリエラー(ARMv7-M のみ)

6 UsageFault 設定可能 可能 メモリエラー以外の命令例外エラー(ARMv7-M のみ)

7-10 予約 - -

11 SVCall 設定可能 可能 SVC 命令の実行による同期 SVC 呼び出し

12 デバッグモニタ

設定可能 可能 同期デバッグイベント(ARMv7-M のみ)

13 予約 - -

14 PendSV 設定可能 可能 非同期 SVC 呼び出し

15 SysTick 設定可能 可能 システムタイマ Tick

16 以上 外部割り込み

設定可能 可能 外部割り込み

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-39ID 011811 Non-Confidential

Page 138: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.30 ARMv6-M および ARMv7-M プロファイルのベクタテーブル

マイクロコントローラプロファイルのベクタテーブルには、関連するハンドラのアドレスが含まれています。例外番号 n のハンドラは、(vectorbaseaddress + 4 * n)にあ

ります。

ARMv7-M プロセッサでは、ベクタテーブルオフセットレジスタ(VTOR)内の vectorbaseaddress を指定して、ベクタテーブルを再配置できます。リセット時のデ

フォルトの場所は、0x0(CODE スペース)です。ARMv6-M の場合、ベクタテーブル

のアドレスは、0x0 に固定されます。vectorbaseaddress のワードは、メインスタック

ポインタのリセット値を含んでいます。

注 下位ビット(ベクタテーブルの各アドレスのビット[0])を設定する必要があり

ます。設定しない場合は、HardFault 例外が発生します。テーブルで Thumb シンボル

名が使用されている場合、ARM コンパイラツールチェーンでは、通常、この設定が

有効になります。

6.30.1 関連項目

概念

• 「ベクタテーブルオフセットレジスタ(ARMv7-M のみ)」 (ページ 6-41)

• 「ARMv6-M および ARMv7-M プロファイルの例外テーブルの書き込み」 (ページ 6-42)

参照

• 「マイクロコントローラプロファイルの例外のタイプ」 (ページ 6-39)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-40ID 011811 Non-Confidential

Page 139: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.31 ベクタテーブルオフセットレジスタ(ARMv7-M のみ)

ベクタテーブルオフセットレジスタは、CODE または SRAM スペースにベクタテー

ブルを配置します。別の位置を設定する場合、テーブル内の例外の数に基づいてオフセットを整列する必要があります。つまり、 大 16 個の割り込みに使用できる

小境界整列は 32 ワードです。それ以上の割り込みに対しては、次の 2 の累乗で切り

上げて境界を調整する必要があります。例えば、21 個の例外が必要な場合、テーブ

ルサイズは 37 ワードで次の 2 の累乗は 64 なので、64 ワードで境界整列する必要があ

ります。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-41ID 011811 Non-Confidential

Page 140: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.32 ARMv6-M および ARMv7-M プロファイルの例外テーブルの書き込み

ベクタテーブルにデータを入力する も簡単な方法は、スキャッタロード記述ファイルを使用してメモリアドレス 0x0 に C 関数ポインタの配列を配置する方法です。C 配列を使用すると、初期スタックポインタ、イメージのエントリポイント、および例外ハンドラのアドレスを設定できます(「例外ハンドラの C 構造の例」を参照)。

注 以下の例に示すいくつかの機能は、ARMv6-M では使用できません。境界整列を維持

するには、ベクタテーブルに 0 を入力してスペースを予約する必要があります。

例 6-17 例外ハンドラの C 構造の例

/* フ ァ イ ル名 : exceptions.c */typedef void(* const ExecFuncPtr)(void);/* テーブルを別のセ ク シ ョ ン に配置する */#pragma arm section rodata="exceptions_area"ExecFuncPtr exception_table[] = { (ExecFuncPtr)&Image$$ARM_LIB_STACKHEAP$$ZI$$Limit,

/* 初期ス タ ッ ク ポ イ ン タ。 リ ン カ で生成されたシンボルか ら */ (ExecFuncPtr)&__main, /* 初期 PC。 エ ン ト リ ポ イ ン ト に設定 */ &NMIException, &HardFaultException, &MemManageException, /* ARMv7-M のみ (ARMv6-M の場合は 0) */ &BusFaultException, /* ARMv7-M のみ (ARMv6-M の場合は 0) */ &UsageFaultException, /* ARMv7-M のみ (ARMv6-M の場合は 0) */ 0, 0, 0, 0, /* 予約 */ &SVCHandler, /* OS 拡張でのみ使用可能 */ &DebugMonitor, /* ARMv7-M のみ (ARMv6-M の場合は 0) */ 0, /* 予約 */ &PendSVC, /* OS 拡張でのみ使用可能 */ (ExecFuncPtr)&SysTickHandler, /* OS 拡張でのみ使用可能 */

/* 設定可能な割り込みはこ こ か ら開始 ...*/ &InterruptHandler, &InterruptHandler, &InterruptHandler /* : */};#pragma arm section

6.32.1 関連項目

概念

• 「ARMv6-M および ARMv7-M プロファイルのベクタテーブル」 (ページ 6-40)

• 「ベクタテーブルオフセットレジスタ(ARMv7-M のみ)」 (ページ 6-41)

『リンカの使用』:

• 第 8 章 スキャッタロード記述ファイルの使用

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-42ID 011811 Non-Confidential

Page 141: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.33 ネストされたベクタ割り込みコントローラ

実装に応じて、ネストされたベクタ割り込みコントローラ(NVIC)は、以下をサ

ポートできます。

ARMv6-M 4 つの異なる優先度レベルが設定された 1、8、16、または 32 個の外部

割り込み。

ARMv7-M 動的に再設定することが可能な 大 256 の異なる優先度レベルが設定さ

れた 大 240 個の外部割り込み。NVIC は、割り込みのテールチェイン

ニングもサポートしています。

マイクロコントローラプロファイルは、レベルとパルスの両方の割り込みソースをサポートしています。プロセッサ状態は、割り込みの開始時にハードウェアに自動的に保存され、割り込み終了時に復元されます。

マイクロコントローラプロファイルで NVIC が使用されているという事実は、ベクタ

テーブルが、命令ではなくアドレスが含まれているその他の ARM プロセッサとは大

きく異なることを意味しています。初期のスタックポインタ、およびリセットハンドラのアドレスは、それぞれ 0x0 および 0x4 に配置されている必要があります。これ

らのアドレスは、リセット時にプロセッサによって SP および PC レジスタにロード

されます。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-43ID 011811 Non-Confidential

Page 142: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.34 例外処理

マイクロコントローラプロファイルでは、例外の優先度付け、例外のネスト、および破壊される可能性のあるレジスタの保存はすべてプロセッサによって処理されるので、処理は非常に効率が高くなり、割り込みレイテンシが 小化されます。割り込みは、各例外ハンドラへの入力時に自動的に有効になるので、その他のプロセッサ用に記述されたプロジェクトからはトップレベルの再入可能コードを削除する必要があります。割り込みを無効にする必要がある場合は、コード内で処理する必要があります。また、例外からの復帰時に確実に割り込みを有効にする必要があります。

注 例外ハンドラは、割り込みソースをクリアする必要があります。

マイクロコントローラプロファイルには FIQ 入力はありません。その他のプロセッ

サのプロジェクトで FIQ を出すペリフェラルは、高優先度の外部割り込みに移動す

る必要があります。マイクロコントローラプロファイルにはバンクレジスタがないので、この種の割り込み用のハンドラがバンク FIQ レジスタを使用しないようにす

る必要が生じることがあります。また、他の通常の IRQ ハンドラと同じように R8 ~ R12 をスタックに積む必要があります。

マイクロコントローラプロファイルは、高い優先度が設定された無効にできないマスク不可割り込み(NMI)も提供します。

6.34.1 単純な C 例外ハンドラの例

マイクロコントローラプロファイル用の例外ハンドラがシステム状態を保存し復元する必要はありません。これらは通常の ABI 準拠の C 関数として記述できます。し

かし、__irq キーワードを使用して、関数を割り込みルーチンとして指定することが

推奨されます(以下の例を参照)。

例 6-18 単純な C 例外ハンドラ

__irq void SysTickHandler(void){

printf("----- SysTick Interrupt -----");}

6.34.2 8 バイト境界のスタック整列

ARM アーキテクチャ用のアプリケーションバイナリインタフェース(ABI)では、

各種のソースファイルにおける関数間の呼び出しなどのすべての外部インタフェースにおいて、スタックが 8 バイト境界で整列されている必要があります。ただし、

例えばリーフ関数のように、コードが内部で 8 バイト境界のスタック整列を保持す

る必要はありません。これは、IRQ の発生時にスタックが 8 バイト境界で正しく整列

されていない場合があることを意味します。

ARMv7-M プロセッサは例外の発生時にスタックポインタを自動的に整列できます。

この動作を有効にするには、コンフィギュレーション制御レジスタ内のアドレス 0xE000ED14 に STKALIGN(ビット 9)を設定します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-44ID 011811 Non-Confidential

Page 143: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

ARMv6-M プロセッサは、この動作を常に有効にします。しかし、STKALIGN(ビッ

ト 9)を手動で設定して、イメージで ARMv7-M プロセッサとの上位互換性を維持す

ることが推奨されます。

注 リビジョン 0 Cortex-M3 プロセッサを使用する場合、STKALIGN はサポートされてい

ないので、境界配列はハードウェアで実行されず、ソフトウェアによって実行する必要があります。コンパイラは、スタックを正しく整列するコードを IRQ ハンドラ

内に生成できます。これを行うには、IRQ ハンドラに __irq という接頭字を付け、

--cpu=Cortex-M3 の代わりに --cpu=Cortex-M3-rev0 コンパイラスイッチを使用する必要が

あります。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-45ID 011811 Non-Confidential

Page 144: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.35 システム制御空間レジスタの設定

システム制御空間(SCS)レジスタは、0xE000E000 にあります。構造体を使用して、

このような多くのレジスタおよび関連オフセットを表現することができます(以下の例を参照)。その後、ベクタテーブルの場合と同様に、スキャッタロード記述ファイルを使用して、構造体を正しいメモリ位置に配置できます。

以下の例は、Cortex-M1 と Cortex-M3 の両方のプロセッサ用のコードを示していま

す。

例 6-19 SCS レジスタ構造体および定義

typedef volatile struct {int MasterCtrl;int IntCtrlType;

int zReserved008_00c[2]; /* 予約済みスペース */

struct {int Ctrl;int Reload;int Value;int Calibration;

} SysTick;

int zReserved020_0fc[(0x100-0x20)/4]; /* 予約済みスペース *//* オ フ セ ッ ト 0x0100* 整列を保証するために割り当て られた追加のスペース*/

struct {int Enable[32];int Disable[32];int Set[32];int Clear[32];int Active[64]; /* ARMv7-M のみ */int Priority[64];

} NVIC;

int zReserved0x500_0xcfc[(0xd00-0x500)/4]; /* 予約済みスペース *//* オ フ セ ッ ト 0x0d00 */

int CPUID;int IRQcontrolState;int ExceptionTableOffset;int AIRC;int SysCtrl; /* ARMv7-M のみ */int ConfigCtrl; /* ARMv7-M のみ */int SystemPriority[3]; /* ARMv7-M のみ */

int zReserved0xd40_0xd90[(0xd90-0xd40)/4]; /* 予約済みスペース *//* オ フ セ ッ ト 0x0d90 */

struct {int Type; /* ARMv7-M のみ */int Ctrl; /* ARMv7-M のみ */int RegionNumber; /* ARMv7-M のみ */int RegionBaseAddr; /* ARMv7-M のみ */

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-46ID 011811 Non-Confidential

Page 145: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

int RegionAttrSize; /* ARMv7-M のみ */} MPU; /* ARMv7-M のみ */

} SCS_t;

/* * シス テム制御空間 (SCS) レジス タ

* を別個のセ ク シ ョ ン に配置する こ と に よ り、 スキ ャ ッ タ フ ァ イ ルを使用し て適切に配置でき る */#pragma arm section zidata="scs_registers"SCS_t SCS;#pragma arm section

注 SCS レジスタの内容は、実装によって異なる場合があります。例えば、オペレー

ティングシステム拡張が実装されていない場合は、SysTick レジスタがないことがあ

ります。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-47ID 011811 Non-Confidential

Page 146: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.36 個別の IRQ の設定

各 IRQ は、NVIC レジスタの一部である割り込み有効設定レジスタ内に、個別の有効

ビットを持っています。IRQ を有効または無効にするには、割り込み有効設定レジ

スタ内の対応するビットを 1 (有効)または 0 (無効)に設定する必要があります。

割り込み有効設定レジスタの詳細については、使用するデバイスのリファレンスマニュアルを参照して下さい。

以下の例は、「SCS レジスタ構造体および定義」 (ページ 6-46)の例に示す SCS 構造

体の IRQ を有効にする一般的な関数を示します。

例 6-20 IRQ 有効関数

void NVIC_enableISR(unsigned isr){

/* isr 引数は、 有効にする割り込みの数を示す。 */SCS.NVIC.Enable[ (isr/32) ] = 1<<(isr % 32);

}

注 NVIC 領域内の一部のレジスタには、特権モードでのみアクセスできます。

優先度が固定されたハードエラー、マスク不可割り込み(NMI)、およびリセットと

は別に、割り込み優先度レジスタを使用して、個々の割り込みに優先度レベルを割り当てることができます。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-48ID 011811 Non-Confidential

Page 147: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.37 スーパーバイザコール

以前の ARM プロセッサと同様に、SVC を生成する SVC 命令があります。SVC は、通

常は特権操作を要求するか、オペレーティングシステムからシステムリソースにアクセスするために使用します。

SVC 命令には、SVC 番号と呼ばれる番号が埋め込まれていることがあります。ほとん

どの ARM プロセッサでは、この番号を使用して、要求されているサービスが示され

ます。マイクロコントローラプロファイルでは、プロセッサは 初の例外開始時に引数レジスタをスタックに保存します。

SVC ハンドラの 初の命令が実行される前に発生する後続の例外により、R0 ~ R3 にまだ保持されている引数のコピーが壊されてしまうことがあります。このため、SVC ハンドラでは引数のスタックコピーを使用する必要があります。戻り値も、ス

タックレジスタ値を変更することで、呼び出し元に戻す必要があります。これを行うには、短いアセンブリコードを SVC ハンドラの開始時に実装する必要があります。

このコードは、レジスタの保存場所を識別し、命令から SVC 番号を抽出して、番号

および引数のポインタを C 言語で記述されたハンドラのメイン本体に渡します。

以下の例は、SVC ハンドラの例を示しています。このコードは、プロセッサが設定

した EXC_RETURN 値をテストして、SVC が呼び出されたときにどのスタックポイン

タが使用されていたかを判断します。これは再入可能 SVC の場合に便利ですが、一

般的なシステム設計では SVC はプロセススタックを使用するユーザコードからのみ

呼び出されるのでメモリシステム上では不要です。そのような場合、アセンブリコードは 1 つの MSR 命令に続いてハンドラの C 本体への末尾呼び出し分岐(B 命令)

のみで構成できます。

例 6-21 SVC ハンドラの例

__asm void SVCHandler(void){

IMPORT SVCHandler_mainTST lr, #4ITE EQMRSEQ R0, MSPMRSNE R0, PSPB SVCHandler_main

}void SVCHandler_main(unsigned int * svc_args){

unsigned int svc_number;/** ス タ ッ ク の内容 :

* R0、 R1、 R2、 R3、 R12、 R14、 復帰ア ド レ ス、 および xPSR* 初の引数 (R0) は svc_args[0]*/svc_number = ((char *)svc_args[6])[-2];switch(svc_number){

case SVC_00:/* SVC 00 を処理する */break;

case SVC_01:/* SVC 01 を処理する */break;

default:/* 不明な SVC */

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-49ID 011811 Non-Confidential

Page 148: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

break;}

}

以下の例は、複数の SVC に対する異なる宣言方法を示しています。__svc は、指定し

た番号を含む SVC 命令で関数呼び出しを置き換えるコンパイラキーワードです。

例 6-22 C コードからの SVC の呼び出しの例

#define SVC_00 0x00#define SVC_01 0x01void __svc(SVC_00) svc_zero(const char *string);void __svc(SVC_01) svc_one(const char *string);int call_system_func(void){

svc_zero("String to pass to SVC handler zero");svc_one("String to pass to a different OS function");

}

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-50ID 011811 Non-Confidential

Page 149: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.38 システムタイマ

SCS には、オペレーティングシステムが別のプラットフォームからの移植を簡易化

するために使用できるシステムタイマ、SysTick が用意されています。SysTick はソ

フトウェアでポーリングするか、割り込みを生成するように SysTick を設定できま

す。SysTick 割り込みはベクタテーブルに独自のエントリを持っているので、独自の

ハンドラを所有できます。

以下の表に、SysTick の設定に使用する 4 つのレジスタについて説明します。

6.38.1 関連項目

概念

• 「SysTick の設定」 (ページ 6-52)

表 6-3

名前 アドレス 説明

SysTick Control and Status 0xE000E010 SysTick の基本的な制御 : 有効、クロックソース、割り込み、

またはポーリング

SysTick Reload Value 0xE000E014 0 に達したときに Current Value レジスタをロードするための

SysTick Current Value 0xE000E018 カウントダウンの現在値

SysTick Calibration Value 0xE000E01C カウントダウンの現在値

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-51ID 011811 Non-Confidential

Page 150: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

プロセッサ例外処理

6.39 SysTick の設定

SysTick を設定するには、SysTick イベント間に必要な間隔を SysTick Reload Value レジスタにロードします。SysTick Control and Status レジスタのタイマ割り込み、つま

り COUNTFLAG ビットは、1 から 0 に遷移したときにアクティブになるので、n+1 クロック Tick ごとにアクティブになります。100 の期間が必要な場合は、99 を SysTick Reload Value レジスタに書き込みます。SysTick Reload Value レジスタは、0x1 ~ 0x00FFFFFF の範囲の値をサポートしています。

SysTick を使用して 1ms などの一定の間隔でイベントを生成する場合は、SysTick Calibration Value レジスタを使用して、Reload レジスタの値をスケーリングできます。

SysTick Calibration Value レジスタは、10ms の期間のパルス数を TENMS フィールドの

ビット[23:0]に含んでいる読み取り専用レジスタです。

このレジスタには SKEW ビットが含まれています。ビット[30] == 1 は、TENMS セクション内の 10ms の調整が、クロック周波数が原因で正確に 10ms になっていない

ことを示します。ビット[31] == 1 は、リファレンスクロックが提供されていないこ

とを示します。

注 Cortex-M1 プロセッサの場合、較正値が不明なので TENMS フィールドは 0 として読

み出されます。

Control and Status レジスタは、COUNTFLAG のビット[16]、および割り込みを生成

する SysTick によってタイマをポーリングできます。

デフォルトでは、SysTick はポーリングモード用に設定されています。このモードで

は、ユーザは COUNTFLAG をポーリングして、SysTick イベントが発生したかどう

かを確認します。イベントの発生は、COUNTFLAG が設定されることによって示さ

れます。Control and Status レジスタを読み取ると、COUNTFLAG がクリアされます。

SysTick が割り込みを生成するように設定するには、SysTick Control and Status レジス

タの TICKINT のビット[1]を 1 に設定します。NVIC 内の該当する割り込みを有効

にし、CLKSOURCE のビット[2]を使用してクロックソースを選択する必要もあり

ます。このビットを 1 に設定するとプロセッサクロックが選択され、0 に設定すると

外部リファレンスクロックが選択されます。

注 ARMv6-M プロセッサの場合、SysTick は常にプロセッサクロックを使用するので CLKSOURCE フィールドは 1 として読み出されます。

タイマは、SysTick Status and Control レジスタのビット[0]を設定して有効にできま

す。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 6-52ID 011811 Non-Confidential

Page 151: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

第 7 章 デバッグ通信チャネル

以下の各トピックでは、デバッグ通信チャネル(DCC)の使用方法について説明しま

す。

• 「デバッグ通信チャネルについて」 (ページ 7-2)• 「ターゲットとホストデバッグツールの間の DCC 通信」 (ページ 7-3)• 「割り込み駆動型デバッグ通信」 (ページ 7-4)• 「Thumb 状態からのアクセス」 (ページ 7-6)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 7-1ID 011811 Non-Confidential

Page 152: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

デバッグ通信チャネル

7.1 デバッグ通信チャネルについて

ARM プロセッサに組み込まれている EmbeddedICE® のロジックには、デバッグ通信

チャネルが実装されています。この実装により、ターゲットとホストデバッグツール間でのデータの受け渡しが可能になります。ここでは、ターゲット上で実行されるプログラムとホストデバッガから DCC にアクセスする方法について説明します。

7.1.1 関連項目

概念 • 「ターゲットとホストデバッグツールの間の DCC 通信」 (ページ 7-3)• 「割り込み駆動型デバッグ通信」 (ページ 7-4)• 「Thumb 状態からのアクセス」 (ページ 7-6)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 7-2ID 011811 Non-Confidential

Page 153: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

デバッグ通信チャネル

7.2 ターゲットとホストデバッグツールの間の DCC 通信

DCC には、ARM 命令の MCR と MRC を使用して、ARM プロセッサ上のコプロセッサ 14 としてターゲットからアクセスします。以下の図は、ターゲットとホストデバッグツールの間でデータを制御および転送する 3 つの DCC レジスタを示します。

読み出しレジスタ

ターゲットがホストデバッグツールからデータを読み出すために使用します。

書き込みレジスタ

ターゲットがホストデバッグツールにデータを書き出すために使用します。

制御レジスタ

ターゲットとホストデバッグツールにハンドシェーク情報を提供します。

ARMv6 よりも以前のプロセッサの場合

ビット 1(W ビット) ターゲットがデータを送信できるときにクリアし

ます。

ビット 0(R ビット) ターゲットが読み出すデータがある場合に設定し

ます。

ARMv6 以降のプロセッサの場合

ビット 29(W ビット) ターゲットがデータを送信できるときにクリア

します。

ビット 30(R ビット) ターゲットが読み出すデータがある場合に設定し

ます。

図 7-1 ターゲットとホストデバッグツールの間の DCC 通信

7.2.1 関連項目

その他の情報

• 該当するプロセッサのテクニカルリファレンスマニュアル

Scan chain 2

Write register

Read register

Control register JTAGRealView

ICE

DCC Host debug tools

Target code

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 7-3ID 011811 Non-Confidential

Page 154: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

デバッグ通信チャネル

7.3 割り込み駆動型デバッグ通信

以下の例は、簡単な DCC ルーチンを示すコードの一部です。デバッグツールから送

信されるテキストは、大文字と小文字を入れ替えてターゲットからエコーバックされます。この例から実行可能イメージをビルドし、JTAG ポートを使用してターゲッ

ト上で実行します。DCC を介してターゲットと通信する方法の詳細については、デ

バッガのマニュアルを参照して下さい。

例 7-1 ターゲットとホストデバッグツールの間の DCC 通信

;; Copyright ARM Ltd 2008. All rights reserved.

AREA DCC, CODE, READONLYENTRY

; グ ローバル変数 (アセン ブ リ時の代入用)

GBLS SCReg ; デバ ッ グ ス テー タ スおよび制御レジス タ名 GBLS DReg ; デー タ レジス タ名 (読み出し と書き込みで同じ) GBLS TestFull ; デー タ レジス タ の読み出し準備が整っ たかど う かを テ ス トするための R ビ ッ ト マ ス ク GBLS TestEmpty ; デー タ レジス タ の書き込み準備が整っ たかど う かを テ ス トするための W ビ ッ ト マ ス ク

; アセン ブルの対象のアーキテ ク チ ャ グループ を選択する

IF :DEF:pre_v6 ; v6 よ り前のプ ロセ ッ サ用にアセン ブル INFO 0, "Assembling for pre_v6..."SCReg SETS "c0,c0"DReg SETS "c1,c0"TestFull SETS "#1"TestEmpty SETS "#2" ELIF :DEF:v6_onward ; v6 と それ以降のプ ロセ ッ サ用にアセン ブル INFO 0, "Assembling for v6_onward..."SCReg SETS "c0,c1"DReg SETS "c0,c5"TestFull SETS "#0x40000000"TestEmpty SETS "#0x20000000" ELSE INFO 1, "No target architecture specified.See the readme for moredetails." ENDIF

IF :DEF:pre_v6 || :DEF:v6_onward

; コ ー ド

pollinMRC p14,0,r3,$SCReg,0 ; デバ ッ グ ス テー タ スおよび制御レジス タ を読み出すTST r3, $TestFullBEQ pollin ; R ビ ッ ト が ク リ アの場合はループ

readMRC p14,0,r0,$DReg,0 ; ワー ド を r0 に読み込む

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 7-4ID 011811 Non-Confidential

Page 155: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

デバッグ通信チャネル

char_masksMOV r4, #0x20 ; ビ ッ ト 6 を反転させて文字の大文字と小文字を入れ替えるための EOR マ ス

クMOV r5, #0xC0 ; 各文字の上位 2 ビ ッ ト以外の ビ ッ ト をすべて ク リ アするための AND マ ス ク

changeCaseTST r0, r5 ; 文字値が 0x3F よ り大きいど う かを チ ェ ッ ク

EORNE r0, r0, r4 ; 文字値が 0x3F よ り大きい場合、 文字のビ ッ ト 6 を反転させて

; 大文字と小文字を入れ替える

MOV r5, r5, LSL #0x8 ; 文字マス ク を左に 1 文字分シ フ トする

MOVS r4, r4, LSL #0x8 ; 大文字 /小文字イ ンバー タパ タ ーン を左に 1 文字分シ フ トする

BNE changeCase ; イ ンバー タパ タ ーンがゼロ以外の場合は複数の文字があるため、

; 分岐し て次の処理を実行するpollout

MRC p14,0,r3,$SCReg,0 ; デバ ッ グ ス テー タ スおよび制御レジス タ を読み出すTST r3, $TestEmptyBNE pollout ; W が設定されている場合、 レジス タは満杯状態

writeMCR p14,0,r0,$DReg,0 ; ワー ド を r0 か ら書き出す

B pollin ; ループ し て さ ら に ワー ド を読み出す

ENDIF

END

この種のポーリング例は、Embedded ICE ロジックからの COMMRX 信号と COMMTX 信号が

割り込みコントローラに接続されている場合、割り込み駆動型の例に変換できます。その後、割り込みハンドラ内で読み出しコードと書き込みコードを使用できます。

他のトピックと同様に、このコード例をビルドする方法の例を示します。

• v6 とそれ以降の出力用にビルドする場合は次のとおりです。

armasm --predefine "v6_onward SETL {TRUE}" -g dcc.sarmlink dcc.o -o dcc.axf --ro-base=0x8000

• v6 より前の出力用にビルドする場合は次のとおりです。

To build for pre-v6 outputarmasm --predefine "pre_v6 SETL {TRUE}" -g dcc.sarmlink dcc.o -o dcc.axf --ro-base=0x8000

7.3.1 関連項目

参照

• 「割り込みハンドラと外部割り込みのレベル」 (ページ 6-14)

『アセンブラリファレンス』:

• 「--debug」 (ページ 2-9)• 「-g」 (ページ 2-17)• 「--predefine "directive"」 (ページ 2-23)

『リンカリファレンス』:

• 「--output=file」 (ページ 2-111)• 「--ro_base=address」 (ページ 2-134)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 7-5ID 011811 Non-Confidential

Page 156: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

デバッグ通信チャネル

7.4 Thumb 状態からのアクセス

ARM アーキテクチャ v6T2 よりも以前のプロセッサでは、Thumb コプロセッサ命令

がないので、プロセッサが Thumb 状態の間はデバッグ通信チャネルを使用できませ

ん。

この問題の解決策としては以下の 3 つの方法が考えられます。

• 各ポーリングルーチンを SVC ハンドラ内に記述することができます。これは、

ARM 状態または Thumb 状態のときに呼び出されます。SVC ハンドラに入ると

プロセッサがすぐに ARM 状態になるため、コプロセッサ命令を使用できるよ

うになります。

• Thumb コードで、ポーリングを実装する ARM サブルーチンへのインターワー

ク呼び出しを発生させることができます。

• ポーリング通信ではなく、割り込み駆動型通信を使用します。割り込みハンドラを ARM 状態で実行することにより、コプロセッサ命令に直接アクセスでき

ます。

7.4.1 関連項目

概念

• 第 5 章 ARM と Thumb のインターワーク

• 第 6 章 プロセッサ例外処理

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 7-6ID 011811 Non-Confidential

Page 157: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

第 8 章 セミホスティング

以下の各トピックでは、セミホスティングメカニズムについて説明します。

• 「セミホスティングとは」 (ページ 8-3)• 「セミホスティングインタフェース」 (ページ 8-5)• 「セミホスティングオペレーションの番号の変更について」 (ページ 8-7)• 「セミホスティングオペレーション」 (ページ 8-8)• 「デバッグエージェントインタラクション SVC」 (ページ 8-9)• 「angel_SWIreason_EnterSVC(0x17)」 (ページ 8-10)• 「angel_SWIreason_ReportException(0x18)」 (ページ 8-11)• 「SYS_CLOSE(0x02)」 (ページ 8-13)• 「SYS_CLOCK(0x10)」 (ページ 8-14)• 「SYS_ELAPSED(0x30)」 (ページ 8-15)• 「SYS_ERRNO(0x13)」 (ページ 8-16)• 「SYS_FLEN(0x0C)」 (ページ 8-17)• 「SYS_GET_CMDLINE(0x15)」 (ページ 8-18)• 「SYS_HEAPINFO(0x16)」 (ページ 8-19)• 「SYS_ISERROR(0x08)」 (ページ 8-20)• 「SYS_ISTTY(0x09)」 (ページ 8-21)• 「SYS_OPEN(0x01)」 (ページ 8-22)• 「SYS_READ(0x06)」 (ページ 8-23)• 「SYS_READC(0x07)」 (ページ 8-24)• 「SYS_REMOVE(0x0E)」 (ページ 8-25)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-1ID 011811 Non-Confidential

Page 158: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

• 「SYS_RENAME(0x0F)」 (ページ 8-26)• 「SYS_SEEK(0x0A)」 (ページ 8-27)• 「SYS_SYSTEM(0x12)」 (ページ 8-28)• 「SYS_TICKFREQ(0x31)」 (ページ 8-29)• 「SYS_TIME(0x11)」 (ページ 8-30)• 「SYS_TMPNAM(0x0D)」 (ページ 8-31)• 「SYS_WRITE(0x05)」 (ページ 8-32)• 「SYS_WRITEC(0x03)」 (ページ 8-33)• 「SYS_WRITE0(0x04)」 (ページ 8-34)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-2ID 011811 Non-Confidential

Page 159: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.1 セミホスティングとは

セミホスティングとは、ARM ターゲット上で実行されているコードで、デバッガを

実行しているホストコンピュータの入出力機能と通信し、これを使用することを可能にするメカニズムです。

これにより、ホストコンピュータのキーボード入力、画面出力、ディスク I/O などを

使用できます。例えば、このメカニズムを使用すると、printf() や scanf() などの C ライブラリ関数で、ターゲットシステム上の画面とキーボードではなく、ホストの画面とキーボードを使用することができます。

開発時に使用するハードウェアには、完成時のシステムに備わる入出力機能がすべて用意されているとは限りません。セミホスティングを使用することで、そうした機能をホストコンピュータの機能により補完することができます。

セミホスティングは、プログラム制御から例外を生成する、定義済みのソフトウェア命令(SVC など)のセットによって実装されます。アプリケーションが適切なセ

ミホスティングコールを実行すると、デバッグエージェントが例外を処理します。デバッグエージェントは、ホストとの間で必要となる通信手段を提供します。

セミホスティングインタフェースは、ARM が提供するすべてのデバッグエージェン

トで共通です。セミホストオペレーションは、以下の図に示すように、開発プラットフォーム上でアプリケーションをデバッグするときに機能します。

図 8-1 セミホスティングの概要

多くの場合、セミホスティングはライブラリ関数内のコードから呼び出されます。アプリケーションからセミホスティングオペレーションを直接呼び出すこともできます。

注 ARMv7 より前の ARM プロセッサでは、SVC 命令(以前は SWI 命令)を使用してセミ

ホスティング呼び出しを行います。ただし、ARMv6-M または ARMv7-M(Cortex-M1 や Cortex-M3 プロセッサなど)用にコンパイルする場合、セミホスティングは BKPT 命令を使用して実装されます。

SVC C Library Code

debugger

Target

Host

printf()

hello

printf(“hello\n”);

Text displayed on host screen

Application Code

SVC handled by debug agent

Communication with debugger running on host

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-3ID 011811 Non-Confidential

Page 160: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.1.1 関連項目

概念 • 「セミホスティングインタフェース」 (ページ 8-5)• 「セミホスティングオペレーションの番号の変更について」 (ページ 8-7)

『ARM C および C++ ライブラリと浮動小数点サポートの使用』:

• 第 2 章 ARM C ライブラリと C++ ライブラリ

参照 • 「セミホスティングオペレーション」 (ページ 8-8)• 「デバッグエージェントインタラクション SVC」 (ページ 8-9)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-4ID 011811 Non-Confidential

Page 161: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.2 セミホスティングインタフェース

ARM と Thumb の SVC 命令には、アプリケーションコードによって使用される SVC 番号がエンコードされるフィールドがあります。この番号はシステム内の SVC ハンド

ラによってデコードすることができます。

注 ARMv6-M または ARMv7-M 用にコンパイルする場合、Thumb SVC 命令ではなく、

Thumb BKPT 命令を使用します。BKPT および SVC には、いずれも 8 ビットのイミディ

エート値を指定します。それ以外の点ではセミホスティングは、サポートされているすべての ARM プロセッサにおいて同様に機能します。

セミホスティングオペレーションの要求には、1 つの SVC 番号だけが使用されます。

そのため、他の SVC 番号はアプリケーションまたはオペレーティングシステムで使

用できます。セミホスティングに使用される SVC 番号は、ターゲットアーキテク

チャまたはプロセッサに応じて以下のように異なります。

SVC 0x123456 すべてのアーキテクチャの ARM 状態時。

SVC 0xAB ARMv6-M および ARMv7-M を除く ARM および Thumb 状態時。この動

作は、ARM またはサードパーティ各社のすべてのデバッグターゲット

で保証されているとは限りません。

BKPT 0xAB ARMv6-M および ARMv7-M の Thumb 状態時のみ。

SVC 番号によって、その SVC 命令がセミホスティング要求であることがデバッグエー

ジェントに通知されます。操作を区別するために、操作のタイプが R0 で渡されます。

他のすべてのパラメータは、R1 が示すブロックで渡されます。

結果は、明示的な戻り値、またはデータブロックを指すポインタとして、R0 に返さ

れます。結果が返されない場合でも、R0 の内容は破壊されます。

R0 で渡される使用可能なセミホスティングオペレーションの値は、以下のように割

り当てられています。

0x00 ~ 0x31 ARM 社によって使用されます。

0x32 ~ 0xFF 将来の用途に備えて ARM 社によって予約されています。

0x100 ~ 0x1FF ユーザアプリケーション用に予約されています。ARM 社によって使用

されません。

ただし、独自の SVC 操作を記述する場合は、セミホスト SVC 番号やこ

れらの操作のタイプを示す番号ではなく、別の SVC 番号を使用するこ

とを推奨します。

0x200 ~ 0xFFFFFFFF

これらの値は未定義です。現在は使用されていませんが、これらの値は使用しないで下さい。

以下のセクションでは、操作の名前の後にある括弧内の値が、R0 に格納する値を示

します(例:SYS_OPEN(0x01))。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-5ID 011811 Non-Confidential

Page 162: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

アセンブリ言語のコードから SVC を呼び出す場合は、semihost.h 内で定義されている

操作の名前を使用することを推奨します。semihost.h は RealView® ARMulator Extension Kit の一部としてインストールされています。これらの操作の名前は EQU ディレクティブを使用して定義できます。以下に例を示します。

SYS_OPEN EQU 0x01SYS_CLOSE EQU 0x02

8.2.1 関連項目

概念 • 「セミホスティングとは」 (ページ 8-3)• 「セミホスティングオペレーションの番号の変更について」 (ページ 8-7)

参照 • 「セミホスティングオペレーション」 (ページ 8-8)• 「デバッグエージェントインタラクション SVC」 (ページ 8-9)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-6ID 011811 Non-Confidential

Page 163: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.3 セミホスティングオペレーションの番号の変更について

セミホスティングオペレーションの番号を変更しないことを強く推奨します。ただし、その必要がある場合は、次の操作を行って下さい。

• 新しい番号を使用する場合は、ライブラリコードを含む、システム内のすべてのコードを変更する必要があります。

• 新しい値を使用するようにデバッガを再設定する必要があります。

8.3.1 関連項目

概念 • 「セミホスティングとは」 (ページ 8-3)• 「セミホスティングインタフェース」 (ページ 8-5)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-7ID 011811 Non-Confidential

Page 164: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.4 セミホスティングオペレーション

ホストコンピュータと ARM ターゲット間でデバッグ I/O 機能を有効にするセミホス

ティングオペレーションを以下に示します。

• 「angel_SWIreason_EnterSVC(0x17)」 (ページ 8-10)• 「angel_SWIreason_ReportException(0x18)」 (ページ 8-11)• 「SYS_CLOSE(0x02)」 (ページ 8-13)• 「SYS_CLOCK(0x10)」 (ページ 8-14)• 「SYS_ELAPSED(0x30)」 (ページ 8-15)• 「SYS_ERRNO(0x13)」 (ページ 8-16)• 「SYS_FLEN(0x0C)」 (ページ 8-17)• 「SYS_GET_CMDLINE(0x15)」 (ページ 8-18)• 「SYS_HEAPINFO(0x16)」 (ページ 8-19)• 「SYS_ISERROR(0x08)」 (ページ 8-20)• 「SYS_ISTTY(0x09)」 (ページ 8-21)• 「SYS_OPEN(0x01)」 (ページ 8-22)• 「SYS_READ(0x06)」 (ページ 8-23)• 「SYS_READC(0x07)」 (ページ 8-24)• 「SYS_REMOVE(0x0E)」 (ページ 8-25)• 「SYS_SEEK(0x0A)」 (ページ 8-27)• 「SYS_SYSTEM(0x12)」 (ページ 8-28)• 「SYS_TICKFREQ(0x31)」 (ページ 8-29)• 「SYS_TIME(0x11)」 (ページ 8-30)• 「SYS_TMPNAM(0x0D)」 (ページ 8-31)• 「SYS_WRITE(0x05)」 (ページ 8-32)• 「SYS_WRITEC(0x03)」 (ページ 8-33)• 「SYS_WRITE0(0x04)」 (ページ 8-34)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-8ID 011811 Non-Confidential

Page 165: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.5 デバッグエージェントインタラクション SVC

C ライブラリのセミホスト関数に加え、デバッグエージェントとのインタラクショ

ンをサポートする以下の SVC があります。

• angel_SWIreason_EnterSVC(0x17)• angel_SWIreason_ReportException(0x18)

8.5.1 関連項目

参照

• 「セミホスティングオペレーション」 (ページ 8-8)

• 「angel_SWIreason_EnterSVC(0x17)」 (ページ 8-10)

• 「angel_SWIreason_ReportException(0x18)」 (ページ 8-11)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-9ID 011811 Non-Confidential

Page 166: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.6 angel_SWIreason_EnterSVC (0x17)

プロセッサをスーパーバイザモードに設定し、新しい CPSR 内の 2 つの割り込みマス

クビットを設定することで、すべての割り込みを無効にします。RealView ICE など

のデバッグハードウェアユニットでは、ユーザスタックポインタ R13_USR がスーパー

バイザモードスタックポインタ R13_SVC にコピーされ、現在の CPSR 内の I ビットと F ビットが設定されることにより、通常割り込みと高速割り込みが無効になります。

注 RealView ARMulator ISS でのデバッグでは、以下の処理が行われます。

• R0 がゼロに設定され、ユーザモードに戻るために使用できる関数がないことを

示します。

• ユーザモードのスタックポインタはスーパーバイザモードのスタックポインタにコピーされません。

8.6.1 エントリ

レジスタ R1 は使用されません。CPSR によってユーザモードまたはスーパーバイザ

モードを指定できます。

8.6.2 戻り値

終了時には、R0 はユーザモードに戻るために呼び出される関数のアドレスを保持し

ます。この関数のプロトタイプは次のとおりです。

void ReturnToUSR(void)

EnterSVC がユーザモードで呼び出される場合、このルーチンは呼び出し元をユーザ

モードに戻し、割り込みフラグを復元します。それ以外の場合、このルーチンの動作は定義されていません。

ユーザモードになると、ユーザスタックポインタがコピーされて、スーパーバイザモードスタックが失われます。ユーザモードのルーチンに戻ることによって、R13_SVC にスーパーバイザモードのスタック値が復元されますが、このスタックをア

プリケーションで使用することはできません。

この SVC が実行された後の現在のリンクレジスタは R14_USR ではなく、R14_SVC です。

呼び出し後に R14_USR の値が必要な場合は、BL 関数呼び出しと同様に、その値を呼び

出す前にスタックにプッシュし、後でポップする必要があります。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-10ID 011811 Non-Confidential

Page 167: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.7 angel_SWIreason_ReportException (0x18)

この SVC をアプリケーションで呼び出すことによって、例外をデバッガに直接通知

できます。一般的には、実行が完了したことを通知するために ADP_Stopped_ApplicationExit が使用されます。

8.7.1 エントリ

エントリ時には、以下の表に示すいずれかの値に R1 が設定されます。これらの値は angel_reasons.h 内で定義されています。

ハードウェア例外が生成されるのは、その例外タイプを取得するためにデバッガ変数 vector_catch が設定されており、デバッグエージェントがその例外タイプを通知で

きる場合です。以下の表に、ハードウェアベクタ要因コードを示します。

例外ハンドラでは、ハンドラチェインの 後にデフォルト動作としてこれらの SVC を使用し、例外が処理されなかったことを通知できます。以下の表に、ソフトウェア要因コードを示します。

表 8-1 ハードウェアベクタ要因コード

名前16 進数

ADP_Stopped_BranchThroughZero 0x20000

ADP_Stopped_UndefinedInstr 0x20001

ADP_Stopped_SoftwareInterrupt 0x20002

ADP_Stopped_PrefetchAbort 0x20003

ADP_Stopped_DataAbort 0x20004

ADP_Stopped_AddressException 0x20005

ADP_Stopped_IRQ 0x20006

ADP_Stopped_FIQ 0x20007

表 8-2 ソフトウェア要因コード

名前16 進数

ADP_Stopped_BreakPoint 0x20020

ADP_Stopped_WatchPoint 0x20021

ADP_Stopped_StepComplete 0x20022

ADP_Stopped_RunTimeErrorUnknown *0x20023

ADP_Stopped_InternalError *0x20024

ADP_Stopped_UserInterruption 0x20025

ADP_Stopped_ApplicationExit 0x20026

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-11ID 011811 Non-Confidential

Page 168: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

この表において、値の横にある * は、その値が ARM デバッガでサポートされていな

いことを示しています。これらの値に対して、デバッガは Unhandled ADP_Stopped exception を通知します。

8.7.2 戻り値

これらの呼び出しから返される値はありません。しかし、デバッガは RDI_Execute 要求またはこれと同等の要求を実行することによって、アプリケーションの継続を要求することができます。この場合は、SVC へのエントリ時と同じ状態のレジスタを

使用するか、その後のデバッガによって修正されたレジスタを使用して、実行が継続されます。

ADP_Stopped_StackOverflow *0x20027

ADP_Stopped_DivisionByZero *0x20028

ADP_Stopped_OSSpecific *0x20029

表 8-2 ソフトウェア要因コード (続き)

名前16 進数

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-12ID 011811 Non-Confidential

Page 169: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.8 SYS_CLOSE (0x02)

ホストシステム上でファイルを閉じます。ハンドルは、SYS_OPEN で開かれたファイル

を参照している必要があります。

8.8.1 エントリ

エントリ時には、R1 は 1 ワード引数ブロックを指すポインタを保持します。

ワード 1 開かれたファイルのハンドラを保持します。

8.8.2 戻り値

終了時には、R0 は以下の情報を保持します。

• 呼び出しに成功した場合は 0• 呼び出しに失敗した場合は –1

8.8.3 関連項目

リファレンス • 「SYS_OPEN(0x01)」 (ページ 8-22)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-13ID 011811 Non-Confidential

Page 170: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.9 SYS_CLOCK (0x10)

実行開始から経過した時間(単位:1/100 秒)を返します。

通信にかかるオーバーヘッドや他のエージェント固有の要因により、この SVC によって返される値をベンチマークの目的で使用する場合には、何らかの制約が課せられる場合があります。例えば、RealView ICE などのデバッグハードウェアユニッ

トを使用する場合、その要求はホストに戻されてから実行されます。このため、送信やプロセススケジューリングに予測不能な遅延が生じることがあります。

この関数を使用して時間間隔を計算するには、時間を計測するコードシーケンスがある場合とない場合の時間間隔の差を計算します。

8.9.1 エントリ

レジスタ R1 はゼロを保持している必要があります。その他のパラメータは使用でき

ません。

8.9.2 戻り値

終了時には、R0 は以下の情報を保持します。

• 呼び出しに成功した場合は、任意の開始時からの時間(単位:1/100 秒)

• 通信エラーなどにより呼び出しに失敗した場合は –1

8.9.3 関連項目

概念

• 「SYS_ELAPSED(0x30)」 (ページ 8-15)

• 「SYS_TICKFREQ(0x31)」 (ページ 8-29)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-14ID 011811 Non-Confidential

Page 171: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.10 SYS_ELAPSED (0x30)

実行開始からのターゲットの Tick 単位の経過時間を返します。SYS_TICKFREQ を使用し

て、Tick の周波数を決定します。

8.10.1 エントリ

エントリ時には、R1 は Tick 単位の経過時間を返すために使用される 2 ワードデータ

ブロックを指します。

ワード 1 下位ワードであり、下位アドレスに配置されます。

ワード 2 上位ワードであり、上位アドレスに配置されます。

8.10.2 戻り値

終了時には、以下のようになります。

• 成功時には、R1 は Tick 単位の経過時間を保持するダブルワードを指します。失

敗時には、R1 は -1 を保持します。

• 成功時には、R0 は 0 を保持します。失敗時には、R0 は -1 を保持します。

注 一部のデバッガは、RealView ICE を使用して接続されている場合にこの SVC をサ

ポートせず、R0 に常に -1 を返します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-15ID 011811 Non-Confidential

Page 172: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.11 SYS_ERRNO (0x13)

ホストのセミホスティング SVC の実装に関連する C ライブラリの errno 変数の値を

返します。errno 変数は、以下に示す C ライブラリのセミホスト関数の値によって設

定されます。

• SYS_REMOVE

• SYS_OPEN

• SYS_CLOSE

• SYS_READ

• SYS_WRITE

• SYS_SEEK

errno が設定されるかどうかと、設定される値については、ISO C 標準で動作が定義

されている場合を除いて完全にホストに依存します。

8.11.1 エントリ

パラメータはありません。レジスタ R1 はゼロである必要があります。

8.11.2 戻り値

終了時には、R0 は C ライブラリの errno 変数の値を保持します。

8.11.3 関連項目

参照 • 「SYS_CLOSE(0x02)」 (ページ 8-13)• 「SYS_OPEN(0x01)」 (ページ 8-22)• 「SYS_READ(0x06)」 (ページ 8-23)• 「SYS_REMOVE(0x0E)」 (ページ 8-25)• 「SYS_SEEK(0x0A)」 (ページ 8-27)• 「SYS_WRITE(0x05)」 (ページ 8-32)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-16ID 011811 Non-Confidential

Page 173: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.12 SYS_FLEN (0x0C)

指定されたファイルの長さを返します。

8.12.1 エントリ

エントリ時には、R1 は 1 ワード引数ブロックを指すポインタを保持します。

ワード 1 既に開かれている、シーク可能なファイルオブジェクトのハンドルで

す。

8.12.2 戻り値

終了時には、R0 は以下の情報を保持します。

• 呼び出しに成功した場合は、ファイルオブジェクトの現在の長さ

• エラー発生時は –1

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-17ID 011811 Non-Confidential

Page 174: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.13 SYS_GET_CMDLINE (0x15)

実行可能ファイルの呼び出しに使用されたコマンドライン(argc および argv)を返し

ます。

8.13.1 エントリ

エントリ時には、R1 はコマンド文字列とその長さを返すために使用される 2 ワード

データブロックを指します。

ワード 1 ワード 2 で指定されるサイズ以上のバッファを指すポインタです。

ワード 2 バッファのバイト単位の長さです。

8.13.2 戻り値

終了時には、以下のようになります。

• レジスタ R1 は 2 ワードデータブロックを指します。

ワード 1 コマンドラインの NULL で終わる文字列を指すポインタです。

ワード 2 文字列の長さです。

デバッグエージェントによっては、転送可能な文字列の 大長が制限される場合があります。ただし、エージェントは 80 バイト以上のコマンドラインを転送

できる必要があります。

• レジスタ R0 はエラーコードを保持します。

— 呼び出しに成功した場合は 0

— 通信エラーなどにより呼び出しに失敗した場合は –1

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-18ID 011811 Non-Confidential

Page 175: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.14 SYS_HEAPINFO (0x16)

システムのスタックとヒープのパラメータを返します。通常は、初期化時に C ライ

ブラリに使用された値が返されます。RealView ARMulator ISS の場合は、

peripherals.ami 内で指定されている値が返されます。RealView ICE などのデバッグ

ハードウェアユニットの場合は、イメージの位置とメモリ 上部の値が返されます。

これらの値は C ライブラリによってオーバーライドできます。

ホストデバッガは、top_of_memory デバッガ変数を使用して実際の戻り値を決定しま

す。

8.14.1 エントリ

エントリ時には、R1 は 4 ワードデータブロックを指すポインタのアドレスを保持しま

す。データブロックの内容は、この関数によって充填されます。データブロックの構造と戻り値を以下の例に示します。

例 8-1

struct block { int heap_base; int heap_limit; int stack_base; int stack_limit;};struct block *mem_block, info;mem_block = &info;AngelSWI(SYS_HEAPINFO, (unsigned) &mem_block);

注 データブロックのワード 1 にゼロが保持されている場合、C ライブラリはそのゼロを Image$$ZI$$Limit に置き換えます。この値は、メモリマップ内のデータ領域の先頭に

対応しています。

8.14.2 戻り値

終了時には、R1 は構造体を指すポインタのアドレスを保持します。

構造体のいずれかの値が 0 である場合は、システムが実際の値を計算できなかった

ことを示します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-19ID 011811 Non-Confidential

Page 176: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.15 SYS_ISERROR (0x08)

別のセミホスティング呼び出しからの復帰コードがエラーステータスかどうかを判断します。この呼び出しには、チェックするエラーコードを保持するパラメータブロックが渡されます。

8.15.1 エントリ

エントリ時には、R1 は 1 ワードデータブロックを指すポインタを保持します。

ワード 1 チェックする必要があるステータスワードです。

8.15.2 戻り値

終了時には、R0 は以下の情報を保持します。

• ステータスワードがエラーを示していない場合は 0• ステータスワードがエラーを示している場合はゼロ以外の値

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-20ID 011811 Non-Confidential

Page 177: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.16 SYS_ISTTY (0x09)

ファイルが入出力デバイスに接続されているかどうかをチェックします。

8.16.1 エントリ

エントリ時には、R1 は 1 ワード引数ブロックを指すポインタを保持します。

ワード 1 前に開かれたファイルオブジェクトのハンドルです。

8.16.2 戻り値

終了時には、R0 は以下の情報を保持します。

• ハンドルによって入出力デバイスが識別された場合は 1• ハンドルによってファイルが識別された場合は 0• エラーが発生した場合は 1 と 0 以外の値

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-21ID 011811 Non-Confidential

Page 178: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.17 SYS_OPEN (0x01)

ホストシステム上でファイルを開きます。ファイルパスは、ホストプロセスの現在のディレクトリへの相対パス、またはホストオペレーティングシステムのパス規則を使用した絶対パスとして指定されます。

ARM ターゲットは、特殊なパス名 :tt を、コンソール入力ストリーム(開く - 読み

出す)またはコンソール出力ストリーム(開く - 書き込む)として解釈します。これ

らのストリームを開く動作は、C 言語の stdio ストリームを参照するアプリケーショ

ンの標準的な起動コードの中で実行されます。

8.17.1 エントリ

エントリ時には、R1 は 3 ワード引数ブロックを指すポインタを保持します。

ワード 1 ファイル名またはデバイス名を保持する NULL で終わる文字列を指すポ

インタです。

ワード 2 「ファイルを開く」モードを指定する整数です。以下の表は、整数の有

効な値と、対応する ISO C の fopen() モードを示しています。

ワード 3 ワード 1 が指す文字列の長さを示す整数です。

文字列は NULL で終わる必要がありますが、この長さには終端の NULL 文字が含まれません。

8.17.2 戻り値

終了時には、R0 は以下の情報を保持します。

• 呼び出しに成功した場合はゼロ以外のハンドル

• 呼び出しに失敗した場合は –1

表 8-3 モードの値

モード 0 1 2 3 4 5 6 7 8 9 10 11

ISO C fopen モードa

a. ANSI 以外のオプションはサポートされていません。

r rb r+ r+b w wb w+ w+b a ab a+ a+b

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-22ID 011811 Non-Confidential

Page 179: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.18 SYS_READ (0x06)

ファイルの内容をバッファに読み出します。ファイル位置は以下のいずれかの方法で指定されます。

• SYS_SEEK によって明示的に指定される。

• 前の SYS_READ または SYS_WRITE 要求の次の 1 バイトとして暗黙的に指定される。

ファイルの位置は、ファイルが開かれた時点でファイルの先頭となり、ファイルを閉じると失われます。ファイル操作は、できる限り 1 回の動作で実行して下さい。

例えば、16KB を 4KB のチャンクに 4 分割して書き込むことは、やむを得ない場合以

外は行わないで下さい。

8.18.1 エントリ

エントリ時には、R1 は 4 ワードデータブロックを指すポインタを保持します。

ワード 1 SYS_OPEN で前に開かれたファイルのハンドルを保持します。

ワード 2 バッファを指します。

ワード 3 ファイルからバッファに読み出されるバイト数を保持します。

8.18.2 戻り値

終了時には、以下のようになります。

• 呼び出しに成功した場合、R0 はゼロを保持します。

• R0 がワード 3 と同じ値を保持している場合、その呼び出しは失敗していて、

EOF と見なされます。

• R0 がワード 3 より小さい値を保持している場合は、呼び出しが部分的に成功し

たことを示します。エラーとは見なされませんが、バッファは充填されていません。

ハンドルが入出力デバイスのハンドルである場合、SYS_ISTTY は –1 を返します。

SYS_READ からゼロ以外の値が返されると、行読み出しによりバッファが充填されな

かったことを示します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-23ID 011811 Non-Confidential

Page 180: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.19 SYS_READC (0x07)

コンソールから 1 バイトを読み出します。

8.19.1 エントリ

レジスタ R1 はゼロを保持している必要があります。他のパラメータまたは値は使用

できません。

8.19.2 戻り値

終了時には、R0 はコンソールから読み出されたバイトを保持します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-24ID 011811 Non-Confidential

Page 181: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.20 SYS_REMOVE (0x0E)

注意 ホストファイルシステム上で指定されたファイルを削除します。

8.20.1 エントリ

エントリ時には、R1 は 2 ワード引数ブロックを指すポインタを保持します。

ワード 1 削除するファイルのパス名を示す、NULL で終わる文字列を指します。

ワード 2 文字列の長さです。

8.20.2 戻り値

終了時には、R0 は以下の情報を保持します。

• 削除に成功した場合は 0• 削除に失敗した場合はゼロ以外の、ホスト固有のエラーコード

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-25ID 011811 Non-Confidential

Page 182: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.21 SYS_RENAME (0x0F)

指定されたファイルの名前を変更します。

8.21.1 エントリ

エントリ時には、R1 は 4 ワードデータブロックを指すポインタを保持します。

ワード 1 旧ファイル名を指すポインタです。

ワード 2 旧ファイル名の長さです。

ワード 3 新しいファイル名を指すポインタです。

ワード 4 新しいファイル名の長さです。

いずれの文字列も NULL で終わります。

8.21.2 戻り値

終了時には、R0 は以下の情報を保持します。

• 名前の変更に成功した場合は 0• 名前の変更に失敗した場合はゼロ以外の、ホスト固有のエラーコード

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-26ID 011811 Non-Confidential

Page 183: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.22 SYS_SEEK (0x0A)

ファイルの先頭を基準に指定されたオフセットを使用して、ファイル内の指定された位置にシークします。ファイルはバイトの配列と見なされ、オフセットはバイト単位で渡されます。

8.22.1 エントリ

エントリ時には、R1 は 2 ワードデータブロックを指すポインタを保持します。

ワード 1 シーク可能なファイルオブジェクトのハンドルです。

ワード 2 検索する絶対バイト位置を示します。

8.22.2 戻り値

終了時には、R0 は以下の情報を保持します。

• 要求に成功した場合は 0

• 要求に失敗した場合は負の値。SYS_ERRNO を使用して、エラーを表すホストの errno 変数の値を読み出すことができます。

注 現在のファイルオブジェクトの範囲外にシークした場合の影響は定義されていませ

ん。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-27ID 011811 Non-Confidential

Page 184: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.23 SYS_SYSTEM (0x12)

ホストのコマンドラインインタープリタにコマンドを渡します。この SVC を使用し

て、dir、ls、pwd などのシステムコマンドを実行できます。端末 I/O はホスト上で実

行され、ターゲットには表示されません。

注意 ホストに渡されるコマンドはホスト上で実行されます。意図しない影響が生じるよ

うなコマンドが渡されないように注意する必要があります。

8.23.1 エントリ

エントリ時には、R1 は 2 ワード引数ブロックを指すポインタを保持します。

ワード 1 ホストのコマンドラインインタープリタに渡される文字列を指します。

ワード 2 文字列の長さです。

8.23.2 戻り値

終了時には、R0 は復帰ステータスを保持します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-28ID 011811 Non-Confidential

Page 185: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.24 SYS_TICKFREQ (0x31)

Tick の周波数を返します。

8.24.1 エントリ

このルーチンのエントリ時には、レジスタ R1 は 0 を保持している必要があります。

8.24.2 戻り値

終了時には、R0 は以下のいずれかを保持します。

• 1 秒間当たりの Tick 数

• ターゲットが 1 Tick の値を認識していない場合は –1。一部のデバッガは、

RealView ICE を使用して接続されている場合にこの SVC をサポートせず、R0 に常に -1 を返します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-29ID 011811 Non-Confidential

Page 186: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.25 SYS_TIME (0x11)

1970 年 1 月 1 日 00:00 からの秒数を返します。RealView ICE などのすべてのデバッグ

エージェントコンフィギュレーションにおいて、この値は実際の時間を示します。

8.25.1 エントリ

パラメータはありません。

8.25.2 戻り値

終了時には、R0 は秒数を保持します。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-30ID 011811 Non-Confidential

Page 187: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.26 SYS_TMPNAM (0x0D)

システムファイルの識別子によって識別されるファイルの一時的な名前を返します。

8.26.1 エントリ

エントリ時には、R1 は 3 ワード引数ブロックを指すポインタを保持します。

ワード 1 バッファを指すポインタです。

ワード 2 このファイル名のターゲット識別子です。この値は、0 ~ 255 の範囲内

の整数である必要があります。

ワード 3 バッファの長さを保持します。この値は、ホストシステム上の L_tmpnam の値以上である必要があります。

8.26.2 戻り値

終了時には、R0 は以下の情報を保持します。

• 呼び出しに成功した場合は 0• エラー発生時は –1

R1 が指すバッファは、適切なディレクトリ名が前に付いたファイル名を保持します。

同じターゲット識別子を再度使用すると、同じファイル名が返されます。

注 返される文字列は NULL で終わる必要があります。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-31ID 011811 Non-Confidential

Page 188: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.27 SYS_WRITE (0x05)

バッファの内容を、指定されたファイルの現在のファイル位置に書き込みます。ファイル位置は以下のいずれかの方法で指定されます。

• SYS_SEEK によって明示的に指定される。

• 前の SYS_READ または SYS_WRITE 要求の次の 1 バイトとして暗黙的に指定される。

ファイルの位置は、ファイルが開かれた時点でファイルの先頭となり、ファイルを閉じると失われます。

ファイル操作は、できる限り 1 回の動作で実行して下さい。例えば、16KB を 4KB のチャンクに 4 分割して書き込むことは、やむを得ない場合以外は行わないで下さい。

8.27.1 エントリ

エントリ時には、R1 は 3 ワードデータブロックを指すポインタを保持します。

ワード 1 SYS_OPEN で前に開かれたファイルのハンドルを保持します。

ワード 2 書き込まれるデータを保持するメモリを指します。

ワード 3 バッファからファイルに書き込まれるバイト数を保持します。

8.27.2 戻り値

終了時には、R0 は以下の情報を保持します。

• 呼び出しに成功した場合は 0• エラーが発生した場合は、書き込まれなかったバイト数

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-32ID 011811 Non-Confidential

Page 189: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.28 SYS_WRITEC (0x03)

R1 が指す文字バイトをデバッグチャネルに書き込みます。ARM デバッガの下で実行

される場合、この文字はホストデバッガコンソールに表示されます。

8.28.1 エントリ

エントリ時には、R1 は文字を指すポインタを保持します。

8.28.2 戻り値

なし。レジスタ R0 の内容は破壊されます。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-33ID 011811 Non-Confidential

Page 190: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

セミホスティング

8.29 SYS_WRITE0 (0x04)

NULL で終わる文字列をデバッグチャンネルに書き込みます。ARM デバッガの下で

実行される場合、これらの文字はホストデバッガコンソールに表示されます。

8.29.1 エントリ

エントリ時には、R1 は文字列の先頭のバイトを指すポインタを保持します。

8.29.2 戻り値

なし。レジスタ R0 の内容は破壊されます。

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. 8-34ID 011811 Non-Confidential

Page 191: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

付録 A ARM プロセッサをターゲットとしたソフトウェア開

発』に対する改訂

『ARM プロセッサをターゲットとしたソフトウェア開発』に対して、以下の技術的変更

が加えられました。

表 A-1 発行 A と 発行 B の相違点

変更点 関連するトピック

ARMv6-M および ARMv7-M アーキテクチャに基づ

くデバイスのメモリマップの全体的なレイアウトは固定されているというメモを追加しました。

「ターゲットハードウェアに合わせたイメージのメモリマップのカスタマイズ」 (ページ 3-11)

「ビットバンドオブジェクトへのリンクを含むスキャッタロードファイル」、「ARMARMv7-M」、およ

び「ARMARMv6-M」へのリンクを追加しました。

「ターゲットハードウェアに合わせたイメージのメモリマップのカスタマイズ」 (ページ 3-11)

「ビットバンドオブジェクトへのリンクを含むスキャッタロードファイル」へのリンクを追加しました。

「スキャッタロード記述ファイル」 (ページ 3-12)

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. A-1ID 011811 Non-Confidential

Page 192: ARM コンパイラツールチェーン ARM プロセッサ …infocenter.arm.com/help/topic/com.arm.doc.dui0471bj/DUI...2010 年 5 月 A 非機密扱い ARM コンパイラツールチェーン

『ARM プロセッサをターゲットとしたソフトウェア開発』に対する改訂

「ビットバンドオブジェクトへのリンクを含むスキャッタロードファイル」という新しいトピックを追加しました。

「ビットバンドオブジェクトへのリンクを含むスキャッタロードファイル」 (ページ 3-17)

SYS_ELAPSED について、R0 は成功時に 0 を保持し、失

敗時に -1 を保持することを明確にしました。

「SYS_ELAPSED(0x30)」 (ページ 8-15)

スキャッタロードファイルでスタックとヒープの配置をカスタマイズする場合、リンカが __user_initial_stackheap() 関数ではなくライブラリ

セットアップコードのバージョンを使用するという点を明確にしました。

「リセットと初期化」 (ページ 3-19)

表 A-1 発行 A と 発行 B の相違点 (続き)

変更点 関連するトピック

ARM DUI 0471BJ Copyright © 2010 ARM. All rights reserved. A-2ID 011811 Non-Confidential