完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在 ESP32-S3 N8R2 (ESP32-S3-WROOM-1) 上开发一个应用程序,它从一个 SPI 连接的设备中提取 500+ KB/s 的数据,将其压缩到大约 150 KB/s,并将其存储在一个SD 卡,并一次读回文件以将内容流式传输到 http 服务器。
我有一个问题,其中 sdmmc 驱动程序在读取卡时每秒进行数百个单独的 one-sd-card-block 动态分配。有时,因为我在运行时可用的 33 kB 可用系统内存紧张,这会导致驱动程序分配失败,然后崩溃。我可以恢复,但我会丢失写入 SD 卡文件的数据,因为它无法正确关闭,因此信息不会写入 FAT。这是不可接受的,即使系统的其余部分没有崩溃。 一些上下文: 为了让事情按时运行并避免偶尔等待 malloc,我尝试在启动时尽可能多地静态分配一次。由于优化了 wifi 传输速度并将某些功能(例如 SPI 主功能)放在 IRAM 而不是闪存中,我几乎没有可用的可用 RAM,但我没有在我的应用程序中进行动态分配调用(我可以控制)。 剩余可用堆内存在运行时约为 33 kB。我每 8 秒监测一次这个值,虽然它会轻微波动几 kB,但随着时间的推移它会保持稳定,但只有在我刚写入 SD 卡时(而不是在读/写时)。 我在 ESP-IDF 中的 sdmmc 驱动程序有问题:这个驱动程序调用 malloc 来动态分配大小 [一个 SD 卡块](或512 字节在我的例子中)当从 SD 卡读取时要写入的输入内存与 DMA 不兼容。写入SD卡的调用次数很少,不会造成任何问题,但是读取SD卡时有很多很多这样的调用。SD 卡时不时地决定做一些内务处理(可能是页面擦除),当这种情况发生时,调用堆积并且可用堆会显着减少,以至于有时 sdmmc 驱动程序的分配调用失败,驱动程序崩溃,我丢失数据(例如,文件未正确关闭,所以即使我可以从我的应用程序无法接受的错误中恢复)。 从 SD 卡读取时,是否有可能知道这个驱动程序请求如此多的单块内存分配(以及我是否可以为此分配一个静态的、与 DMA 兼容的地址?)的背后发生了什么?我们正在谈论数百个电话。 附加信息: 我没有可用的调试器,但我深入研究了驱动程序代码,并且由于在 sdmmc_cmd.c 中使用不支持 DMA 的内存地址执行 sdmmc_read_sectors,我设法隔离了调用写入(从 SD 卡)。 我在我的程序的很大一部分中使用了 SPIRAM,但特别阻止了普通系统使用 malloc 在 SPIRAM 中分配内存,我知道这在 sdk 配置中与 DMA 不兼容。 我在程序中使用的读取/写入 SD 卡的调用都使用相同的静态分配的 DMA 兼容缓冲区 (64 kB)。我要么写入 SD 卡,要么从 SD 卡读取,所以我在同一个线程函数中依次使用相同的 64 kB 缓冲区,所以我保证不能同时从两个地方访问缓冲区。对于线程间通信,我通过队列将指向更大 SPIRAM 缓冲区的地址传递给其他线程——效果很好,我在那里没有任何问题。 我想知道如何减少/消除 sdmmc 驱动程序传递这些 DMA 不兼容地址的情况。打印出有问题的地址让我确定地址在运行时永远不会改变,目前它是与 SD 卡写入相关的 0x3dfe0bc8(每 5 秒左右快速连续调用 3 次,这不是问题),以及与 SD 卡读取相关的 0x3dfe23fc(每秒数百次调用,如果我打印语句,我会使控制台过载)。 我可以很容易地在没有 SD 卡读取(只是写入)的情况下进行测试,但不能反过来做同样的事情。当只写 SD 卡时,一切都很顺利。当同时进行写入和读取时,我会在启动系统(主动从 SPI 连接设备传输数据)后的几到大约 10 分钟内崩溃。 请告知,很乐意提供更多详细信息。我附上了我的程序中使用 sdmmc 驱动程序的部分。我知道它不会通过生产测试,因为我使用的是 esp_vfs_fat_sdmmc_mount() 而不是通过正确的步骤来设置 SD 卡。到目前为止,它对我来说效果很好,如果我的问题与使用该功能有关,请告诉我。 |
|
相关推荐
3个回答
|
|
弄错了动态分配块的大小。一个 SD 卡块实际上是512 字节,而不是原始帖子中的 32。
|
|
|
|
值得一提的是,我设法通过简单地将运行时可用系统 RAM 的数量从 33 kB 增加到大约 50 kB 来让它工作——减少我应用程序中其他线程的一些静态分配。从那以后,我再也没有发生过崩溃。读取和写入 SD 卡时,空闲堆的数量有时会下降到 20 kB,但之后总是会恢复到 50 kB(有时会超过几秒钟)。仅写入 SD 卡时不会发生这种大小的波动(只有几 kB,我已经能够观察到)。
|
|
|
|
如果这是有意为之的行为,那么在与 ESP32 接口的 SD 卡文档中包含一条注释会很有用,即驱动程序在从 SD 卡读取数据时需要约 30 kB 的空闲堆才能运行。
|
|
|
|
只有小组成员才能发言,加入小组>>
145个成员聚集在这个小组
加入小组536浏览 6评论
449浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
432浏览 5评论
430浏览 4评论
404浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 09:31 , Processed in 0.640777 second(s), Total 48, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号