From 7c55633bfb187e9190af75332de584b17d6410ae Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Wed, 6 Jan 2021 16:36:52 +1100 Subject: [PATCH] esp_common: Correctly disable ".bss segment placed in external memory" for ESP32-S2 & ESP32-S3 Support for this feature is still pending. As reported by https://github.com/espressif/esp-idf/issues/6162 --- components/esp_common/Kconfig.spiram.common | 2 +- docs/en/api-guides/external-ram.rst | 29 +++++++++-------- docs/zh_CN/api-guides/external-ram.rst | 35 ++++++++++++--------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/components/esp_common/Kconfig.spiram.common b/components/esp_common/Kconfig.spiram.common index b7229bd49d..e10d5cf588 100644 --- a/components/esp_common/Kconfig.spiram.common +++ b/components/esp_common/Kconfig.spiram.common @@ -92,7 +92,7 @@ config SPIRAM_MALLOC_RESERVE_INTERNAL config SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY bool "Allow .bss segment placed in external memory" default n - depends on SPIRAM + depends on SPIRAM && IDF_TARGET_ESP32 # TODO ESP32-S2 IDFGH-4320, ESP32-S3 IDF-1974 select ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY help If enabled, variables with EXT_RAM_ATTR attribute will be placed in SPIRAM instead of internal DRAM. diff --git a/docs/en/api-guides/external-ram.rst b/docs/en/api-guides/external-ram.rst index 5679b75292..bef78f97c1 100644 --- a/docs/en/api-guides/external-ram.rst +++ b/docs/en/api-guides/external-ram.rst @@ -31,10 +31,12 @@ Configuring External RAM ESP-IDF fully supports the use of external memory in applications. Once the external RAM is initialized at startup, ESP-IDF can be configured to handle it in several ways: - * :ref:`external_ram_config_memory_map` - * :ref:`external_ram_config_capability_allocator` - * :ref:`external_ram_config_malloc` (default) - * :ref:`external_ram_config_bss` +.. list:: + + * :ref:`external_ram_config_memory_map` + * :ref:`external_ram_config_capability_allocator` + * :ref:`external_ram_config_malloc` (default) + :esp32: * :ref:`external_ram_config_bss` .. _external_ram_config_memory_map: @@ -83,23 +85,24 @@ If a suitable block of preferred internal/external memory is not available, the Because some buffers can only be allocated in internal memory, a second configuration item :ref:`CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL` defines a pool of internal memory which is reserved for *only* explicitly internal allocations (such as memory for DMA use). Regular ``malloc()`` will not allocate from this pool. The :ref:`MALLOC_CAP_DMA ` and ``MALLOC_CAP_INTERNAL`` flags can be used to allocate memory from this pool. -.. _external_ram_config_bss: +.. only:: esp32 + .. _external_ram_config_bss: -Allow .bss segment placed in external memory --------------------------------------------- + Allow .bss segment placed in external memory + -------------------------------------------- -Enable this option by checking :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY`. This configuration setting is independent of the other three. + Enable this option by checking :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY`. This configuration setting is independent of the other three. -If enabled, a region of the address space starting from 0x3F800000 will be used to store zero-initialized data (BSS segment) from the lwIP, net80211, libpp, and bluedroid ESP-IDF libraries. + If enabled, a region of the address space starting from 0x3F800000 will be used to store zero-initialized data (BSS segment) from the lwIP, net80211, libpp, and bluedroid ESP-IDF libraries. -Additional data can be moved from the internal BSS segment to external RAM by applying the macro ``EXT_RAM_ATTR`` to any static declaration (which is not initialized to a non-zero value). + Additional data can be moved from the internal BSS segment to external RAM by applying the macro ``EXT_RAM_ATTR`` to any static declaration (which is not initialized to a non-zero value). -It is also possible to place the BSS section of a component or a library to external RAM using linker fragment scheme ``extram_bss``. + It is also possible to place the BSS section of a component or a library to external RAM using linker fragment scheme ``extram_bss``. -This option reduces the internal static memory used by the BSS segment. + This option reduces the internal static memory used by the BSS segment. -Remaining external RAM can also be added to the capability heap allocator using the method shown above. + Remaining external RAM can also be added to the capability heap allocator using the method shown above. Restrictions diff --git a/docs/zh_CN/api-guides/external-ram.rst b/docs/zh_CN/api-guides/external-ram.rst index 644deab265..b0cea63e42 100644 --- a/docs/zh_CN/api-guides/external-ram.rst +++ b/docs/zh_CN/api-guides/external-ram.rst @@ -31,10 +31,12 @@ ESP-IDF 完全支持将外部存储器集成到您的应用程序中。在启动并完成片外 RAM 初始化后,可以将 ESP-IDF 配置为以多种方式处理片外 RAM: - * :ref:`external_ram_config_memory_map` - * :ref:`external_ram_config_capability_allocator` - * :ref:`external_ram_config_malloc` (默认) - * :ref:`external_ram_config_bss` +.. list:: + + * :ref:`external_ram_config_memory_map` + * :ref:`external_ram_config_capability_allocator` + * :ref:`external_ram_config_malloc` (默认) + :esp32: * :ref:`external_ram_config_bss` .. _external_ram_config_memory_map: @@ -83,23 +85,25 @@ ESP-IDF 启动过程中,片外 RAM 被映射到以 0x3F800000 起始的数据 由于有些 Buffer 仅可在内部存储器中分配,因此需要使用第二个配置项 :ref:`CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL` 定义一个内部存储池,仅限显式的内部存储器分配使用(例如用于 DMA 的存储器)。常规 ``malloc()`` 将不会从该池中分配,但可以使用 :ref:`MALLOC_CAP_DMA ` 和 ``MALLOC_CAP_INTERNAL`` 旗标从该池中分配存储器。 -.. _external_ram_config_bss: +.. only:: esp32 + + .. _external_ram_config_bss: -允许 .bss 段放入片外存储器 ------------------------------ + 允许 .bss 段放入片外存储器 + ----------------------------- -通过检查 :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY` 启用该选项,此选项配置与上面三个选项互不影响。 + 通过检查 :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY` 启用该选项,此选项配置与上面三个选项互不影响。 -启用该选项后,从 0x3F800000 起始的地址空间将用于存储来自 lwip、net80211、libpp 和 bluedroid ESP-IDF 库中零初始化的数据(BSS 段)。 + 启用该选项后,从 0x3F800000 起始的地址空间将用于存储来自 lwip、net80211、libpp 和 bluedroid ESP-IDF 库中零初始化的数据(BSS 段)。 -``EXT_RAM_ATTR`` 宏应用于任何静态声明(未初始化为非零值)之后,可以将附加数据从内部 BSS 段移到片外 RAM。 + ``EXT_RAM_ATTR`` 宏应用于任何静态声明(未初始化为非零值)之后,可以将附加数据从内部 BSS 段移到片外 RAM。 -也可以使用链接器片段方案 ``extram_bss`` 将组件或库的 BSS 段放到片外 RAM 中。 + 也可以使用链接器片段方案 ``extram_bss`` 将组件或库的 BSS 段放到片外 RAM 中。 -启用此选项可以减少 BSS 段占用的内部静态存储。 + 启用此选项可以减少 BSS 段占用的内部静态存储。 -剩余的片外 RAM 也可以通过上述方法添加到堆分配器中。 + 剩余的片外 RAM 也可以通过上述方法添加到堆分配器中。 片外 RAM 使用限制 =================== @@ -114,8 +118,11 @@ ESP-IDF 启动过程中,片外 RAM 被映射到以 0x3F800000 起始的数据 * 片外 RAM 不可用作任务堆栈存储器。因此 :cpp:func:`xTaskCreate` 及类似函数将始终为堆栈和任务 TCB 分配片上储存器,而 :cpp:func:`xTaskCreateStatic` 类型的函数将检查传递的 Buffer 是否属于片上存储器。 - * 默认情况下,片外 RAM 初始化失败将终止 ESP-IDF 启动。如果想禁用此功能,可启用 :ref:`CONFIG_SPIRAM_IGNORE_NOTFOUND` 配置选项。如果启用 :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY`,:ref:`CONFIG_SPIRAM_IGNORE_NOTFOUND` 选项将不能使用,这是因为在链接时,链接器已经向片外 RAM 分配符号。 + * 默认情况下,片外 RAM 初始化失败将终止 ESP-IDF 启动。如果想禁用此功能,可启用 :ref:`CONFIG_SPIRAM_IGNORE_NOTFOUND` 配置选项。 +.. only:: esp32 + + 如果启用 :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY`,:ref:`CONFIG_SPIRAM_IGNORE_NOTFOUND` 选项将不能使用,这是因为在链接时,链接器已经向片外 RAM 分配符号。 .. only:: esp32