查看: 211|回复: 0

[原创] 【S32K146 RT-thread】之 适配死机问题确认

[复制链接]
  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 594 天

    [LV.9]以坛为家II

    51

    主题

    2222

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7062
    最后登录
    2024-4-27
    发表于 2024-1-6 17:10:13 | 显示全部楼层 |阅读模式
    本帖最后由 andeyqi 于 2024-1-8 09:44 编辑

    按照之前适配LPC860 的流程把RT-thread适配到S32K146 板卡时启动过程中,在输出版本信息时会必先 hardfault 现象,RT-thread 在hardfault 时会dump 死机现场,对应log 如下。

    hard_fault.jpg

    从上述dump 的寄存器错误信息可以看出死机时的pc 指针为0x2e78.lr 为 0x7d0b,触发的bus 访问错误,对应错误的描述如下。
    9512.jpg
    死机现场的PSR 寄存期值为0x1000000f,根据如下寄存器定义可知,死机现场的是在ISR_NUMBER为0XF 的中断处理中。
    PSR_.png
    这个中断号是啥,从ISR_NUMBER 的定义可以知道,oxf 对应的15号中断为system_tick中断
    PSR_15.png

    因该问题本地能稳定复现根据上面的信息可以在反汇编文件重定位到调用的函数,死机前对应的调用栈如下:

    call_stack.jpg

    死机的原因是在打印版本信息的过程中触发了systick 中断,而此时系统的调度器还没启动开始调度,错误的使用了默认0地址进行访问,触发的死机一场,原因明确可,不过正常情况下在系统调度器调度开始前总中断是关闭的,是不会触发systick 中断的,如下代码默认是关闭总中断的。
    close_irq.jpg

    既然中断时关闭的,为什么会进中断呢,此时应该开始怀疑是S32K146 的sdk 代码中打开了总中断,我们查看代码发现发现我们使用的SDK的clock 初始化后会开启总中断。
    open_irq.jpg

    原因已经明确,我们在初始化时钟后关闭总中断开启的时机交给操作系统来管理,追加如下修改代码

    fix.jpg

    追加以上处理后系统可以正常启动了

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-28 08:53 , Processed in 0.101731 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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