研究了一个星期找问题一直找不到问题,
Unhandled Exception 5:Load Access Fault
mcause:0x0000000000000005,mtval:0x0000000002500014,mepc:0x00000000400152d8
进场不定时出现这样类似的错误,有时是"Instruction Access Fault",
有时候是"Illegal Instruction",
到底是哪里有问题啊,能不能屏蔽这样的错误啊,好烦躁好烦躁
离线
mepc是出错的指令,每次出错的地方都一样吗?用addr2line看看 0x400152d8 是代码的哪里
0x400152d8: 30009073 csrw mstatus,ra
定位到源代码是这个
.macro RESTORE_ALL
#ifdef ENABLE_FPU
/* restore float register */
mv t2, sp
addi t2, t2, CTX_GENERAL_REG_NR * REGBYTES /* skip all normal reg */
li t0, MSTATUS_FS
csrs mstatus, t0
fld f0, FPU_CTX_F0_OFF(t2)
fld f1, FPU_CTX_F1_OFF(t2)
fld f2, FPU_CTX_F2_OFF(t2)
fld f3, FPU_CTX_F3_OFF(t2)
fld f4, FPU_CTX_F4_OFF(t2)
fld f5, FPU_CTX_F5_OFF(t2)
fld f6, FPU_CTX_F6_OFF(t2)
fld f7, FPU_CTX_F7_OFF(t2)
fld f8, FPU_CTX_F8_OFF(t2)
fld f9, FPU_CTX_F9_OFF(t2)
fld f10,FPU_CTX_F10_OFF(t2)
fld f11,FPU_CTX_F11_OFF(t2)
fld f12,FPU_CTX_F12_OFF(t2)
fld f13,FPU_CTX_F13_OFF(t2)
fld f14,FPU_CTX_F14_OFF(t2)
fld f15,FPU_CTX_F15_OFF(t2)
fld f16,FPU_CTX_F16_OFF(t2)
fld f17,FPU_CTX_F17_OFF(t2)
fld f18,FPU_CTX_F18_OFF(t2)
fld f19,FPU_CTX_F19_OFF(t2)
fld f20,FPU_CTX_F20_OFF(t2)
fld f21,FPU_CTX_F21_OFF(t2)
fld f22,FPU_CTX_F22_OFF(t2)
fld f23,FPU_CTX_F23_OFF(t2)
fld f24,FPU_CTX_F24_OFF(t2)
fld f25,FPU_CTX_F25_OFF(t2)
fld f26,FPU_CTX_F26_OFF(t2)
fld f27,FPU_CTX_F27_OFF(t2)
fld f28,FPU_CTX_F28_OFF(t2)
fld f29,FPU_CTX_F29_OFF(t2)
fld f30,FPU_CTX_F30_OFF(t2)
fld f31,FPU_CTX_F31_OFF(t2)
/* clr FS domain */
csrc mstatus, t0
/* clean status would clr sr_sd; */
li t0, MSTATUS_FS_CLEAN
csrs mstatus, t0
#endif /* ENABLE_FPU */
/* restore general register */
/* resw ra to sepc */
LOAD x1, 0 * REGBYTES(sp)
csrw mepc, x1
LOAD x1, 2 * REGBYTES(sp)
csrw mstatus, x1
LOAD x1, 1 * REGBYTES(sp)
LOAD x3, 3 * REGBYTES(sp)
LOAD x4, 4 * REGBYTES(sp)
LOAD x5, 5 * REGBYTES(sp)
LOAD x6, 6 * REGBYTES(sp)
LOAD x7, 7 * REGBYTES(sp)
LOAD x8, 8 * REGBYTES(sp)
LOAD x9, 9 * REGBYTES(sp)
LOAD x10, 10 * REGBYTES(sp)
LOAD x11, 11 * REGBYTES(sp)
LOAD x12, 12 * REGBYTES(sp)
LOAD x13, 13 * REGBYTES(sp)
LOAD x14, 14 * REGBYTES(sp)
LOAD x15, 15 * REGBYTES(sp)
LOAD x16, 16 * REGBYTES(sp)
LOAD x17, 17 * REGBYTES(sp)
LOAD x18, 18 * REGBYTES(sp)
LOAD x19, 19 * REGBYTES(sp)
LOAD x20, 20 * REGBYTES(sp)
LOAD x21, 21 * REGBYTES(sp)
LOAD x22, 22 * REGBYTES(sp)
LOAD x23, 23 * REGBYTES(sp)
LOAD x24, 24 * REGBYTES(sp)
LOAD x25, 25 * REGBYTES(sp)
LOAD x26, 26 * REGBYTES(sp)
LOAD x27, 27 * REGBYTES(sp)
LOAD x28, 28 * REGBYTES(sp)
LOAD x29, 29 * REGBYTES(sp)
LOAD x30, 30 * REGBYTES(sp)
LOAD x31, 31 * REGBYTES(sp)
addi sp, sp, CTX_GENERAL_REG_NR * REGBYTES
#ifdef ENABLE_FPU
addi sp, sp, CTX_FPU_REG_NR * REGBYTES
#endif
.endm
离线
mepc是出错的指令,每次出错的地方都一样吗?用addr2line看看 0x400152d8 是代码的哪里
用的是这个兄弟的代码
https://github.com/bigmagic123/d1-nezha-rtthread 移植到d1上的,我用的是f133,f133和d1应该是通用的
离线