2015/12/29

[esp8266]ICACHE_FLASH_ATTR?

SDKのサンプルを見ていると、ICACHE_FLASH_ATTRというマクロをしばしば使っている。
関数定義のところで使われている。
さて、なんだろうか?
名前からすると、FLASHの命令キャッシュに保存してよい、みたいな感じがするが。

気にしているのは、FLASHがSPIのところだ。
SPIってことは、シリアル。
データバスでアクセスするわけじゃないので、どこか一度RAM上に展開しないと実行できないのがノイマン型コンピュータの宿命だと思う。
メモリマップを見ると、iromはだいたい1MBまでになっているから、ESP8266の内蔵RAMが1MBあって、起動時に全部読込んでいるのでは?という予測をしていたのだ。

関数ごとにキャッシュに入れるとか入れないとかいう指定ができるなら、なんか関係していそうだ。


"ICACHE_FLASH_ATTR" macro - ESP8266 Developer Zone

FAQだった。

 

  • ICACHE_FLASH_ATTR付きの関数はコンパイル時にiromセクションに割り当てられる。
    CPUは必要なときにFLASHから関数コードを読み出す。
  • ICACHE_FLASH_ATTR無しの関数は起動時にiramセクションに読込まれる。

全部のコードをiramに置くことはできないので、FLASHに置いたままでも良い関数にはICACHE_FLASH_ATTRを付けてくれ。
でも、割り込みハンドラには付けるなよ。

 

とのこと。
CPUが自動的にFLASHから読み出すんだ。
読み出したコードは、実行したらすぐ捨てられるんだろうか?

リンカスクリプトを見ると、iramのサイズは0x8000だから、32KB。
割り込みハンドラや、あまり処理時間を掛けたくないところはそこに置くと良いのかな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。