マイコンの基礎固め3
- 2020.03.29
- STM32F7
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_vector | ISRベクタテーブル |
.text | コード(機械語の命令) |
.rodata | 定数など、書き換えしないデータ |
.data | 初期値が0以外のデータ |
.bss | 初期値が0のデータ |
今回はそれに加えて以下の3つの出力セクションを独自に追加することにした。名前と内容は私の方で勝手に決めた。
.ramfuncはITCM領域に配置することを想定し、可能な限り高速で実行したい処理を配置する。
.bss_sram1と.bss_sram2はそれぞれSRAM1とSRAM2に配置することを想定している。合計で384KBと大容量だがAHBバスマトリックスを通してしかアクセスできないため恐らく低速であろうと予想し、低速大容量な.bssセクションと位置付けた
セクション名 | 内容 |
.ramfunc | RAM上で実行するコード(機械語の命令) |
.bss_sram1 | SRAM1に保存する初期値が0のデータ |
.bss_sram2 | SRAM2に保存する初期値が0のデータ |
出力セクションの配置
以上をまとめると以下の表の通りになる。
前回の記事(マイコンの基礎固め2)にも書いたように、RAM上に展開して高速に実行したいような処理はITCM領域に配置し、スタックなどはDTCM領域に配置することとした。
SRAMはどう使うかまだ決まっておらず、現段階ではおまけみたいなものである。デバッグ用にしてしまおうか。
セクション名 | 内容 | 配置場所 |
.isr_vector | ISRベクタテーブル | FLASH |
.text | コード(機械語の命令) | FLASH |
.rodata | 定数など、書き換えしないデータ | FLASH |
.data | 初期値が0以外の変数 | DTCM |
.bss | 初期値が0の変数 | DTCM |
.ramfunc | RAM上で実行する関数 | ITCM |
.bss_sram1 | SRAM1に保存する初期値が0のデータ | SRAM1 |
.bss_sram2 | SRAM2に保存する初期値が0のデータ | SRAM2 |
-
前の記事
マイコンの基礎固め2 2020.03.23
-
次の記事
マイコンの基礎固め4 2020.04.05