首页 > 系统相关 >esp32-将flash分区进行内存映射

esp32-将flash分区进行内存映射

时间:2024-12-16 17:25:20浏览次数:4  
标签:map flash 映射 ESP esp32 partition 内存 data 分区

1.前言

为什么需要将flash分区映射到内存区域

在某些情况下,我们需要在单片机中保存一个较大的数组,比如字库、图片等,使用const将其编译到代码中,可以指针访问他们。但是,在线刷或者OTA更新时,也不可避免的需要更新他们,造成了时间或者空间上的浪费。但是如果将其按照静态数据存放在flash中,只能读和写,不能按照指针访问这些数据,很不方便。因此,可以使用esp32 SDK中的mmap功能,新建一个分区,将静态数据存放在对应的分区中,并且将其映射在内存中,使用指针读取

2.实现

2.1 新建工程 修改分区表

首先新建一个空白工程,并且在menuconfig中使用自定义分区表,并且将分区表修改如下示例:

# ESP-IDF Partition Table
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x4000,
otadata,  data, ota,     0xd000,  0x2000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000,  1M,
test_data,      data,        ,        ,  512k,

这个分区表最后一个512K的test_data分区就是我们要存放数据的区域,后面需要使用命令行将数据线刷到该分区

2.2 获取分区地址

# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,16K,
otadata,data,ota,0xd000,8K,
phy_init,data,phy,0xf000,4K,
factory,app,factory,0x10000,1M,
test_data,data,undefined,0x110000,512K,

首先编译一下固件,在编译信息中,我们可以看到test_data这个分区的起始地址,0x110000就是该分区的起始地址,也是我们后面需要使用线刷烧录文件的地址

当然,也可以使用手动计算的方式计算test_data的起始地址

2.3 分区内烧录文件

在vscode底部打开一个终端,连接开发板,在终端中输入

python -m esptool --chip esp32s3 --port COM6 --baud 921600 write_flash 0x110000 xxxxxx.bin

按下回车就可以将xxxxxx.bin文件烧录到该分区中

2.4 编码测试

我们在app_main中增加以下代码用来测试:

    const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "test_data");
    assert(partition != NULL);

    const void *map_ptr;
    esp_partition_mmap_handle_t map_handle;

    // Map the partition to data memory
    ESP_ERROR_CHECK(esp_partition_mmap(partition, 0, 512*1000, ESP_PARTITION_MMAP_DATA, &map_ptr, &map_handle));
    ESP_LOGI(TAG, "Mapped partition to data memory address %p", map_ptr);

    char read_data[128];
    memcpy(read_data, map_ptr, sizeof(read_data));

代码中,使用esp_partition_find_first寻找分区,前两个参数为分区类型,第三个参数为分区的名称

如果可以成功的找到这个分区,使用esp_partition_mmap映射此分区,包含6个传参,第三个参数为你希望映射多长的区域,map_ptr指针为映射成功后的数据指针

映射成功后,就可以使用map_ptr指针读该分区的内容了,请注意,mmap的分区只能读,不能写

3.结论

使用idf的分区映射功能,可以较为方便的读取flash中的静态资源,并且可以使用esp32的dcache进行加速,比用传统的spi_read更快,不仅如此,也可以节省掉可能存在的OTA静态资源的时间或者空间消耗。

标签:map,flash,映射,ESP,esp32,partition,内存,data,分区
From: https://www.cnblogs.com/shumei52/p/18610629

相关文章

  • 【蓝队】HW中盛行的Java内存马,如何全面检测?
    一、背景1.1Java内存马是什么?内存马是一种仅在内存中运行、没有文件落地的恶意程序,因此具有较强的隐蔽性,能够避开常规的基于文件系统的检测。Java内存马是针对Java语言的内存马,它利用Java语言的动态特性,如类加载机制、动态代理和反射技术等,在Java应用的内存中注入恶意代码,从而......
  • 解决|配置denoising diffusion bridge model环境|flash-att、openmpi、mpi4py安装问题
    目录安装flash-att安装openmpi和mpi4py我在配置DDBM(https://github.com/alexzhou907/DDBM/tree/main)环境时遇到的问题:1、flash-att安装失败2、openmpi和mpi4py安装失败以下是基于我的情况的解决办法安装flash-attflash-att(1)对CUDA版本有要求(2)pytorch版本需与flash-att版本有......
  • C# 探险之旅:第四十四节 - 栈(Stack)和堆(Heap):一场内存管理的喜剧
    嘿,勇敢的探险家们!欢迎来到C#探险之旅的第四十二节!今天,我们要揭开内存管理界最神秘的二人组——栈(Stack)和堆(Heap)的面纱。栈(Stack)和堆(Heap)——这两个神秘的内存区域,它们就像是你家里的两个储物空间:一个整齐有序的小抽屉,另一个是杂乱无章的大仓库。理解它们的区别和用途,可以帮助......
  • H7-TOOL自制Flash读写保护算法系列,为凌欧LKS32MC45x/MC05x/MC08x制作使能和解除算法,支
    说明:很多IC厂家仅发布了内部Flash算法文件,并没有提供读写保护算法文件,也就是选项字节算法文件,需要我们制作。实际上当前已经发布的TOOL版本,已经自制很多了,比如已经支持的兆易创新大部分型号,新唐的大部分型号等。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支......
  • 当前,inux中的内存页面调度算法
    用户:请详细介绍,目前linux中内存页面调度算法的相关信息讯飞星火:Linux内存页面调度算法是操作系统内存管理中的核心组件之一,它负责在有限的物理内存资源中高效地管理不同进程的页面,以减少页面置换的频率并提高系统性能。以下是对Linux内存页面调度算法的详细介绍:###1.概述Lin......
  • 学习下Redis内存模型
    作者:京东零售吴佳前言redis,对于一个java开发工程师来讲,其实算不得什么复杂新奇的技术,但可能也很少人去深入了解学习它的底层的一些东西。下面将通过对内存统计、内存划分、存储细节、对象类型&内部编码这四个模块来学习学习redis的内存模型,手字笔录,潜心修行。一、redis的内存......
  • 添加原生事件如果不移除为什么会内存泄露?
    在前端开发中,添加原生事件监听器后不移除可能会导致内存泄漏。这主要是因为事件监听器会占用内存,并且如果不手动移除,它们会一直存在,即使相关的DOM元素已经被销毁或不再需要。以下是几个关键点来解释为什么这会导致内存泄漏:持续占用内存:当给DOM元素添加事件监听器时,浏览器会为该......
  • 基于ESP32的桌面小屏幕实战[4]:硬件设计之PCB Layout
    1.PCBLayout步骤生成PCB确定PCBlayout规范绘制板框尺寸布局布局规范:按电气性能合理分区,一般分为:数字电路区(即怕干扰、又产生干扰)、模拟电路区(怕干扰)、功率驱动区(干扰源);完成同一功能的电路,应尽量靠近放置,并调整各元器件以保证连线最为简洁;对于质量大的元器......
  • 什么是内存泄漏?如何避免?
    内存泄漏(memoryleak)是指由于疏忽或错误造成了程序未能释放掉不再使⽤的内存的情况。内存泄漏并⾮指内存在物理上的消失,⽽是应⽤程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。可以使⽤Valgrind,mtrace进⾏内存泄漏检查。有什么类别?(1)堆内存......
  • Go 内存管理
    操作系统内存管理操作系统管理内存的存储单元是页(page),在linux中一般是4KB。而且,操作系统还会使用虚拟内存来管理内存,在用户程序中,我们看到的内存是不是真实的内存,而是虚拟内存。当访问或者修改内存的时候,操作系统会将虚拟内存映射到真实的内存中。申请内存的组件是PageTab......