« 足回り試作 | トップページ | 試作部品 »

2015年1月17日 (土)

STM32F303のCCMでコード実行

STM32F303にある、CCM (Core Coupled Memory) RAMでのコード実行を試してみる。

CCM RAMの0x10000000番地に配置されるコードを吐くのはできそうだけど、それを通常のコードと一緒にFLASHに書き込んで、実行前に実体をコピーするのか...
手作業でしこしこやればできそうだけれど、面倒だな...と思っていたけれど、初期値付static変数などと同じ扱いでいいことに気付いた。

------

CCM用に専用のセクションを用意。
ここに配置したい関数を指定

例えば、

int CcmTest(int) __attribute__ ((section (".ccm")));

とかプロトタイプ宣言。

次にリンカスクリプトの中で、このセクションをCCM RAMのアドレスに配置。

MEMORY
{
  rom (rx)  : ORIGIN = 0x00000000, LENGTH = 256K
  ccm (rwx) : ORIGIN = 0x10000000, LENGTH = 8K
  ram (rw) : ORIGIN = 0x20000000, LENGTH = 40K
}

SECTIONS
{
  . = 0x10000000;
  .ccm : {
  *(.ccm)                  
} > ccm AT > rom

で最後の行で、.ccmの実体はflashエリアに置くように指定。
これで、.textセクションの直後に実体が置かれる。

さらに、スタートアップの中で、変数の初期値をコピーするのと同時に、この部分のプログラムの実体をflashからccmへコピー。
何処にあるかは、mapファイルに書いてあるけど、textセクションの直後。
コピーするサイズは、ccmセクションのサイズを計算して求める。

これでめでたく、指定した関数をCCM上に配置して実行できるようになった。

------

呼び出しオーバーヘッドや、外部メモリアクセス等の影響があるので、正確に測るのは面倒だけれど、簡単な無限ループを実行して、ループのスピードをカウントしてみる。
環境はクロック72MHZで、2ウエイトクロック。

試した感じだと、flashに比べてccmでの実行速度は、25%ほど速いようだ。
カタログスペックでは50%くらいは速い、となってるので、まあこんなもんかな。


使える容量は少ないけれど、いよいよの時には使えるかも。
オーバークロックよりは安全そうだし。

|

« 足回り試作 | トップページ | 試作部品 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: STM32F303のCCMでコード実行:

« 足回り試作 | トップページ | 試作部品 »