2008573_zh-CN

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

2008573_zh-CN

2008573_zh-CN

Zephyr 的内存详情

如果您对这些资源有任何疑问或问题,请 提出新问题,恩智浦支持团队将为您解答。

在学习 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 以及使用设备树时,最好在应用程序构建过程中生成的设备树文件中确认设备树设置,请参阅实验室指南:设备树和 VS Code 设备树查看器


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 中的引导加载程序在启动时需要 Flash 配置块(FCB),并且可以选择添加设备配置数据 (DCD) 或外部存储器配置数据 (XMCD),这些数据通常用于启用 SDRAM。这篇文章提供了更多关于在哪里可以找到这些结构,以及如何将它们包含在开发板中的详细信息。
  • 不支持 SDRAM 的情况说明:Zephyr 对配备外部 SDRAM 的实时开发板的支持,通常会将数据存储在 SDRAM 中。ROM 引导加载程序会在 Zephyr 应用程序执行之前,通过 DCD 或 XMCD 配置 SDRAM 接口。这篇文章讨论了如何移除定制主板的 SDRAM。
  • 如需配置 FlexRAM,调整 ITCM、DTCM 或 OCRAM 的大小,请参阅 AN13970 Zephyr 中的 RT 系列内存重定位

将代码重新定位到 RAM 中

将代码移至 RAM 是一个常见需求,例如,为了最大化性能或降低功耗。借助 Zephyr,应用程序可以将所有代码或部分代码迁移到 RAM 中。以下是一些有用的搬迁资源:

  • AN13970 Zephyr 中的 RT 系列内存重定位
  • Zephyr代码和数据重定位API
  • 重新定位代码的示例应用:
    • 简单示例SDRAM_hello_world.zip将整个应用程序移动到 SDRAM,并在启动时使用 ROM 引导程序加载 RAM,然后再执行应用程序。
    • 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 部分。
  • 静态变量的另一种选择是在变量声明中使用设备树节点,从而将其放置在特定的部分中。一个可以参考的例子是恩智浦的面部检测演示。此演示在设备树中添加选定的节点zephyr,modelbuf,该节点指向内存部分节点sramx。要使用此方法,内存段节点需要具备属性zephyr,memory-region。在源代码中,model_input_buf缓冲区是用zephyr_modelbuf节点声明的。然后,链接程序将model_input_buf放置在sramx部分。
  • 整个源文件或库中的 data 和 bss 部分可以重定位到其他 RAM,详情请参阅 Zephyr代码和数据重定位 API
  • Zephyr 可以使用一个特殊的固定区域,将中断堆栈和主堆栈放置在不同的 RAM 区段中。简单示例pinned_hello_world.zip在 DTCM 中固定中断和主堆栈。

 

其他内存资源

  • 示例调整内存节点大小,利用 NXP LPC5500 中的所有 SRAM

返回Zephyr知识中心

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