マイコンの基礎固め3

STM32F7マイコンの性能を引き出すために出力セクションをどこに配置するか自分なりに考えた結果をここにまとめておく。

STM32F7のメモリ

STM32F7マイコンには5つのメモリがある。FLASH、ITCM、DTCM、SRAM1、SRAM2だ。
このうちFLASHがROMに相当し、それ以外はRAMになる。

上の画像においてFLASHメモリの配置場所が0x00200000から始まるものと0x08000000から始まるものとで2つあるが、メモリの実体は0x08000000からにしか存在しない。CPUが命令をフェッチする際に0x08000000にアクセスするとAXIMバス経由で、0x00200000にアクセスするとITCMバス経由でFLASHメモリにアクセスできるということである。

AXIMバスにはペリフェラルの情報も流れているためデータが渋滞してアクセス速度が低下することがあるが、ITCMバスにはCPUがフェッチする命令しか流れていないため高速である。
なぜ命令をフェッチする経路が2つ設けられているのかは興味が惹かれるところだ。


出力セクション

STM32CubeIDEの環境でSTM32F7用のプログラムをコンパイルすると以下の5つの出力セクションが必ず作られるようである。

セクション名内容
.isr_vectorISRベクタテーブル
.textコード(機械語の命令)
.rodata定数など、書き換えしないデータ
.data初期値が0以外のデータ
.bss初期値が0のデータ


今回はそれに加えて以下の3つの出力セクションを独自に追加することにした。名前と内容は私の方で勝手に決めた。

.ramfuncはITCM領域に配置することを想定し、可能な限り高速で実行したい処理を配置する。

.bss_sram1と.bss_sram2はそれぞれSRAM1とSRAM2に配置することを想定している。合計で384KBと大容量だがAHBバスマトリックスを通してしかアクセスできないため恐らく低速であろうと予想し、低速大容量な.bssセクションと位置付けた

セクション名 内容
.ramfuncRAM上で実行するコード(機械語の命令)
.bss_sram1SRAM1に保存する初期値が0のデータ
.bss_sram2SRAM2に保存する初期値が0のデータ



出力セクションの配置

以上をまとめると以下の表の通りになる。
前回の記事(マイコンの基礎固め2)にも書いたように、RAM上に展開して高速に実行したいような処理はITCM領域に配置し、スタックなどはDTCM領域に配置することとした。
SRAMはどう使うかまだ決まっておらず、現段階ではおまけみたいなものである。デバッグ用にしてしまおうか。

セクション名内容配置場所
.isr_vectorISRベクタテーブルFLASH
.textコード(機械語の命令)FLASH
.rodata定数など、書き換えしないデータFLASH
.data初期値が0以外の変数DTCM
.bss初期値が0の変数DTCM
.ramfuncRAM上で実行する関数ITCM
.bss_sram1SRAM1に保存する初期値が0のデータSRAM1
.bss_sram2SRAM2に保存する初期値が0のデータSRAM2