首页/新闻资讯/正文详情

第 10 章 内存与 PSRAM:存储器的原理与程序的内存布局

发布时间:2026/9/25 6:00:46 来源:云帆数科 栏目:资讯中心
第 10 章 内存与 PSRAM:存储器的原理与程序的内存布局
本章从元件原理讲起SRAM/Flash/PSRAM 各自是什么器件、为什么断电后一个会忘一个不会忘程序各段text/data/bss在启动时如何装载栈和堆的运作机制以及本板 PSRAM 的配置与使用。10.1 三类存储器的器件原理SRAM用触发器记住 1 位SRAM 的一个存储单元由几个晶体管组成触发器flip-flop两个交叉相连的开关稳定在一个开一个关两种状态 → 记住 0/1通电就稳定记住断电立即丢失没有能量维持状态。特点快随机访问——想读第 N 格就直接读第 N 格不用像磁带那样从头找但贵、费电每比特 6 个晶体管左右。Flash用浮栅晶体管记住 1 位Flash 单元是一个特殊晶体管栅极里藏着一块浮栅写 1高压把电子注入浮栅电子被关在里面读浮栅里有电子 → 管子阈值变高 → 读出 0/1阈值刚好能把管子打开所需的最低电压像考试的及格线断电后电子还困在浮栅里→ 掉电不丢✅特点慢写入要擦除整块、寿命有限约 10 万次擦写、只能擦块写页不能随意改一个字节。PSRAM把 DRAM 做成伪 SRAM真正的 DRAM 每比特 1 个晶体管 电容靠电容存电荷要周期性地刷新refreshing保持PSRAM Pseudo SRAM内部把刷新做进芯片对外看起来像 SRAM接口简单实际底层是 DRAM 的密度。一句话记住SRAM触发器掉电忘Flash浮栅掉电记PSRAM伪装的 DRAM掉电忘容量大。10.2 本板存储规格存储容量接口/速度用途内置 SRAM512KB内部总线程序运行主场地外置 Flash16MBSPI80MHz程序和常量外置 PSRAM8MBOctal 8 线80MHz大数据仓库8MB PSRAM 用Octal8 根数据线并行模式比 4 线Quad快一倍PSRAM 占用 GPIO33~37 时钟/片选等——这些引脚专用别用Flash 占用 GPIO 26~32Quad 数据线——同样专用。10.3 程序段的装载启动时发生什么第 5 章讲过段这里补装载细节段内容存放启动时.text指令Flash直接执行或映射到地址空间.rodata常量Flash直接访问.data有初值变量初值在 Flash复制初值到 SRAM.bss无初值变量无清零启动代码crt0在app_main前做复制 .data → 清零 .bss → 设栈/堆。推论const char *TAG l298n;的字符串在 .rodataFlash工程里的完整写法是static constexpr const char *TAG第 8 章逐字块里就是——这里只是简化书写static int s_active_instances 0;在 .bssSRAM清零——它正是第 8 章定义、第 12 章 12.5 双电机实战里最后一个实例才卸载fade 服务的那个实例计数器int x 5;的初值 5 占 Flash。中断服务函数要求快和低延迟所以常用IRAM_ATTR放进指令 RAM不从 Flash 取指令——第 15 章。10.4 栈Stack和堆Heap的机制栈函数调用自动用由SP栈指针管理从高地址向低地址生长函数进入压入返回地址 局部变量返回弹出后进先出栈溢出压过头超出栈区→ 覆盖其他数据 → 崩溃或静默出错。FreeRTOS 的每个任务都有自己的栈设多大、用uxTaskGetStackHighWaterMark查剩余水位、溢出时怎么排查——第 13 章。堆程序员主动申请malloc(size)在堆区找一块空闲登记占用返回地址free(ptr)标记空闲泄漏malloc 了忘了 free → 堆逐渐耗尽 → 大 malloc 失败。ESP-IDF 里malloc默认先试 SRAM 堆大块自动用 PSRAMCONFIG_SPIRAM_USE_MALLOCy——这就是8MB 仓库怎么用上的默认通道。两个细节①CONFIG_SPIRAM_USE_MALLOC在你打开CONFIG_SPIRAMy后默认就是开的不用额外操作②大块有个门槛——CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL默认 16KB小于这个尺寸的分配会优先留在内部 SRAM大于它的 malloc 才会自动落到 PSRAM。所以申请几 KB 的小对象照样占 SRAM别奇怪。10.5 内存映射所有东西都在一张地址表里芯片把 Flash/SRAM/外设寄存器统一编址第 0 章外设寄存器GPIO/LEDC 等在特定地址区——写这些地址控制硬件崩溃时EXCVADDR是地址 → 结合映射表能猜出访问了什么东西第 11 章。地址 内容 0x3C00_0000 PSRAM外挂大仓库 0x3FC8_0000 内置 SRAM草稿纸 0x4200_0000 Flash代码指令区 0x6000_0000 外设寄存器旋钮们这几个地址只是每类区域挑一个代表的节选示意真实映射要宽得多、分区也多得多精确数值以 ESP32-S3 技术参考手册TRM的地址映射章节为准。10.6 PSRAM 的三种使用方式自动默认CONFIG_SPIRAM_USE_MALLOCymalloc 大块自动落到 PSRAM——零成本本书默认手动指定heap_caps_malloc(bytes, MALLOC_CAP_SPIRAM)明确只要 PSRAM直接地址访问用链接脚本符号拿 PSRAM 起始地址不推荐。启动日志确认 PSRAM 就绪I (147) octal_psram: Found 8MB PSRAM device I (693) esp_psram: Adding pool of 8192K of PSRAM memory to heap allocator【动手框】① 在哪执行l298n 工程根目录IDF 终端跑过 export 的那个窗口2.3② 敲什么idf.py -p COM3 flash monitorCOM3 换成你的实际端口③ 预期看到开机滚动的日志里有上面那两行——octal_psram和esp_psram各一行括号里的毫秒数你的会不一样无关紧要。看到它们才可以说8MB 仓库已经并入 malloc 池这句话是真的④ 没看到找不到octal_psram行 → 对照 10.7 检查三项配置若你改的是sdkconfig.defaults它不会自动覆盖已有的sdkconfig——先idf.py fullclean再重新构建fullclean 只删 build 目录源码无损但旧的 .elf 也一起没了参考 11.9 的备份提醒flash 报端口被占用 → 多半是另一个窗口还开着 monitor关掉再试第 2 章烧录一节讲过flash 一直等待连接 → 手动进下载模式按住 BOOT → 点按 EN →松开 BOOT第 2 章三步。10.7 本项目配置与 sdkconfig 对应下面是工程sdkconfig.defaults里真实的 PSRAM 段逐字含注释。注意它是三项配置第一项CONFIG_SPIRAMy是总开关漏了它后两项都是空谈# ---------- PSRAM ---------- # R8 8MB 八线 PSRAM。八线模式对时序敏感80MHz 是稳的选择 # 120MHz 在 Octal 下属于实验特性温度漂移约 20 度就可能随机崩溃。 CONFIG_SPIRAMy CONFIG_SPIRAM_MODE_OCTy CONFIG_SPIRAM_SPEED_80My配置全名陷阱见第 3 章 3.6defaults 里必须写_80M全名。10.8 常见问题速查现象原因解决heap exhaustedSRAM 堆耗尽大块用 PSRAM / 检查泄漏启动没发现 PSRAMSPIRAM 配置没开/模式错检查三项配置无规律崩溃栈溢出第 13 章给具体改法暂时规避减小局部数组内存越用越少泄漏malloc/free 配对检查10.9 想一想 小测验想一想Flash 为什么掉电不丢PSRAM 为什么掉电就丢static int n 0;放哪个段const char *s hi;的字符串放哪大数组1MB放哪最合适小测验SRAM 用哪种器件记住 1 位A. 触发器 B. 浮栅 C. 电容刷新本板 PSRAM 容量A. 512KB B. 8MB C. 16MBmalloc 借了不还叫什么A. 溢出 B. 泄漏 C. 碎片PSRAM 占用的 GPIO 范围是A. 33~37 B. 1~10 C. 40~4510.10 本章总结SRAM触发器快、掉电忘、Flash浮栅慢、掉电记、PSRAM伪 DRAM大、掉电忘启动时.data 复制初值、.bss 清零栈函数自动用后进先出、堆malloc/free借了要还本板 8MB Octal PSRAM 默认自动并入 malloc 池。下一章优化和调试——固件怎么变小、崩溃怎么定位。

相关推荐

Simple Live完整指南:把4大直播平台装进1个跨平台看直播应用
Simple Live完整指南:把4大直播平台装进1个跨平台看直播应用

Simple Live完整指南:把4大直播平台装进1个跨平台看直播应用 【免费下载链接】dart_simple_live 简简单单的看直播 项目地址: https://gitcode.com/GitHub_Trending/da/dart_simple_live 打开应用,你看到的不是某个平台的登录页,而是顶… · 2026/9/25 6:00:40

什么是文件「魔数」?从is-png-cj看懂PNG文件签名识别原理入门
什么是文件「魔数」?从is-png-cj看懂PNG文件签名识别原理入门

什么是文件「魔数」?从is-png-cj看懂PNG文件签名识别原理入门 【免费下载链接】is-png-cj 一个判断图片格式的库,根据图片的文件数据,判断图片是否为png格式 项目地址: https://gitcode.com/Cangjie-TPC/is-png-cj is-png-cj 是一个用… · 2026/9/25 6:00:40

Oracle 19c时区补丁p31335037:TZV35升级与跨时区合规实践
Oracle 19c时区补丁p31335037:TZV35升级与跨时区合规实践

简介:本资源是Oracle Database 19c(19.0.0.0.190416DBRU)专用的时区版本35补丁包,专为解决ORA-39405错误及TSTZ时区版本不匹配问题设计,适用于已部署Oracle 19.3版本、需升级至Timezone File v35的DBA与数据库运维人员… · 2026/9/25 6:00:40

Docker安装(idea上安装)
Docker安装(idea上安装)

1、需要一个全新的操作系统,然后使用yum安装docker yum install -y docker 2、使用docker version查看是否安装成功,如下图则成功。(我这个是配置证书后的) 3、重启docker或开机自启。 systemctl start docker systemctl enable… · 2026/9/25 6:59:08

treg:多CLI多MCP多模型Agent编排工具链实战指南
treg:多CLI多MCP多模型Agent编排工具链实战指南

1. 从"treg"这个标题说起:一个被低估的CLI Agent工具链第一次看到"treg"这个词,很多人会以为是某个拼写错误,或者某个小众库的缩写。但如果你最近在折腾 AI Agent 的本地开发环境,尤其是围绕 OpenRouter、MCP… · 2026/9/25 6:59:08

光子晶体线缺陷波导能带计算:COMSOL建模仿真与实操
光子晶体线缺陷波导能带计算:COMSOL建模仿真与实操

拿光子晶体线缺陷波导做仿真,最容易遇到的一个现象是:打开COMSOL,能带图也画出来了,但自己心里并不踏实——不知道算出来的模式是波导模式还是边界引入的杂散模式,不知道k点扫得对不对,也不知道“线缺陷”到… · 2026/9/25 6:59:08

磁悬浮定位系统悬浮力全解析计算:从椭圆积分到参数灵敏度分析
磁悬浮定位系统悬浮力全解析计算:从椭圆积分到参数灵敏度分析

上个月我在Research Square挂出一篇预印本,核心是磁悬浮定位系统里永磁体与线圈之间悬浮力的全解析计算方法。说白了,这套方法想解决一个很实际的问题:设计初期要反复扫描磁体尺寸、线圈匝数、气隙等工作参数,但每改一个参数都跑有… · 2026/9/25 6:59:08

07-U-Boot架构与启动流程全景
07-U-Boot架构与启动流程全景

前面几章把 SDK 的全貌、交叉工具链、编译流程都过了一遍,从这一章开始正式进入 U-Boot 阶段。U-Boot 是整个启动链上承上启下的一环–上接芯片内部的 BootROM,下接 Linux 内核,它要是跑不起来,后面内核、根文件系统全部免谈。这一章先不钻源码细节,而是站在高处把 U-Boot 的架… · 2026/9/25 6:59:08

网页数据抓取与分析智能体 Trae 平台部署全纪实:TaoToken 统一 Key 接入与 config.toml 配置验证
网页数据抓取与分析智能体 Trae 平台部署全纪实:TaoToken 统一 Key 接入与 config.toml 配置验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:58:56

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码