制御レジスタと識別レジスタ
L1キャッシュ制御レジスタ(CACR)
CACRは、L1のECCおよびL1キャッシュ一貫性用法モデルをコントロールします。
L1キャッシュ識別レジスタ
識別レジスタの一覧を下表に示します。
アドレス | レジスタ名 | 機能 |
---|---|---|
0xE000ED14 | 設定とコントロールレジスタ(CCR) | 構造と制御データのセットまたはリターンを行い、キャッシュとブランチ予測の管理を行います。 |
0xE000ED78 | キャッシュレベルIDレジスタ(CLIDR) | 実装されるキャッシュ・レベルを示します。アーキテクチャ的に、命令とデータのキャッシュ・レベル数が異なることがあります。 |
0xE000ED7C | キャッシュタイプレジスタ(CTR) | キャッシュの構造に関する情報を提供します。 |
0xE000ED80 | キャッシュサイズIDレジスタ(CCSIDR) | 選択された命令/データ・キャッシュのサイズと動作に関する情報を提供します。アーキテクチャ的に、最高8レベルのキャッシュが可能です。命令/データまたは統一キャッシュを含みます。L1命令/データ・キャッシュだけを含みます。 |
0xE000ED84 | キャッシュサイズ選択レジスタ(CSSELR) | CSSELRは、以下を指定することによって現在のCCSIDRを選びます。
|
ユニフィケーションと一貫性のポイント
前書き
Cortex-Aで採用されているユニフィケーションのポイント(Point of unification:PoU)と一貫性のポイント(Point of coherency:PoC)の考え方がCortex-M7でも採用されています。ただし、Cortex-M7には、L2以降のキャッシュは内蔵されていませんので、マイコンベンダーがL2以降のキャッシュを搭載していない場合は、L1キャッシュとシステムメモリ(内蔵のFlashやSRAM等)の関係が対象となります。
ユニフィケーションのポイント(Point of unification:PoU)
プロセッサのためのユニフィケーションのポイント(Point of unification:PoU)は、命令とデータ・キャッシュがメモリの場所の同じコピーを見ことを保証するものです。Cortex-AではL2統合キャッシュ(命令とデータを両方含むキャッシュ)が前提ですが、Cortex-M7ではL2統合キャッシュは搭載されていないため、命令とデータを両方含むシステムメモリ、すなわち内蔵Flashや内蔵RAMが対象になります。PoUは、命令とデータ・キャッシュが結合した単一プロセッサ・メモリ・システムです。
一貫性のポイント(Point of coherency:PoC)
特定のMVA(修正された仮想アドレス:Modified Virtual Address)のため、一貫性のポイント(Point of coherency:PoC)は、メモリにアクセスすることが可能なすべてのエージェントが、メモリの場所の同じコピーを見ることを保証するものです。Cortex-M7では、これも対象は、メインシステム・メモリです。ここで、エージェントとは、ユーザーや他のソフトウェアの代理・仲介を果たすソフトウェア。またはユーザーの代わりに動くソフトウェアを指します。
メンテナンス操作
キャッシュメンテナンス操作レジスタ
すべてのキャッシュメンテナンス操作は、下表のレジスタを使って行います。 これらは、内部のPPBメモリスペースのメモリマップの作成システム制御スペース(SCS)空間にあります。キャッシュメンテナンス操作は、特権モードでしかロード/ストアできません、非特権モードで行うとBusFaultが発生します。
アドレス | レジスタ名 | 機能 |
---|---|---|
0xE000EF50 | ICIALLU | 命令キャッシュをすべて無効にする |
0xE000EF58 | ICIMVAU | PoUへのアドレスによる命令キャッシュの無効化 |
0xE000EF5C | DCIMVAC | PoCへのアドレスによるデータキャッシュの無効化 |
0xE000EF60 | DCISW | データキャッシュのセット、ウェイを指定して無効化 |
0xE000EF64 | DCCMVAU | PoUへのアドレスによるデータキャッシュクリーン化 |
0xE000EF68 | DCCMVAC | PoCへのアドレスによるデータキャッシュクリーン化 |
0xE000EF6C | DCCSW | データキャッシュのセット、ウェイを指定してクリーン化 |
0xE000EF70 | DCCIMVAC | PoCへのアドレスによるデータキャッシュクリーン化と無効化 |
0xE000EF74 | DCCISW | データキャッシュのセット、ウェイを指定してクリーン化と無効化 |
キャッシュメンテナンス命令
(1)DSB(データ同期バリア/Data synchronization barrier)命令
DSBは特別なデータ同期メモリバリアとして作動します。この命令以前のすべてのメモリアクセスが完了するまで、以後の命令を実行しないようにプロセッサを待機状態にします。したがって、これより以前のすべてキャッシュメンテナンス操作の完了が保証されます。
(2)ISB(命令同期バリア/Instruction synchronization barrier)命令
ISBは命令同期バリアとして作動します。これによりプロセッサのパイプラインは破棄されます。従ってISBの後の命令は、ISBが完了した後に再びキャッシュまたはメモリから取り出されます。これにより、その後の「命令フェッチ」のために命令キャッシュメンテナンス操作が見えることが保証されます。(ライトバッファとバリア命令(Cortex-A編 第11回参照))
あわせて読みたい
初期化と有効化
キャッシュの初期化と有効化
パワーオンリセット時に、ソフトウェアにおいて、命令キャッシュとデータキャッシュを有効化する前に、それらを一旦完全に無効にしなければなりません。キャッシュライン有効ビットはタグ(キャッシュRAM内)に保持されます。これに失敗すると予想できない現象が引き起こされます。また、ソフトウエアリセットの場合、リセットの際のキャッシュの中身が信頼できるものであるならば、無効化は必要ありません。
データキャッシュ全体の無効化
ソフトウェアは、データキャッシュ全体を無効にするために、以下のサンプルコードを使うことができます。操作は、キャッシュの個々のライン上で繰返し行われます。ラインの無効化は、Private Peripheral Bus(PPB)メモリ領域でのDCISWレジスターを使用することによって行います。キャッシュのウェイとセットの数は、CCSIDRレジスターを読むことによって決まります。
CCSIDR EQU 0xE000ED80 CSSELR EQU 0xE000ED84 DCISW EQU 0xE000EF60 MOV r0, #0x0 LDR r11, =CSSELR STR r0, [r11] ; Select Data Cache size DSB LDR r11, =CCSIDR LDR r2, [r11] ; Cache size identification AND r1, r2, #0x7 ; Number of words in a cache line ADD r7, r1, #0x4 MOV r1, #0x3ff ANDS r4, r1, r2, LSR #3 MOV r1, #0x7fff ANDS r2, r1, r2, LSR #13 CLZ r6, r4 LDR r11, =DCISW inv_loop1 MOV r1, r4 inv_loop2 LSL r3, r1, r6 LSL r8, r2, r7 ORRr 3, r3, r8 STR r3, [r11] ; Invalidate D-cache line SUBS r1, r1, #0x1 BGE inv_loop2 SUBS r2, r2, #0x1 BGE inv_loop1 DSB ISB
命令キャッシュの無効化
命令キャッシュを無効にするのは、以下のサンプルコードで行うことができます。操作は、PPBメモリ領域のICIALLUレジスターに書きこむことによって行われます。
ICIALLU EQU 0xE000EF50 MOV r0, #0x0 LDR r11, =ICIALLU STR r0, [r11] DSB ISB
データキャッシュと命令キャッシュの有効化
データキャッシュと命令キャッシュは、初期化の後、以下のサンプルコードを使って有効化できます。操作は、PPBメモリ領域のCCR.ICとCCR.DCフィールドを修正することによって実行されます。
CCR EQU 0xE000ED14 LDR r11, =CCR LDR r0, [r11] ORR r0, r0, #0x1:SHL:16 ; Set CCR.DC field ORR r0, r0, #0x1:SHL:17 ; Set CCR.IC field STR r0, [r11] DSB ISB
メモリタイプと属性
Armプロセッサでは、メモリタイプとして3種類を定義しており、用途によって設定しなければなりません。メモリタイプの設定は、MPUで定義します。(ちなみに、Cortex-M7とCortex-RはMPUで行い、Cortex-Aの場合はMMUで行います)
Cortexのメモリタイプについては、Cortex-A編でも説明していますので、「メモリタイプとアクセスオーダ(Cortex-A編 第10回参照)」の章を参照してください。
あわせて読みたい
Normal
プロセッサは効率化のために、処理の並び替えが可能です。また、投機的読み出しを実行できます。
DeviceとStrongly-ordered
メモリ領域をDeviceまたはStrongly-orderedメモリに定義すると、プロセッサーは、これらのメモリに関連する他の処理の順番を守ります。DeviceとStrongly-orderedメモリへの異なる順番の要求は、外部メモリ・システムが、Deviceメモリへの書き込みをバッファできるということになります。しかし、Strongly-orderedメモリへの書き込みをバッファリングすることはできません。
共有可能(Shareable)
メモリシステムは、システムの複数のバス・マスターの間のデータ同期を提供します。例えば、DMAコントローラ付きのプロセッサが該当します。Strongly-orderedメモリは常に共有可能です。もし、複数のバス・マスターが共有可能ではないメモリ領域にアクセス可能ならば、ユーザーはソフトウェアでバス・マスターの間のデータ一貫性を保証しなければなりません。
エグゼキューションネバー(Execute Never:XN)
これはプロセッサが命令アクセスを防止するという意味です。XN領域から命令実行を行うと、例外フォールトが発生します。
こちらも是非
“もっと見る” Cortex-M7編
電力管理、コアデバッグ、浮動小数点ユニット
Cortex-M7もCortex-M3/M4と同じように低消費電力モードをサポートしています。基本はCortex-M3/M4と同じです。Cortex-M7にはWIC(ウェイクアップ割り込みコントローラ)を含むと3種類のスリープを持っていることになります。
AXI転送
AXI転送を行う際には、次に示す制限があります。バーストは、最大32バイト。バースト長さは、最大4転送。Strongly-orderedメモリまたはDeviceメモリの書き込みバーストの最大長は2転送です。Strongly-orderedメモリまたはDeviceメモリの読み出しは、常に1転送です。
キャッシュと属性
データ・キャッシュにヒットする書き込みアクセスは、キャッシュRAMにデータを書き込みます。もし、メモリ領域が、Write-Throughにマークされているのであれば、書き込み動作はAXIMインターフェース上でも実行されて、外部メモリにも同じデータがストアされ、外部メモリとキャッシュの一貫性が保たれます。