コロナ対応の疲れが見える知り合いの顔を見るにつけ、行きつけでないにしても飲み屋さんの閉店張り紙を見るにつけ、なんとも言えない気持ちになるこの頃です。それでもデータシートを読むのであります。何か救いでも書いてあるのか?STM32F401xD/xEその7は、どのMCUにもありがちな非対称性についてかんがえます。
今回、眺めてみますのは、STM32F401xD/xEデータシート(DoclD025644 Rev3)のP.17、
- Figure 4. Multi-AHB matrix
- 3.8 DMA controller (DMA)
あたりです。これと4ページほど前のFigure 3. STM32F401xD/xE block diagramを照合して考えます。今回、気になるのはDMAです。
DMAC、マイコンを使っていても「DMAにお世話になっている」人もいれば、そうでない人もいるんじゃないかと思います。綴ればDirect Memory Access Controller、CPUを使うことなく、メモリアクセスをするための装置であります。今日や昨日できたような新式の存在ではなく、遥かマイコンの黎明期からDMACは存在してきました。その動作と言えば、IOからポロポロとデータを読み取ってメモリにためておき、ためたものが処理単位に達したら「先生どうぞ」という具合にCPUにご出馬願うとか。あるいは、CPUがメモリ上にまとめてドンとおいたデータを、IOの都合に合わせてちびちびと書き出していくといった感じです。貴重な資源であるCPU時間を単純なデータ転送に費やさず、他の「もっとやることあるだろー」という仕事に振り向けるための仕組みであります。
マイコンの周辺装置は数あれど、DMAコントローラが他の多くの周辺装置やメモリなどと一線を画するのは、自らが
バス・マスタ
となれるという点であります。高度な周辺装置の中にはDMA機能を内包するものもありますが、通常のマイコンでバスマスタになれるのはCPUとDMAコントローラのみ。
昔、バスというものが1つしか使えなかった貧しい?時代、DMAコントローラはCPUが「たまたま」使っていないバスサイクルを有効活用するのが建前でありました。しかし、CPUもそんなに空きを作るほど暇ではない!そんな忙しいときにはCPUとDMAの間でバスの取り合いになるということもままありましたな。時代が下がるにつれ、MCUのリソースも豊かになり、バスが複数あるのが普通になって行きました。MCUとDMAでバスの分捕り合戦が頻発しないように、というのも複数バスの目的の一つだと思います(ぶつかるときはぶつかりますがね。)メモリ用、IO用、数が増えて行きました(とは言え野放図にバスを増やすのはできませぬ。)その結果のFigure 4.を眺めてみると味わい深いものがあります。
CPUコア(Arm Cortex-M4)には3つものバスが接続しています。今回はDMAフォーカスなので、CPUには深入りしませんが、CPUのバスもフェッチとデータなど「非対称」であることは心に留めておくべきでしょう。さて、データシートを読んでいるSTM32F401xD/xEマイコンにはDMAコントローラは2つあります。それぞれのDMAから2本ずつのバスが出ています(これすら昔のDMACに比べたらゴージャス。)それらのバス構造が対称であるか、と見てみれば、やはりというべきか非対称なのです。
DMA1というコントローラのIO側のバスは、APB1という周辺装置用の第1のバスのみに接続されています。このAPB1というバスに何が接続されているのかと調べてみると、タイマとシリアルポートといったものの「総数チャネル数の半分くらい」が接続してました。DMA1のもう一方のバスは、SRAMとFlashのデータアクセスポート(プログラムのフェッチに使われるポートとは別)に接続しています。DMA1を使えば、APB1につながった周辺装置とメモリとの間でデータを転送できるということになります。
DMA2というもう一つのコントローラのIO側のバスは、APB2という周辺装置用の第2のバスに接続するとともに、SRAMとFlashのデータアクセスポート、そしてAHB1とAHB2という2つのAHB(APBよりCPUに近いところの高速なシステムバス)というバスを介しても周辺装置に接続しています。APB2には、APB1に接続していなかった残りのタイマやシリアルポートが接続されています。AHB2にはUSBなどAPBに接続されていない周辺装置が接続されています。それに加えて、AHB1の先には、両APBバスへの「ブリッジ」(先ほどのDMAとの経路とは別なもの。CPUが周辺装置を直接読み書きする場合に使用される)まで接続しているのです。DMA1のIOバスとはエライ違い。また、DMA1のメモリ側のバスはメモリにしかつながっていなかったのですが、DMA2のそれはメモリだけでなくAHB1、AHB2にも接続しております。
同じDMACといっても、ちんまりとAPB1バス接続の周辺装置のみにサービスするだけのDMA1と、なにか「可能性」が大きいDMA2では、できることが大分違うように思います。その上、よくよくFigure.3を見ると、周辺バスと言ってもAPB1とAPB2ではその速度も違うじゃありませんか(APB2の方がクロック速度が速い。)APB1はどちらかというと電気を食わないように「ゆるゆると」動かす味付けに見えます。
このような非対称性が現れる場所は、MCUにはよくある、と申し上げておきましょう。ソフトウエア的は美しく全てを対称的にした方がよろしいのでしょうが、なけなしのリソースをそれぞれ「個性的」な装置に振り分けねばならないMCUでは、配分もシビアと。それを汲み取って利用することが必須であるのでした。