2008573_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2008573_ja-JP

2008573_ja-JP

Zephyrに関するメモリの詳細

これらのリソースに関するご質問や問題がございましたら、新しい質問をお寄せください。そちらで NXP サポートチームが対応いたします。

Zephyrを学習する際には、メモリに関する疑問が多く生じます。リンカはコードとデータをどこに配置するのでしょうか?アプリケーションはどのように設定すれば他のメモリを使用できるのでしょうか?

リンカーが使用するデフォルトのメモリセクションは、デバイスツリーで設定されています。通常、デバイスツリーは選択されたノードを使用してこれらのセクションを設定します。MIMXRT1060-EVKボードの例を以下に示します。

	chosen {
                zephyr,flash = &is25wp064;
                zephyr,sram = &sdram0;
	};

これらの選択したノードの名前は誤解を招く可能性があります。zephyr,flashは、リンカがすべてのコード(.text)および読み取り専用データセクションに使用するノードを指します。通常、これは物理的なフラッシュメモリを指します。このボードでは、外部のQSPIフラッシュに配置されていますが、フラッシュではないメモリにある場合もあります。zephyr,sramは、リンカがすべての.dataセクションと.bssセクションに使用するノードを指します。これはRAMに存在する必要がありますが、SRAMに存在する必要はありません。このボードは外部SDRAMに配置されます。アプリケーションは、これらのノードをそのアプリに最適な他のメモリに指すことができます。他に使用される一般的なメモリノードは&dtcm&itcm、または&ocramです。

通常、選択されたノードはボードのデバイスツリーファイルに設定されます。しかし、Zephyrを学び、デバイスツリーを扱う際には、アプリケーションのビルド中に生成されたデバイスツリーファイル内の設定を確認するのが最善です。詳細は、「ラボガイド:DevicetreeとVS Code Devicetree Viewer」をご覧ください。


i.MX RTメモリ

メモリに関する質問のほとんどは、i.MX RTデバイスを使用している方々から寄せられます。これらのMCUは、アプリケーションの性能と柔軟性を最大限に引き出すために、複数の内部および外部メモリオプションを備えた高性能なフラッシュレスデバイスです。以下は、i.MX RTデバイスに特化した参考リソースです。

  • i.MX RTアプリケーションノート:
    • AN12437 i.MX RTシリーズのパフォーマンス最適化
    • AN12077 i.MX RT FlexRAMの使用
    • AN13970 ZephyrにおけるRTシリーズメモリの再配置
  • ROMのブートローダーは、起動時にフラッシュコンフィギュレーションブロック(FCB)を必要とします。また、オプションでデバイス構成データ(DCD)または外部メモリ構成データ(XMCD)を追加することができ、通常はSDRAMを有効にするために使用されます。こちらの投稿には、これらの構造の所在と、それらがボードにどのように含まれているかについての詳細が記載されています。
  • SDRAMなし:外部SDRAMを備えたRT開発ボードのZephyrサポートは、通常、SDRAMにデータを配置します。また、ROMブートローダーは、DCDまたはXMCDを使用してZephyrアプリを実行する前にSDRAMインターフェイスを構成します。こちらの投稿では、カスタムボードのSDRAMを取り外す方法について説明しています。
  • FlexRAMの設定、ITCM、DTCM、またはOCRAMのサイズ変更については、AN13970 『Zephyr』でのRTシリーズメモリ再配置を参照してください。

RAMへのコードの再配置

パフォーマンスの最大化や消費電力の削減などの目的で、コードをRAMに配置し直すことは一般的な要件です。Zephyrを使用すると、アプリケーションはすべてのコード、またはコードの一部をRAMに再配置できます。以下は、再配置に役立つリソースです。

  • AN13970 ZephyrにおけるRTシリーズメモリの再配置
  • Zephyrコードおよびデータ再配置API
  • コードを再配置するアプリケーションの例:
    • シンプルな例として、アプリ全体をSDRAMに移動し、アプリの実行前にROMブートローダーを使ってRAMにロードするSDRAM_hello_world.zip があります。
    • Zperfサンプル:この Zephyr のネットワークサンプルは、ネットワークスタックとイーサネットドライバコードを ITCM に再配置し、MIMXRT1170-EVK用にビルドされた際にパフォーマンスを向上させます。残りのコードはデフォルトの外部QSPIフラッシュに残ります。
    • NXP SmartWatch デモとウェビナー:消費電力を削減するためにほとんどのコードを内部SRAMに再配置しますが、グラフィックアセットはフラッシュに残します。

RAMへのデータの配置

Zephyrでは、すべてのデータ、変数、スタックのデフォルトの配置はzephyr,sramノードにあります。ただし、一部のアプリケーションでは、特定のデータを別の場所に配置する必要があります。パフォーマンスを最大化するためにDTCMにデータを配置したり、DMAバッファをキャッシュ不可能なメモリに配置したり、ディスプレイの大きなフレームバッファを外部RAMに移動したりします。データ配置を指定するための便利なリソースには、次のようなものがあります。

  • スタティック変数の宣言には、特定のセクションに配置するために、リンカセクションタグを含めることができます。その例としては、dma_mcux_edma.cドライバがあり、これはdma_tcdpool構造体を__dtcm_noinit_sectionセクションまたは__nocacheセクションに配置しています。
  • スタティック変数の別の選択肢として、変数宣言でデバイスツリーノードを使用して特定のセクションに配置することができます。参考となる一例として、NXPの顔検出デモがあります。このデモでは、デバイスツリーに選択されたノードzephyr,modelbufを追加し、これはメモリセクションノードsramxを指します。このメソッドを使用するには、メモリセクションノードにプロパティzephyr,memory-regionが必要です。ソースコードでは、model_input_bufバッファがzephyr_modelbufノードで宣言されています。その後、リンカはmodel_input_bufsramxセクションに配置します。
  • ソースファイル全体またはライブラリのデータセクションとbssセクションは、他のRAMに再配置できます。Zephyrコードおよびデータ再配置APIを参照してください。
  • Zephyrでは、割り込みスタックやメインスタックを別のRAMセクションに配置するために、特別な固定セクションを使用できます。簡単な例として、pinned_hello_world.zipでは、割り込みスタックとメインスタックがDTCMに固定されています。

 

その他のメモリリソース

  • として、メモリノードのサイズを変更し、NXP LPC5500のすべてのSRAMを活用しています。

Zephyr Knowledge Hub に戻る

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎12-19-2025 09:07 AM
更新者: