项目到现在已经有3个月了,基于rtos做的项目,目前死于一个计算中,只能串口打日志,目前是计算任务执行一半或者执行几圈后死于任务调度sp赋值中
官方的debug函数没有任何进入迹象
求一个调试方法,或者硬件中断什么的,能让我打印一下日志,看看堆栈指针,内容,pc指针,寄存器值啥的,通过串口再这样调下去项目要夭折了
项目到现在已经有3个月了,基于rtos做的项目,目前死于一个计算中,只能串口打日志,目前是计算任务执行一半或者执行几圈后死于任务调度sp赋值中
官方的debug函数没有任何进入迹象
求一个调试方法,或者硬件中断什么的,能让我打印一下日志,看看堆栈指针,内容,pc指针,寄存器值啥的,通过串口再这样调下去项目要夭折了
计算任务用到了浮点运算和一个math库的sqrt
没办法了,今天一整晚都研究怎么调试方便了,自己改了以下函数DataAbort_P 为DataAbortHand
DataAbort
IMPORT DataAbortHand
SUB LR, LR, #8
STMFD SP!, {R0-R12, LR}
; MRS R1, SPSR
; STMFD SP!, {R1}
BL DataAbortHand
; LDMFD SP!, {R1}
; MSR SPSR_CXSF, R1
LDMFD SP!, {R0-R12, PC}^
B DataAbort
;
总算能进中断了,接下来研究怎么打印寄存器值和指针值了,想想就蛋疼
可以试一下这个,串口0输出的PC和SP
LDR R0,=0x0040D000
//========SP==========
MOV R2,R13
STR R2,[R0]
nop
nop
nop
MOV R1,R2,LSR#8
STR R1,[R0]
nop
nop
nop
MOV R1,R2,LSR#16
STR R1,[R0]
nop
nop
nop
MOV R1,R2,LSR#24
STR R1,[R0]
nop
nop
nop
//========PC==========
MOV R2,R15
STR R2,[R0]
nop
nop
nop
MOV R1,R2,LSR#8
STR R1,[R0]
nop
nop
nop
MOV R1,R2,LSR#16
STR R1,[R0]
nop
nop
nop
MOV R1,R2,LSR#24
STR R1,[R0]
nop
nop
nop
感觉能力不足,没有办法再继续下去了
stmfd sp!,{r2} ; push old task's pc
stmfd sp!,{r4-r12,lr} ; push old task's lr,r12-r4
通过UndefineInstruction异常定位到想不到的两个指令上,实在不明白stmfd是怎么导致的未定义指令异常
我把有问题的部分单独拿出来建立了一个问题重现的项目
问题图片,lr指针减4对应的是 stmfd sp!,{r2} ; push old task's pc
生成的汇编是 STMDB sp!,{r2}