SUPER_CRJ 发表于 2022-9-12 11:30:51

求助: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格式化文件系统。但是不是最终解决方案,只能临时用用而已。

foxpro2005 发表于 2022-9-12 11:45:25

这样,那还不如在MCU的内部Flah搞一个FLASH是否被format的标志呢
另外,是不是你FLASH(或SD)确实没有被格式化过的呢?

SUPER_CRJ 发表于 2022-9-12 11:52:48

foxpro2005 发表于 2022-9-12 11:45
这样,那还不如在MCU的内部Flah搞一个FLASH是否被format的标志呢
另外,是不是你FLASH(或SD)确实没有被格 ...
(引用自2楼)

确实没格式化过。
但是看使用方法:尝试挂载,如果失败再格式化算是标准方法。
如果设置标志位,会有其他的问题需要考虑,万一文件系统失效,有那个标志位,还是会重复今天的问题。

t3486784401 发表于 2022-9-12 14:36:51

不进到 mount 函数里边看看哪里触发了异常?

SUPER_CRJ 发表于 2022-9-12 14:39:01

t3486784401 发表于 2022-9-12 14:36
不进到 mount 函数里边看看哪里触发了异常?
(引用自4楼)

我上面说过了,特别奇怪,调试模式下直接停了,但是根本不知道停在哪里。和之前不一样。

t3486784401 发表于 2022-9-12 15:04:03

本帖最后由 t3486784401 于 2022-9-12 15:32 编辑

SUPER_CRJ 发表于 2022-9-12 14:39
我上面说过了,特别奇怪,调试模式下直接停了,但是根本不知道停在哪里。和之前不一样。 ...
(引用自5楼)

我指 step into,好歹 littlefs 是开源的,确定 mount 出错了应该可以再展开的:

vtte 发表于 2022-9-12 16:56:34

我记得要单字节对齐,你试下

foxpro2005 发表于 2022-9-12 20:48:26

对,大概率是因为字节对齐问题造成的

pt2go 发表于 2022-9-20 21:53:03

本帖最后由 pt2go 于 2022-9-20 22:20 编辑


一个可能是字节对齐问题,我的buf是int64对齐的,另外一种可能性就是堆载溢出了

另外可以用这个库跟踪一下,可以知道HardFault发生的原因 ,文件名,函数,行号

SUPER_CRJ 发表于 2022-9-21 15:11:47

pt2go 发表于 2022-9-20 21:53
一个可能是字节对齐问题,我的buf是int64对齐的,另外一种可能性就是堆载溢出了

另外可以用这个库跟踪一 ...
(引用自9楼)

谢谢。
很专业。我试试。
下面三个数组之前一直都没有定义,直接使用的。参考的是官方DEMO。
想问下:下面三个数组不定义会怎么样?
.read_buffer
.prog_buffer
.lookahead_buffer

2:使用:uint64_t定义就可以保证64字节对齐吗?
3:为什么使用:static来定义变量,这个项目中不使用static没有问题吧。

SUPER_CRJ 发表于 2022-9-21 15:47:29

pt2go 发表于 2022-9-20 21:53
一个可能是字节对齐问题,我的buf是int64对齐的,另外一种可能性就是堆载溢出了

另外可以用这个库跟踪一 ...
(引用自9楼)

实测,还是会同样的问题。
检查了多遍。
后期在根据实际情况进行检查。谢谢~

SUPER_CRJ 发表于 2022-9-21 16:07:10

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

t3486784401 发表于 2022-9-21 16:53:26

SUPER_CRJ 发表于 2022-9-21 16:07
谢谢大师指点。
想问下:没有实现printf函数,出现这样的现象合理吗?
刚刚STEP INFO查找找到原因了:
(引用自12楼)

有些编译器会链接空的 printf / putchar,确保至少不出错;
不过看来这个编译器直接没初始化,然后调用了野函数指针,结果自然啥可能都有。
页: [1]
查看完整版本: 求助:LittleFS第一次使用直接进入HardFaultHandler