gui-guider使用的是那个ram分区?如何拓展以保证其工作流畅

88 2025-01-14 10:49

GUI-Guider 使用的 RAM 分区及扩展方法

1. GUI-Guider 使用的 RAM 分区

GUI-Guider 生成的图片文件(.c)格式通常会占用 ESP32 的内部 RAM(DRAM)。这些图片数据在运行时会被加载到 RAM 中,以供 LVGL 库进行渲染。因此,确保有足够的 RAM 空间是非常重要的。

2. 如何扩展 RAM 以保证 GUI-Guider 工作流畅

2.1 使用外部 PSRAM
ESP32 支持扩展外部 PSRAM,这可以显著增加可用的内存空间。以下是如何启用和配置外部 PSRAM 的步骤:
  1. 使能外部 PSRAM
    • menuconfig 中启用外部 PSRAM 支持。
    • 运行 idf.py menuconfig,进入 Component config -> ESP32-specific -> Main CPU frequency,选择 240MHz (160MHz when using Wi-Fi or BT/BLE)
    • 进入 Component config -> ESP32-specific -> SPI RAM,选择 Enable PSRAM
  2. 配置外部 PSRAM
    • 修改 sdkconfig 文件,确保 CONFIG_SPIRAM 选项被启用。
    • 修改 sdkconfig 文件,确保 CONFIG_SPIRAM_USE 选项被启用。
    • 修改 sdkconfig 文件,确保 CONFIG_SPIRAM_SIZE 选项被设置为合适的值,例如 4MB
  3. 修改分区表
    • 由于使用了外部 PSRAM,partitionstable.bin 的大小会增加,需要修改分区表的偏移地址。
    • 运行 idf.py menuconfig,进入 Partition Table,将 Partition Table Offset 修改为 0x10000
    • 修改本地分区表文件,例如 partitions_single_app.csv,确保 nvs 分区的偏移地址为 0x11000

    plaintext复制

    # Name,   Type, SubType, Offset,  Size
    nvs,      data, nvs,     0x11000,  0x4000,
    phy_init, data, phy,     0x15000,  0x1000,
    factory,  app,  factory, 0x20000, 0x300000,
    flash_tone,data, 0x04,   0x320000,  50k,
2.2 优化内存使用
  1. 减少静态分配的内存
    • 减少应用程序中静态分配的 buffer 大小,以增加可用的 DRAM 堆空间。可以使用 idf.py size 命令查找静态分配内存的大小。
  2. 使用外部 SPI RAM
    • 如果可能,使用外部 SPI RAM 来存储图片数据。通过缓存将片外 RAM 集成到 ESP32 的内存映射中,访问方式与 DRAM 类似。
  3. 优化图片文件
    • 减小图片文件的大小,例如使用更小的分辨率或更高效的压缩格式。
    • 只加载需要显示的图片部分,而不是整个图片。
2.3 代码示例
以下是一个示例代码,展示了如何在 ESP32 上初始化和使用外部 PSRAM:

c复制

#include "esp_log.h"
#include "esp_spiffs.h"
#include "esp_vfs.h"
#include "lvgl.h"
#include "lvgl_helpers.h"
#include "gui_guider.h"
#include "custom.h"

static const char *TAG = "SPIFFS";

void init_spiffs() {
    const char *base_path = "/spiffs";
    esp_vfs_spiffs_conf_t conf = {
        .base_path = base_path,
        .partition_label = "images",
        .max_files = 5,
        .format_if_mount_failed = true
    };

    esp_err_t ret = esp_vfs_spiffs_register(&conf);

    if (ret == ESP_FAIL) {
        ESP_LOGE(TAG, "Failed to initialize SPIFFS");
        return;
    }

    size_t total = 0, used = 0;
    ret = esp_spiffs_info(conf.partition_label, &total, &used);
    if (ret == ESP_OK) {
        ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used);
    } else {
        ESP_LOGE(TAG, "Failed to get SPIFFS partition information");
    }
}

void app_main(void) {
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }

    init_spiffs();

    lv_init();

    lv_color_t *buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
    assert(buf1 != NULL);
    static lv_color_t *buf2 = NULL;
    static lv_disp_draw_buf_t disp_buf;
    uint32_t size_in_px = DISP_BUF_SIZE;
    lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px);

    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.hor_res = LV_HOR_RES_MAX;
    disp_drv.ver_res = LV_VER_RES_MAX;
    disp_drv.flush_cb = disp_driver_flush;
    disp_drv.draw_buf = &disp_buf;
    lv_disp_drv_register(&disp_drv);

    const esp_timer_create_args_t periodic_timer_args = {
        .callback = &lv_tick_task,
        .name = "periodic_gui"
    };
    esp_timer_handle_t periodic_timer;
    ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
    ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, 1 * 1000));

    lv_ui guider_ui;
    setup_ui(&guider_ui);

    while (1) {
        vTaskDelay(pdMS_TO_TICKS(10));
        lv_task_handler();
    }
}

3. 注意事项

  • 文件路径:确保文件路径正确,例如 /spiffs/image1.jpg
  • 内存管理:在读取文件后,记得释放分配的内存。
  • 错误处理:在文件操作中,添加适当的错误处理逻辑,确保程序的健壮性。
通过以上步骤,你可以确保 GUI-Guider 生成的图片文件正确地存入 images 分区,并且有足够的 RAM 空间来保证其工作流畅。

全部评论

·