本帖最后由 andeyqi 于 2024-1-8 09:44 编辑
按照之前适配LPC860 的流程把RT-thread适配到S32K146 板卡时启动过程中,在输出版本信息时会必先 hardfault 现象,RT-thread 在hardfault 时会dump 死机现场,对应log 如下。
从上述dump 的寄存器错误信息可以看出死机时的pc 指针为0x2e78.lr 为 0x7d0b,触发的bus 访问错误,对应错误的描述如下。 死机现场的PSR 寄存期值为0x1000000f,根据如下寄存器定义可知,死机现场的是在ISR_NUMBER为0XF 的中断处理中。 这个中断号是啥,从ISR_NUMBER 的定义可以知道,oxf 对应的15号中断为system_tick中断
因该问题本地能稳定复现根据上面的信息可以在反汇编文件重定位到调用的函数,死机前对应的调用栈如下:
死机的原因是在打印版本信息的过程中触发了systick 中断,而此时系统的调度器还没启动开始调度,错误的使用了默认0地址进行访问,触发的死机一场,原因明确可,不过正常情况下在系统调度器调度开始前总中断是关闭的,是不会触发systick 中断的,如下代码默认是关闭总中断的。 既然中断时关闭的,为什么会进中断呢,此时应该开始怀疑是S32K146 的sdk 代码中打开了总中断,我们查看代码发现发现我们使用的SDK的clock 初始化后会开启总中断。 原因已经明确,我们在初始化时钟后关闭总中断开启的时机交给操作系统来管理,追加如下修改代码
|