求助:LittleFS第一次使用直接进入HardFaultHandler
本帖最后由 SUPER_CRJ 于 2022-9-12 11:32 编辑RT。
最终的问题:lfs_mount(&ofd_lfs,&ofd_cfg); 为什么会进入HardFault_Handler中。
尝试把堆栈放大,改ofd_cfg配置,而且之前也已开发很长时间了。里面的配置应该没什么问题!
具体情况如下:
这次比较恶心,之前已用LittleFS开发了一段时间,也没有发现问题。
批量的时候,下载程序,发现运行了一下,直接死机了。用之前开发板测试又没有问题。
最后定位问题是:
1:需要挂载文件系统: u32 err = lfs_mount(&ofd_lfs,&ofd_cfg); 这一句之后:直接死机了,问题是:KEIL中调试模式下,直接停下,但是不知道停在哪里了,不像之前代码,会停在:HardFault_Handler中。
2:为什么我判断停在:HardFault_Handler中,因为我写了个HardFault_Handler函数,在不进行调试模式,而是直接下载程序运行时候:运行的是HardFault_Handler里面程序。
3:还有一个不解地方:下载程序运行的时候,第一次时候:不是运行到HardFault_Handler中,需要再断电一次。这样根本查不到具体哪一句引起的问题。
解决的方法也行简单:
先格式化一下:lfs_format(&ofd_lfs, &ofd_cfg);,但是不能一上电就格式化,否则之前存储的文件就没有了。
官方给的例程就是:先挂载,如果再挂载失败,再格式化。但是问题是:挂载直接进入HardFault_Handler,进入死循环了。
u32 err = lfs_mount(&ofd_lfs,&ofd_cfg); // 挂载文件系统。
if( err ){
lfs_format(&ofd_lfs, &ofd_cfg);
lfs_mount(&ofd_lfs, &ofd_cfg);
}
进入死循环就麻烦了,晚点要批量生产,现在就是定位不了具体问题。
现在采用特殊的解决方法:在HardFault_Handler格式化文件系统。但是不是最终解决方案,只能临时用用而已。 这样,那还不如在MCU的内部Flah搞一个FLASH是否被format的标志呢
另外,是不是你FLASH(或SD)确实没有被格式化过的呢?
foxpro2005 发表于 2022-9-12 11:45
这样,那还不如在MCU的内部Flah搞一个FLASH是否被format的标志呢
另外,是不是你FLASH(或SD)确实没有被格 ...
(引用自2楼)
确实没格式化过。
但是看使用方法:尝试挂载,如果失败再格式化算是标准方法。
如果设置标志位,会有其他的问题需要考虑,万一文件系统失效,有那个标志位,还是会重复今天的问题。 不进到 mount 函数里边看看哪里触发了异常? t3486784401 发表于 2022-9-12 14:36
不进到 mount 函数里边看看哪里触发了异常?
(引用自4楼)
我上面说过了,特别奇怪,调试模式下直接停了,但是根本不知道停在哪里。和之前不一样。 本帖最后由 t3486784401 于 2022-9-12 15:32 编辑
SUPER_CRJ 发表于 2022-9-12 14:39
我上面说过了,特别奇怪,调试模式下直接停了,但是根本不知道停在哪里。和之前不一样。 ...
(引用自5楼)
我指 step into,好歹 littlefs 是开源的,确定 mount 出错了应该可以再展开的:
我记得要单字节对齐,你试下 对,大概率是因为字节对齐问题造成的
本帖最后由 pt2go 于 2022-9-20 22:20 编辑
一个可能是字节对齐问题,我的buf是int64对齐的,另外一种可能性就是堆载溢出了
另外可以用这个库跟踪一下,可以知道HardFault发生的原因 ,文件名,函数,行号
pt2go 发表于 2022-9-20 21:53
一个可能是字节对齐问题,我的buf是int64对齐的,另外一种可能性就是堆载溢出了
另外可以用这个库跟踪一 ...
(引用自9楼)
谢谢。
很专业。我试试。
下面三个数组之前一直都没有定义,直接使用的。参考的是官方DEMO。
想问下:下面三个数组不定义会怎么样?
.read_buffer
.prog_buffer
.lookahead_buffer
2:使用:uint64_t定义就可以保证64字节对齐吗?
3:为什么使用:static来定义变量,这个项目中不使用static没有问题吧。 pt2go 发表于 2022-9-20 21:53
一个可能是字节对齐问题,我的buf是int64对齐的,另外一种可能性就是堆载溢出了
另外可以用这个库跟踪一 ...
(引用自9楼)
实测,还是会同样的问题。
检查了多遍。
后期在根据实际情况进行检查。谢谢~ t3486784401 发表于 2022-9-12 15:04
我指 step into,好歹 littlefs 是开源的,确定 mount 出错了应该可以再展开的:
...
(引用自6楼)
谢谢大师指点。
想问下:没有实现printf函数,出现这样的现象合理吗?
刚刚STEP INFO查找找到原因了:
系统中没有实现:printf函数。把这个屏蔽就可以了。(主要是时间比较紧,想先跑通效果。但是也没有想到:移植也还要先实现这个:printf函数。)
#ifndef LFS_ERROR
#ifndef LFS_NO_ERROR
#define LFS_ERROR_(fmt, ...) \
printf("%s:%d:error: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__)
#define LFS_ERROR(...) LFS_ERROR_(__VA_ARGS__, "")
#else
#define LFS_ERROR(...)
#endif
#endif SUPER_CRJ 发表于 2022-9-21 16:07
谢谢大师指点。
想问下:没有实现printf函数,出现这样的现象合理吗?
刚刚STEP INFO查找找到原因了:
(引用自12楼)
有些编译器会链接空的 printf / putchar,确保至少不出错;
不过看来这个编译器直接没初始化,然后调用了野函数指针,结果自然啥可能都有。
页:
[1]