应用程序内存布局

ESP32芯片具有灵活的内存映射功能。本节介绍ESP-IDF在默认情况下如何使用这些功能。

ESP-IDF中的应用程序代码可以放置在以下内存区域之一中。

IRAM(指令RAM)

ESP-IDF 为指令RAM 分配内部SRAM0区域的一部分(在技术参考手册中定义)。除了用于PRO和APP CPU缓存的第一个64 kB块之外,其余的内存范围(即从0x400800000x400A0000)用于存储需要从RAM运行的应用程序部分。

使用链接描述文件将ESP-IDF的几个组件和WiFi堆栈的一部分放入该区域。

如果一些应用程序代码需要放入IRAM,可以使用IRAM_ATTRdefine 来完成:

#include“esp_attr.h”

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

以下是应用程序的部分可能被放置到IRAM中的情况。

  • 如果ESP_INTR_FLAG_IRAM在注册中断处理程序时使用中断处理程序,则必须将其置于IRAM中。在这种情况下,ISR只能调用放置在IRAM中的功能或ROM中存在的功能。注1:所有的FreeRTOS API都被放置到IRAM中,所以可以安全地从中断处理程序调用。如果将ISR置于IRAM中,ISR使用的所有常数数据和ISR(包括但不限于数组)调用的函数都必须放入DRAM中。const charDRAM_ATTR
  • 一些时序关键代码可以被放置到IRAM中以减少与从flash加载代码相关联的惩罚。ESP32通过32 kB缓存从闪存读取代码和数据。在某些情况下,将功能放置到IRAM中可能会减少由高速缓存未命中引起的延迟。

IROM(从Flash执行的代码)

如果功能未明确放置到IRAM或RTC内存中,则将其置于闪存中。技术参考手册中描述了使用Flash MMU来允许从闪存执行代码的机制。ESP-IDF从区域开始处放置从flash开始执行的代码。启动后,第二阶段引导加载程序初始化Flash MMU,将代码所在的闪存中的位置映射到该区域的开头。这一地区的访问中使用两个32kB的块透明缓存- 范围。0x400D0000 — 0x404000000x400700000x40080000

需要注意的是外面的代码区域可能不能到达与窗口ABI 如果指令,所以需要特别的照顾或区域被应用程序使用。默认情况下,ESP-IDF不使用这些区域。0x40000000 — 0x40400000CALLx0x40400000 — 0x408000000x40800000 — 0x40C00000

RTC快速记忆

从深度睡眠模式唤醒后必须运行的代码必须放置到RTC存储器中。请在深度睡眠文档中查看详细说明。

DRAM(数据RAM)

链接器将非常数静态数据和零初始化数据放入256 kB 区域。请注意,如果使用蓝牙堆栈,则该区域减少64kB(通过移位起始地址)。如果使用跟踪记忆,该区域的长度也减少16 kB或32kB。将静态数据放置在该区域后留下的所有空间用于运行时堆。0x3FFB0000 — 0x3FFF00000x3FFC0000

恒定数据也可以被放置到DRAM中,例如,如果它在ISR中使用(参见上面的IRAM部分中的注释)。要做到这一点,DRAM_ATTR可以使用定义:

DRAM_ATTR  const  char []  format_string  =  “%p %x ” ;
char 缓冲区[ 64 ];
sprintf (buffer , format_string , ptr , val );

不用说,不建议printf在ISR中使用和其他输出功能。为了调试目的,ESP_EARLY_LOGx在从ISR登录时使用宏。确保在这种情况下TAG将两个和格式的字符串放在DRAM一起。

DROM(数据存储在Flash中)

默认情况下,链接器将常量数据放入4 MB区域(),用于通过Flash MMU和缓存访问外部闪存。例外是编译器嵌入到应用程序代码中的文字常量。0x3F400000 — 0x3F800000

RTC缓慢记忆

从RTC存储器运行的代码使用的全局和静态变量(即深度休眠存根代码)必须放置到RTC慢速存储器中。请在深度睡眠文档中查看详细说明。

ESP32应用程序的内存布局的更多相关文章

  1. Anatomy of a Program in Memory.剖析程序的内存布局

    原文标题:Anatomy of a Program in Memory 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译 ...

  2. C语言程序的内存布局

    C语言程序的内存布局 一:C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 1.代码段( ...

  3. Linux 上 C 程序的内存布局

    在仔细研究这个问题之前,我认为 C 程序在内存中只有代码段,堆和栈三部分构成.前几天面试被问到了这个问题,才发现自己的印象是不完全的. 在本文中通过解析析一个 C 程序中变量和函数的地址来分析 C 程 ...

  4. c++内存布局与c程序的内存布局

    c/c++的内存布局:堆,栈,自由存储区(与堆的区别),全局/静态存储区,常量存储区(字符串常量,const常量) http://www.cnblogs.com/QG-whz/p/5060894.ht ...

  5. Linux下C程序的内存布局

    参考下列书籍中的对应章节: <Linux高级程序设计(第3版)>第3章Linux进程存储管理.相关视频:一.二. <C专家编程>第6章 运动的诗章:运行时数据结构. <U ...

  6. 【面经】【转】C程序的内存布局

    一个C语言程序一直以来都是由以下5个段组成: 1.代码段(text segmrnt):存放CPU执行的机器指令,通常情况下,代码段是可共享的,使其可共享的目的是对于频繁被执行的程序,只需要在没存中有有 ...

  7. C程序的内存布局

     1.代码段(code或text): 通常是指用来存放程序执行代码的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读. 某些架构也允许代码段为可写,即允许修改程序.在代码 ...

  8. linux下C/C++程序的内存布局

    内核空间和用户空间: 我们在编写程序时使用的内存空间叫虚拟内存,程序在运行时,要完成虚拟内存到物理内存的转换.假如在32位环境上,理论上我们可以使用的虚拟内存空间是4GB,但实际上这4GB并不能完全给 ...

  9. 一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)

    各位看官们,大家好.上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧. 看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了 ...

随机推荐

  1. 给定一个十进制数,将其转化为N进制数-----17年滴滴笔试题

    题目:给定一个十进制数M,将其转化为N进制数,其中2<=N<=16,其中N为32为整型数; 输入:M N,如7 2 输出转化结果:111 注意点:考虑负数的情况,记得添加负号(其实直接添加 ...

  2. linux一些基本常识(三)

    acl:对本身权限的扩展    打包:zip 111.zip a.txt b.txt.....    zip -r /etc/sysconfig/* (样才能第归所有内容0)    解宝:uzip 1 ...

  3. spring boot 配置 freemarker

    1.springboot 中自带的页面渲染工具为thymeleaf 还有freemarker 这两种模板引擎 简单比较下两者不同, 1.1freemaker 优点 freemarker 不足:thym ...

  4. myeclipse 10激活,本人已测试过可行

    激活步骤: 下载myeclipse 10硬解程序包: ed2k://|file|%5Bmyeclipse.10.0.%E6%9B%B4%E6%96%B0%E5%8F%91%E5%B8%83%28%E7 ...

  5. unix架构

    UNIX Kernel(UNIX内核):指挥机器的运行,控制计算机的资源 UNIX Shell(UNIX外壳):是UNIX内核和用户的接口,是UNXI的命令解释器.目前常用的Shell有3种 Bour ...

  6. django的视图函数介绍

    我们来看下views视图中的函数的request这个变量到底有哪些方法和属性 1.request.path 结果:不包括域名和端口的url路径 2.request.method 结果:这次请求的方法, ...

  7. php session阻塞页面分析及优化 (session_write_close session_commit使用)

    转: http://www.tuicool.com/articles/bqeeey 首先看下下面代码, session1.php 文件 <?php ini_set('session.save_p ...

  8. Linux下使用openssl生成证书

    利用OpenSSL生成库和命令程序,在生成的命令程序中包括对加/解密算法的测试,openssl程序,ca程序.利用openssl,ca可生成用于C/S模式的证书文件以及CA文件. 参考:http:// ...

  9. c++ 中的符号与关键字

    符号按照符号的ASC码数值从小到达排列,关键字按照英文字母排序. & [38] 位运算:取地址:左值引用[指针.引用都是可以做类型转换的] #include <iostream> ...

  10. Debian9开机运行Python脚本

    吾星喵 关注 2018.04.14 15:30 字数 214 阅读 202评论 0喜欢 1 Debian9开机运行Python脚本 Debian 9.x "stretch" 解决 ...