新しく使うマイコンの説明に、キャッシュ兼用のRAMがあって、
説明を読んでもよくわかんないなぁとずっと悩んでいたのだが、
キャッシュ周りであれこれ掘っていたらやっと理解できた。
あまり一般的な構成ではないのかもしれないけど、とあるマイコンの話。
キャッシュメモリというのはCPUの近くに置かれる高速なメモリで、
通常は外部の低速のメモリから取得したデータを一時保管しておいたり、
あるいは外部のメモリへのライトアクセスを一時保管しておいたり。
階層化されたキャッシュメモリを持つことも多く、
例えば、マルチコアのCPUで、コアごとに命令とデータのL1キャッシュがあり、
全コアで共有するやや容量の大きいL2キャッシュを持つという構成など。
キャッシュメモリを使うことで処理の高速化が見込めるものの、
キャッシュにあるかないかでアクセス時間が大きく変動することはある。
そこで、リアルタイム性が特に要求されるところでは、
キャッシュメモリのような確実に高速にアクセス出来るメモリにデータを格納することがある。
容量は限られるが、場合によってはこの範囲で収まる可能性もある。
で、このマイコンではキャッシュメモリをデータ格納用に転用できる仕組みがあると。
キャッシュメモリとして使える容量を削って、
キャッシュメモリと同等の速度でアクセス出来る固定メモリとして使えると。
で、この説明を見たときにレジスタの設定に応じて、
SRAMをキャッシュに使うか、固定メモリに使うか変更できるのだと思ったが、
その割にはなんかおかしなことが書いてある。
答えはこんな仕組みだった。
メモリ空間上にキャッシュ経由で外部メモリにアクセスするアドレス空間と、
キャッシュメモリを固定メモリとして使う場合のアドレス空間がある。
これらのアクセスはキャッシュメモリ経由で処理されるのだが、
キャッシュにデータが格納されていなかった場合、
外部メモリがある場合は外部メモリからデータを取得してくるわけだけど、
固定メモリとして使うアドレス空間の場合は、キャッシュメモリから先がないのでオール0が返される。
あと、追い出しが発生した場合は、データを追い出す先がないので消去になる。
で、固定メモリとして使う場合は、この領域に何らかのデータをライトする。
ライトしたデータがアドレスと関連付けられてキャッシュに格納されていく。
0x10000000番地のキャッシュが0x00…というような形で保存されていくと。
このとき、キャッシュメモリの一部領域だけが使われるように制限する。
この状態で固定メモリとして使いたいアドレス全体にデータを書き込む。
例えば、0x10000000~0x1000FFFF番地のデータが格納できたとする。
そして、キャッシュメモリの領域制限を逆にして、今まで書いた領域を使用禁止にする。
こうすると、0x10000000~0x1000FFFF番地のデータはキャッシュメモリ上から追い出されなくなる。
この結果、0x10000000~0x1000FFFF番地を固定メモリのように使えると。
具体的な実現方法はキャッシュメモリの種類によって多少の差はあるが、
できるだけキャッシュメモリとしての構造を維持しながら、
固定メモリのように使える仕組みを用意したんだなというのは読み取れる。
なお、このような仕組みもあってか、キャッシュに最低限残す容量は決まっている。
全部を固定メモリにできないので、命令用の密結合メモリとして使う場合は何kBと、
命令キャッシュの容量と違う数字が書かれていたのはこのためだった。
今までキャッシュのあるマイコンをあまり使ってこなかったのもあるのだが、
このマイコンのキャッシュ周りの説明は特にわかりにくい気がする。
サンプルプログラムを見て手を加えたり、処理時間を測定したり、
いろいろ試した上で改めて読んでみるとなるほどと納得できたんだけど。
いろいろな暗黙的な知識があるんだろうけどね。それにしても難しい。