マイコンの基礎固め2

今まではSTM32CubeIDEで自動的に生成されるリンカスクリプトにプログラムのメモリへの配置を任せていたが、ここをしっかりやらないとマイコンの性能を引き出せないことが分かった。

そうするとマイコン内に存在するメモリやバスの種類について詳しく知る必要が出てきた。リファレンスマニュアルの2章「System and memory overview」を見ると文書の中の表記と図の表記が微妙に異なっていて勘違いすることがあったので少し整理した。



この図だけだとどことどこが通信するときにどのバスを使うのか分かりにくかったので表にまとめた。間違っているかもしれないので注意。



リファレンスマニュアルにはITCMとFLASH間のDMAもAHBバス(恐らく上の図で言うMulti AHB BusMatrixのこと?)を介して可能と書かれているが、DMA memory busの所には

The targets of this bus are data memories: internal SRAM1, SRAM2 and DTCM (through the AHBS bus of Cortex®-M7) internal Flash memory and external memories through the FMC or Quad-SPI.

と記載されており、ITCMについては何も触れておらずあまり想定されていない使い方のようなので表には記載していない。

ITCMはDMAを使えないがCPUと同じクロックで動作でき、0ウェイトでアクセス可能である。
DTCMはペリフェラルやSRAM1、SRAM2とのDMAが可能であるが、その分CPUとのアクセス速度は落ちる。
ITCM、DTCMともに命令のフェッチにも変数の保存にも使えるが、こうして見ると確かに名前の通りITCMには命令を保存し、DTCMに変数を保存するのが最適に思える。
SRAM1とSRAM2も命令のフェッチ、データの保存に使えるが、用途がイマイチはっきりしない。DTCMより低速な分大容量なRAMという位置づけだろうか?

ちなみにSTM32CubeIDEで自動的に生成されるリンカスクリプトでは以下のようにDTCMとSRAM1、SRAM2は全てRAMとしてまとめて定義されており、区別されていない。RAMを128KB以上使うプログラムだとDTCM領域からはみ出してSRAM1、さらにはSRAM2の領域まで使うことになるのでアクセス速度が落ちると思われる。ついでに言うとITCM領域は定義されていないため使うことができない。RAMを意図した通りに使うためには自前のリンカスクリプトが必要になる。

MEMORY
{
    RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 512K
    ROM    (rx)    : ORIGIN = 0x8000000,   LENGTH = 2048K
}

デバッグのために変数の値をRAMがいっぱいになるまで溜めてUARTで一気にPCへ吐き出して値の変化を見ようとしたことがあったが、プログラムの内容によって吐き出す速度が数倍変わることが多々あった。処理の重さの差だと思っていたが、あれにはDTCMとSRAMのアクセス速度の差も含まれていたのではないか。