如果您对这些资源有任何疑问或问题,请 提出新问题,恩智浦支持团队将为您解答。
在学习 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 设备的用户。这些微控制器(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部分。