dfs_mkfs 报错,ENOMEM
\ | /
- RT - Thread Operating System
/ | \ 3.1.5 build Jul 15 2022
2006 - 2020 Copyright by rt-thread team
spi10 attach to spi1 donespi device attach result = 0
spi1 init done
[I/SFUD] Find a Winbond flash chip. Size is 16777216 bytes.
[I/SFUD] w25q128 flash device is initialize success.
[I/SFUD] Probe SPI flash w25q128 by SPI device spi10 success.
use rt_spi_send_then_recv() read w25q ID is: 0x17ef
use rt_spi_send_then_recv() read w25q JEDEC ID is: 0xef601800
use rt_spi_transfer_message() read w25q ID is: 0x17ef
use rt_spi_transfer_message() read w25q JEDEC ID is: 0xef601800
No Filesystem: -1!
sorry, there is no mem to do mkfs: -19!
dfs mkfs err: -19
Write string BEIJING, July 5 (Xinhua) -- Chinese President Xi Jinping on Tuesday sent a congratulatory message to President of
msh />
主函数:
/* 挂载 elm 文件系统到 / 目录,如果你所使用的开发板没有文件系统也可以跳过这一步 */
res = dfs_mount(EXAMPLES_SPI_CHIP_NAME, "/", EXAMPLES_SPI_FS_NAME, 0, 0);
if (res == 0)
{
rt_kprintf("Filesystem initialized!\r\n");
}
else
{
rt_kprintf("No Filesystem: %d!\r\n", res);
/* 如果挂载失败,则尝试在文件系统分区重新创建文件系统 */
res = dfs_mkfs(EXAMPLES_SPI_FS_NAME, EXAMPLES_SPI_CHIP_NAME);
if(res == 0)
{
rt_kprintf("dfs mkfs succ\r\n");
/* 尝试重新挂载文件系统 */
if (dfs_mount(EXAMPLES_SPI_CHIP_NAME, "/", EXAMPLES_SPI_FS_NAME, 0, 0) == 0)
{
/* 仍然挂载文件系统失败,请自行检查失败原因 */
rt_kprintf("Failed to initialize filesystem!\r\n");
}
}
else
{
rt_kprintf("dfs mkfs err: %d\r\n", res);
}
}
rt_kprintf("Write string %s to test.txt.\r\n", Tx_Buffer);
debug发现错误出现位置在dfs_elm.c 236行 malloc失败。如图:
debug查看初始化Heap空间大小,如图:
15k heap空间不够RT-Thread + DFS使用吗?
我去掉了长文件名支持后,就可以打开个文件,读写数据了。
我改回长文件名支持,依然是失败的。free命令,显示malloc空间确实很大,不清楚是哪里使用的。日志如下:
你的测试结果是开启长文件名就在
rt_malloc(sizeof(FATFS));
的时候报错。不开启长文件名就正常?那就有点奇怪的。如果一直是在这里报错,就暂时不用考虑其它地方。开启不开启长文件名,这里开辟的空间只多了2字节的文件名指针。你在你出错后加的rt_kprintf里面可以打印一下sizeof(FATFS)
,看看具体多大。里面除了要开辟一个和扇区大小一致的扇区缓存外,其它的都是单个变量。SPIflash的话扇区应该是4096的。感觉这里开辟的空间应该也就4K多一点点。阶段1:最开始是dfs_mkfs里失败,就是那个malloc那里。
阶段2:后来我关闭了长文件名支持,关闭了目录支持,关闭了俩串口。就正常了,可以读写文件。
阶段3:阶段2操作后,spi flash上有了文件系统。如果再次支持长文件名,打开目录支持,打开关闭的串口2 串口3,主程序open file会失败在:dfs_file.c 96行
if ((result = fd->fops->open(fd)) < 0)
感觉还是内存不够导致的open失败。
阶段4:在阶段3上关闭finsh,读写也是正常的。
请问,怎么看heap使用的情况?@吉利咕噜2022
一般来说,就是用free命令哈,你倒是可以开启和关闭不同功能,用free看一下堆使用情况。对比不同组件需求开辟内存的大小。你是用的哪款芯片啊,为啥内存这么小。内存太小的芯片确实不太适合跑太复杂的系统,你只能看着裁剪裁剪各组件了,尽量用轻量级的。太复杂的功能只能关闭了。