これらのリソースに関するご質問や問題がございましたら、新しい質問をお寄せください。そちらで 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デバイスを使用している方々から寄せられます。これらのMCUは、アプリケーションの性能と柔軟性を最大限に引き出すために、複数の内部および外部メモリオプションを備えた高性能なフラッシュレスデバイスです。以下は、i.MX RTデバイスに特化した参考リソースです。
パフォーマンスの最大化や消費電力の削減などの目的で、コードをRAMに配置し直すことは一般的な要件です。Zephyrを使用すると、アプリケーションはすべてのコード、またはコードの一部をRAMに再配置できます。以下は、再配置に役立つリソースです。
Zephyrでは、すべてのデータ、変数、スタックのデフォルトの配置はzephyr,sramノードにあります。ただし、一部のアプリケーションでは、特定のデータを別の場所に配置する必要があります。パフォーマンスを最大化するためにDTCMにデータを配置したり、DMAバッファをキャッシュ不可能なメモリに配置したり、ディスプレイの大きなフレームバッファを外部RAMに移動したりします。データ配置を指定するための便利なリソースには、次のようなものがあります。
dma_tcdpool構造体を__dtcm_noinit_sectionセクションまたは__nocacheセクションに配置しています。zephyr,modelbufを追加し、これはメモリセクションノードsramxを指します。このメソッドを使用するには、メモリセクションノードにプロパティzephyr,memory-regionが必要です。ソースコードでは、model_input_bufバッファがzephyr_modelbufノードで宣言されています。その後、リンカはmodel_input_bufをsramxセクションに配置します。