【好记性不如烂笔头】(四)RT-Thread硬件错误的处理办法2

一、 背景

根据上一篇将所有的问题解决掉后,开始运行正常,然后逐渐打开其他线程,然后,然后就又出现硬件错误这个问题。。。
【好记性不如烂笔头】(三)RT-Thread硬件错误的处理办法1

二、 具体解决思路

首先,已经排除了SScanf的问题,然后在我逐渐打开线程的时候,导致进入硬件错误回调
,但是这次我一点不慌,毕竟已经总结了不少经验,按照第一篇的走就行了
在这里插入图片描述

按照这三个参数,定位到了中断函数那块。在这里插入图片描述
也是再赋值的时候发生错误,而且这次mcause错误号是7,查看得知是指令访问错误在这里插入图片描述
这个问题有点难搞,直接问百度,查询得知:

在处理与Store(存储)和Atomic Memory Operation (AMO, 原子内存操作) 相关的访存错误时,我们首先需要了解这些操作在硬件和软件层面的基本原理。这些操作在并发编程、多处理器系统、特别是使用如RISC-V、x86-64等架构的现代处理器中非常关键

访存错误的可能原因:
地址错误: 访问了一个无效的内存地址(例如,空指针解引用、越界访问等)。
地址对齐问题:某些处理器要求特定类型的数据(如64位整数)在特定对齐的内存地址上访问。
权限问题:当前执行的程序或线程没有足够的权限去访问特定的内存区域(如写保护区域)。
硬件故障: 内存模块故障或内存控制器问题。缓存一致性问题(在多处理器系统中)。
并发冲突: 在多线程或多处理器环境中,AMO操作可能与其他内存访问操作冲突,导致数据不一致或访问错误。
软件实现错误: 编程错误,如错误的AMO操作顺序、未正确处理的同步问题。

看到这些原因,首先排除软件实现错误,因为所有的模块再裸机上都经过验证。
权限问题也可以排除,所有的内存都是可访问的有效地址。
所以大概率问题是在地址错误和地址对齐或者并发冲突问题上。
并且根据我们前面讲到的,当逐渐打开线程时,发生硬件错误,所以,先将目光放在并发冲突上。

这个问题也好解决,也不好就解决,就是按照程序执行顺序,将初始化的优先级改变,利用RTTread中提供的几个初始化宏定义

/* board init routines will be called in board_init() function */
#define INIT_BOARD_EXPORT(fn)           INIT_EXPORT(fn, "1")

/* pre/device/component/env/app init routines will be called in init_thread */
/* components pre-initialization (pure software initilization) */
#define INIT_PREV_EXPORT(fn)            INIT_EXPORT(fn, "2")
/* device initialization */
#define INIT_DEVICE_EXPORT(fn)          INIT_EXPORT(fn, "3")
/* components initialization (dfs, lwip, ...) */
#define INIT_COMPONENT_EXPORT(fn)       INIT_EXPORT(fn, "4")
/* environment initialization (mount disk, ...) */
#define INIT_ENV_EXPORT(fn)             INIT_EXPORT(fn, "5")
/* appliation initialization (rtgui application etc ...) */
#define INIT_APP_EXPORT(fn)             INIT_EXPORT(fn, "6")

按照优先级1~6,j将所有的初始化按照一定的逻辑顺序更改后,发现程序好了。
这篇算是上篇的补充吧,当硬件定位到一个官方库函数的时候,可能的原因就是先后顺序错了,试着改一改,说不定就好了。
也记录一下,说不定有人也会遇到我这样的问题,少走弯路。

完事,散会!!!

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值