ESP32系列--存储器类型和XIP特性

一、目的

        当我们通过ESP-IDF开发ESP32时,可能会遇到类似这样的场景需要对某个函数的执行速度进行优化例如中断执行函数需要快入快出,那么应该怎么做呢,ESP-IDF里面有没有提供这样的方法或者机制呢?

        按照常识我们总认为内部SRAM的读写速度一般是最快的(有些芯片内部还有TCM--紧凑内存,可以认为是和CPU同频的内存),那么我们将代码放置到内部SRAM中就可以加快函数的执行。

       鉴于此我们需要对ESP32的存储器类型做个全面介绍,。以帮助大家对代码段、数据段、BSS的地址分配有个系统了解。

二、介绍

        参考资料

Memory Types - ESP32-S3 - — ESP-IDF Programming Guide latest documentationhttps://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-guides/memory-types.html

        在讲解内部映射之前,我们需要知道下面几个基本概念:

  • code 代码段
  • rw data 读写段
  • ro data  只读数据段
  • bss 未初始化的或者数值为0的全局变量                

        在我们最终的image中,占用的Flash大小为code + rw data,占用的ram大小为rw data + bss段。

        下面我们介绍一些ESP-IDF中的内存映射以及各个段的特征  

        IRAM

        可以用于执行代码的RAM区域,ESP-IDF编译链接时默认代码的存放和执行都是在IROM(即Flash);通过MMU和指令Cache进行映射和执行加速。

        因为Flash的读取相比IRAM的读写较慢,当需要优化代码执行速度时,可以考虑将代码放置到IRAM中;在ESP-IDF的驱动代码中,如果指定中断Flags设置为ESP_INTR_FLAG_IRAM时,中断函数就必须放置到IRAM中。

        通过IRAM_ATTR宏定义来指定代码段的位置

#include "esp_attr.h"

void IRAM_ATTR gpio_isr_handler(void* arg)
{
        // ...
}

        IROM

        用于存放代码或者执行代码的区域,即Flash地址空间;一般情况下代码和只读数据都是存放在Flash中,程序运行时XIP;由于SRAM有限,大部分情况下我们自己的代码尽量都放置在此区域


        DROM

        用于存放只读数据(即只读数据也放置在Flash中)


        DRAM

        用于存放初始化的全局变量(RW段)和未初始化的全局变量(BSS段);链接器会将此区域定向到芯片内部的SRAM,其剩余空间用于Heap分配;

        RW、BSS段一般都是存放在内部SRAM,但是BSS也可以放置在外部SRAM中。

        这边有个概念RW段执行的时候在SRAM,但是RW的数据是要先保存在Flash中(加载视图与执行视图的区别)

        通过EXT_RAM_BSS_ATTR宏定义可以将BSS段放置在外置在外部SRAM,需要在menuconfig中配置如下选项(高亮处)

        

         注意此选项也会将一些组件的bss段放置在外部SRAM中

        DRAM的空间大小受限于IRAM的使用,IRAM使用越多,DRAM就越少,Heap的大小也就更少。

        只读数据也通过DRAM_ATTR宏将数据放置到DRAM中(不建议,但是有些场景必须要这样做)

        指令Memory是可以执行的,且只能4字节对齐读写;数据Memory不可执行,可以单字节读写


        低功耗模式下使用的代码段和数据段

        Fast RTC

        用于低功耗代码的执行

        Slow RTC RAM

        放置在此区域的全局变量和静态变量可以被Fast RTC中的代码访问,通过RTC_NOINIT_ATTR宏定义来实现。

        DMA

        必须放置在内部SRAM中

void app_main()
{
    uint8_t stuff;
    WORD_ALIGNED_ATTR uint8_t buffer[] = "I want to send something";   //or the buffer will be placed right after stuff.
    // initialization code...
    spi_transaction_t temp = {
        .tx_buffer = buffer,
        .length = 8 * sizeof(buffer),
    };
    spi_device_transmit(spi, &temp);
    // other stuff
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值