stm32 Advent Calendar 2017 16日目の記事です。
100MHz越えのマイコン使ってるけど思ったより計算速度が出ない・・・・っていう問題があって色々調べたらフラッシュの速度が原因だった。
そこでSTのARTアクセラレータの機能を使って信号処理の高速化をやってみたって話です。
あくまでSTがすごいだけで僕はその機能を使ったってだけなので悪しからずw
ART Accelerator(Adaptive real-time memory accelerator)
ART Acceleratorは図の赤の部分についてるTCMバス経由でのフラッシュの読み出しウェイトを事実上0にするキャッシュ群みたいなもの。
実際flashの速度って80MHz程度が限界なので高速動作する場合はRAMにコードを置いたりする。(LPCなんかがそう
そこで下の図のようにflashから大量に先読みしてバッファするっていう脳筋ハードウエアペリフェラル
俗にいうインストラクションプリフェッチとか言われている奴をメモリで殴った感じ
インストラクションプリフェッチにもいろいろ問題があって例えばに実行時にキャッシュ上に必要なデータがあってうまくヒットした場合はいいが何かのデータを当てに分岐命令を書いている場合必ずしもヒットしない。
この場合再リロードを行う必要がある。この際flashからの応答にコアはwaitで待つことになる。
そういうことも見越してART内にはブランチキャッシュというものを持っておりある程度の緩和を行っているものだと思う。
実際の流れでは以下のようになる。
AXIMのこと忘れてね?
おっとそうでした。
図に示す通りにFlashへのアクセスはTCMだけではなくAHBのバスマトリックスを経由したAXIMからでも行えます。
そもそもCortexM7にはI/Dキャッシュがあります。(0~64KBの間でベンダーが決定して搭載)
こっちを有効にすれば命令、データともにキャッシュが有効になります。
実質この機能だけでだいぶ高速になります。
このAXIMってバスはペリフェラルバスと同一なレーンにいるため渋滞を招くことも懸念されます。
そのためSTはTCIM経由でキャッシュできる構造を取ったのでしょう。
おまけ1:その他の高速化
とりあえずここまででARTが何なのか?がわかったと思うので僕が感心しているDTCMメモリでも話そうと思います。
要するにCPUから最速アクセス可能な密結合メモリのことです。
場所としてはここ
クリティカルなコードやデータをここに配置することで高速化を図れる。
おき方としてはリンカーでアドレスくくって定義てそこに対して起動時にコピーすれば行ける。
その他DTCMにはGPDMAでも書けるのでCPUとペリフェラルで書き換えが頻繁なものはこのアドレスに対して書き込ませれば処理時間が少しは早くなるかもしれない。
またこの領域はキャッシュの影響を受けないのでその点でも結構使いやすい。
各種配置による速度差はIAR様のこの資料がわかりやすいです。
https://www.iar.com/globalassets/pdf/st-kits-kk/8_work_with_effective_software_development_for_cortex-m7_201504.pdf
やりかた
やりかただけ書いておく。
CubeMXでCortexM7の欄を開く
このように設定する。
次にリンカスクリプトでROMの開始アドレスを0x00200000に変更する。
これで実行した時のプログラムカウンタがそれっぽい番地に来てればいいはず
ちなみに有効になってるか確認するにはFlashレジスタを確認するといいです。
ちなみにONとOFFでFIRフィルタを回した時はこんな感じだいぶ処理時間が変わってくる。
2018/11/24追記
いつの間にかCubeMXもVer5になっていますが・・・・
F4ではRCCのメニューで有効にできるみたいです。
参考文献
ネットの記事
APS様CortexM7解説
www.aps-web.jp
ねむいさんのブログ
ねむいさんのぶろぐ | STM32F7を使ってみる5 -AXIMとITCM-
CQ出版の解説ページ
www.kumikomi.net
マイナビニュース
news.mynavi.jp
書籍
- ARMマイコンCortexM教科書
- Interface2016年12月号付録 STM32便利帳2016