搜索
bottom↓
回复: 12

求助:LittleFS第一次使用直接进入HardFaultHandler

[复制链接]

出590入992汤圆

发表于 2022-9-12 11:30:51 | 显示全部楼层 |阅读模式
本帖最后由 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格式化文件系统。但是不是最终解决方案,只能临时用用而已。

出0入76汤圆

发表于 2022-9-12 11:45:25 | 显示全部楼层
这样,那还不如在MCU的内部Flah搞一个FLASH是否被format的标志呢
另外,是不是你FLASH(或SD)确实没有被格式化过的呢?

出590入992汤圆

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

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

出200入2554汤圆

发表于 2022-9-12 14:36:51 来自手机 | 显示全部楼层
不进到 mount 函数里边看看哪里触发了异常?

出590入992汤圆

 楼主| 发表于 2022-9-12 14:39:01 来自手机 | 显示全部楼层
t3486784401 发表于 2022-9-12 14:36
不进到 mount 函数里边看看哪里触发了异常?
(引用自4楼)

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

出200入2554汤圆

发表于 2022-9-12 15:04:03 来自手机 | 显示全部楼层
本帖最后由 t3486784401 于 2022-9-12 15:32 编辑
SUPER_CRJ 发表于 2022-9-12 14:39
我上面说过了,特别奇怪,调试模式下直接停了,但是根本不知道停在哪里。和之前不一样。 ...
(引用自5楼)


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入33汤圆

发表于 2022-9-12 16:56:34 来自手机 | 显示全部楼层
我记得要单字节对齐,你试下

出0入76汤圆

发表于 2022-9-12 20:48:26 | 显示全部楼层
对,大概率是因为字节对齐问题造成的

出0入0汤圆

发表于 2022-9-20 21:53:03 | 显示全部楼层
本帖最后由 pt2go 于 2022-9-20 22:20 编辑


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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出590入992汤圆

 楼主| 发表于 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没有问题吧。

出590入992汤圆

 楼主| 发表于 2022-9-21 15:47:29 | 显示全部楼层
pt2go 发表于 2022-9-20 21:53
一个可能是字节对齐问题,我的buf是int64对齐的,另外一种可能性就是堆载溢出了

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

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

出590入992汤圆

 楼主| 发表于 2022-9-21 16:07:10 | 显示全部楼层
t3486784401 发表于 2022-9-12 15:04
我指 step into,好歹 littlefs 是开源的,确定 mount 出错了应该可以再展开的:

...
(引用自6楼)

谢谢大师指点。
想问下:没有实现printf函数,出现这样的现象合理吗?
刚刚STEP INFO查找找到原因了:
系统中没有实现:printf函数。把这个屏蔽就可以了。(主要是时间比较紧,想先跑通效果。但是也没有想到:移植也还要先实现这个:printf函数。)

  1. #ifndef LFS_ERROR
  2. #ifndef LFS_NO_ERROR
  3. #define LFS_ERROR_(fmt, ...) \
  4.     printf("%s:%d:error: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__)
  5. #define LFS_ERROR(...) LFS_ERROR_(__VA_ARGS__, "")
  6. #else
  7. #define LFS_ERROR(...)
  8. #endif
  9. #endif
复制代码

出200入2554汤圆

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

有些编译器会链接空的 printf / putchar,确保至少不出错;
不过看来这个编译器直接没初始化,然后调用了野函数指针,结果自然啥可能都有。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 08:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表