マイコンコンパイラがRAMから関数を強制実行(または提案)するためのマクロに出くわしました。
http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM
https://community.nxp.com/thread/389099
これはどのような場合に価値がありますか?利点が速度の向上だけである場合、常にRAMから実行しないのはなぜですか?これは一般に、より高い電流引き込みを引き起こしますか?
マイコンコンパイラがRAMから関数を強制実行(または提案)するためのマクロに出くわしました。
http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM
https://community.nxp.com/thread/389099
これはどのような場合に価値がありますか?利点が速度の向上だけである場合、常にRAMから実行しないのはなぜですか?これは一般に、より高い電流引き込みを引き起こしますか?
回答:
他の人がすでに言及した速度と他の機能に加えて、RAMからコードを実行することは、マイクロフラッシュを再プログラムする必要があるブートローダーで役立ちます-消去中のフラッシュからコードを実行することはできません&再プログラミング。
私はそのマイクロのデータシートを見ませんでした。ただし、この状況では、RAMからのフェッチが、プログラムメモリが実装されているフラッシュからのフェッチよりも高速であることがよくあります。
フラッシュの利点は、大量に比較的安価にできることです。そのため、マイクロコントローラーの製造元はチップ上に大量のフラッシュを配置し、コードを実行できるより限られたRAMスペースを提供することがあります。これにより、タイムクリティカルなルーチンをRAMにコピーし、そこから実行できます。
参照するコンパイラスイッチは、おそらくリンカで機能し、リセットから実行されるコンパイラランタイムコードによってRAMにコピーされるフラッシュのセクションにフラグを立てます。実装が異なると、詳細が異なります。
より高速であるためにRAMで実行する場合、通常はそのRAMがオンチップSRAMであるためです。これは希少なリソースであり、おそらく読み取り/書き込みアクセスを必要とするデータに必要です。
あなたはすでに時にコードのためにそれを使用していますが、フラッシュのX量とRAMの追加のX量が必要であることをROM /フラッシュ手段でコードを。
また、ほとんどの場合重要ではありませんが、起動時または実行するときに追加のコピーステージが必要です。
従来、これは命令キャッシュで解決されていましたが、マイクロコントローラでは、実行速度を最速にしたいためマイクロコントローラを使用しないため、内部SRAMを汎用的に保持する方が理にかなっています。
また、信頼性の問題もあります。実際のROMで実行されるコードは、バグのあるコードでは変更が困難です。
すべての良い答えに加えて:
利点が速度の向上だけである場合、常にRAMから実行しないのはなぜですか?
組み込みシステムでは、通常、必要な量のRAMがないためです。たとえば、32kBまたはRAMと512kBのEEPROMを備えたSTM32。RAMでプログラム全体を実行するには、EEPROMよりも大きいRAMサイズが必要です。
他の答えは、あなたが特に尋ねた電力消費についてあまり議論していないようです。
答えは、マイクロコントローラーに多少依存しますが、多くの場合、RAMからの実行は、フラッシュメモリからよりもRAMから命令を読み取るために必要なエネルギーが少ないため、消費電力を削減できます。
典型的な使用法は、フラッシュメモリの電源を切った状態で、RAMから低電力の「スリープ」機能を実行することです。消費電力が削減されるだけでなく、マイクロコントローラが(たとえば外部割り込みに応答して)すばやく起動する必要がある場合、フラッシュメモリの電源が再びオンになるまで遅延はありません。
一部のAtmel SAM範囲などの一部の部品には、この目的に使用できる特別な低電力RAMがあります。これにより、使用可能なRAMの大部分と他のすべてのメモリの電源がオフになり、マイクロコントローラがディープスリープモードになり、少量のコードを特別なRAMにロードできます。
RAMからのコードの実行は、フラッシュメモリからの実行よりも大幅に高速です。ほとんどのCPUは、可能な限り高速なRAMアクセス用に高度に最適化されており、最速のフラッシュメモリでさえRAMの数分の1の速度にしか達しません。
ただし、コードをフラッシュからRAMに移動するのにも時間がかかることに注意してください。コードが1回しか実行されない場合は、コードを1回読み取るだけで済むため、実際にコードを直接実行するのではなく、最初にRAMにコピーする時間を失うことになります。コードがときどき実行される場合(したがって、コードをRAMにコピーすると2回目の呼び出しで実行が増加します)、システムが一般的にアイドル状態の場合、RAMにコピーすることでコードをより速く実行できますが、システムは十分な時間があります。
そのため、コードが頻繁に実行され、システムのチョークポイントであると測定した場合、そのような最適化は努力するだけの価値があります。
一方、RAMはデータをアクティブに保持する必要がありますが、フラッシュメモリは保持しないため、RAMをアクティブに保つ必要がある場合、総消費電力が増加します。ただし、これはRAMがまったく使用されていない場合にのみ関係しますが、最新のシステムのほとんどは、何らかの方法で使用可能なRAMを既に使用しているため、既にアクティブになっています。
RAMからコードを実行する2つの非常に一般的な理由があります。
一部のマイクロプロセッサは、フラッシュプログラミング中にフラッシュから実行できませんが、コードが書き込まれているフラッシュとは異なるブロックにある限り、多くのマイクロプロセッサはこれを実行できます。フラッシュ書き込みは、アプリケーションの再プログラミング(ブートローダーの場合)、または不揮発性プログラム情報の保存にフラッシュが使用されている場合(構成、キャリブレーションなど)
多くのマイクロプロセッサでは、RAMはフラッシュよりもはるかに高速です。これらのデバイスでは、通常、RAMはフラッシュよりもはるかに短い供給ですが、速度重視の小さなルーチンをRAMから実行できます。
ランダムビットフリップに対するRAMのみの実行セキュリティの別のユースケース。メインコンピューターボードには、放射線によるビットフリップを許容するECCラムがあるため、小さなキューブでこのモデルを使用します。起動時のRAMディスクはECC環境で完全に実行されるため、OS全体がRAMにロードされます。
フラッシュはECC保護されていません(標準の市販のマイクロSDカード)が、破損をチェックする他の方法(複数のイメージ、チェックサムなど)があります