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 的步骤:
-
使能外部 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
。
-
-
配置外部 PSRAM
-
修改
sdkconfig
文件,确保CONFIG_SPIRAM
选项被启用。 -
修改
sdkconfig
文件,确保CONFIG_SPIRAM_USE
选项被启用。 -
修改
sdkconfig
文件,确保CONFIG_SPIRAM_SIZE
选项被设置为合适的值,例如4MB
。
-
-
修改分区表
-
由于使用了外部 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 优化内存使用
-
减少静态分配的内存
-
减少应用程序中静态分配的 buffer 大小,以增加可用的 DRAM 堆空间。可以使用
idf.py size
命令查找静态分配内存的大小。
-
-
使用外部 SPI RAM
-
如果可能,使用外部 SPI RAM 来存储图片数据。通过缓存将片外 RAM 集成到 ESP32 的内存映射中,访问方式与 DRAM 类似。
-
-
优化图片文件
-
减小图片文件的大小,例如使用更小的分辨率或更高效的压缩格式。
-
只加载需要显示的图片部分,而不是整个图片。
-
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 空间来保证其工作流畅。
全部评论