新手入门
- 积分
- 12
- 金钱
- 12
- 注册时间
- 2019-8-27
- 在线时间
- 2 小时
|
1金钱
本帖最后由 itdong 于 2019-8-30 10:56 编辑
F103+UCOSII出现hardfault
用的是psp
<1>00-08 05:44:15[23] lr 0xFFFFFFFD
<1>00-08 05:44:15[23] psp 0x2000B4CC
<1>00-08 05:44:15[23] msp 0x20002E40
<1>00-08 05:44:15[23] stk 0x2000B4CC
<1>00-08 05:44:15[23] r0 0x00000000
<1>00-08 05:44:15[23] r1 0x00000017
<1>00-08 05:44:15[23] r2 0x0801F520
<1>00-08 05:44:15[23] r3 0x2000F1B0
<1>00-08 05:44:15[23] r12 0x0000000A
<1>00-08 05:44:15[23] lr 0x0800925B
<1>00-08 05:44:15[23] pc 0x08008F1E
<1>00-08 05:44:15[23] xPSR 0x41000000
<1>00-08 05:44:15[23] CFSR=0x00010000
<1>00-08 05:44:15[23] HFSR=0x40000000
<1>00-08 05:44:15[23] DFSR=0x0000000b
<1>00-08 05:44:15[23] AFSR=0x00000000
<2>00-08 05:44:15[23] Reset: HardFault
查了下是 UsageFault 的最低位
[0] UNDEFINSTR Undefined instruction UsageFault:
0 = no undefined instruction UsageFault
1 = the processor has attempted to execute an undefined instruction.
When this bit is set to 1, the PC value stacked for the exception return points to the undefined instruction.
An undefined instruction is an instruction that the processor cannot decode.
0x08008F1E地址对应的代码是:
0x8008f04: 0xf240 0x431a MOVW R3, #1050 ; 0x41a
0x8008f08: 0xf8df 0x24e8 LDR.W R2, [PC, #0x4e8] ; OS_EventTaskRdy::__FUNCTION__
0x8008f0c: 0xf8df 0x14f0 LDR.W R1, [PC, #0x4f0] ; 0x8022bc8 (134360008)
0x8008f10: 0x2000 MOVS R0, #0
0x8008f12: 0xf7fa 0xf8f7 BL com_prt ; 0x8003104
--->prio = (INT8U)((y << 3u) + x); /* Find priority of task getting the msg */
0x8008f16: 0xfa5f 0xf888 UXTB.W R8, R8
0x8008f1a: 0xea5f 0x00c8 LSLS.W R0, R8, #3
0x8008f1e: 0xfa50 0xf989 UXTAB.W R9, R0, R9
ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
0x8008f22: 0xf8df 0x04a8 LDR.W R0, [PC, #0x4a8] ; OSTCBPrioTbl
0x8008f26: 0xfa5f 0xf989 UXTB.W R9, R9
0x8008f2a: 0xf850 0xa029 LDR.W R10, [R0, R9, LSL #2]
ptcb->OSTCBDly = 0u; /* Prevent OSTimeTick() from readying task */
0x8008f2e: 0x2000 MOVS R0, #0
0x8008f30: 0xf8ca 0x0030 STR.W R0, [R10, #0x30]
ptcb->OSTCBMsg = pmsg; /* Send message directly to waiting task */
0x8008f34: 0xf8ca 0x5024 STR.W R5, [R10, #0x24]
ptcb->OSTCBStat &= (INT8U)~msk; /* Clear bit associated with event type */
对应函数
INT8U OS_EventTaskRdy (OS_EVENT *pevent,
void *pmsg,
INT8U msk,
INT8U pend_stat)
{
..........
#if OS_LOWEST_PRIO <= 63u
sys_ptk("%d", pevent->OSEventGrp);
y = OSUnMapTbl[pevent->OSEventGrp]; /* Find HPT waiting for message */
x = OSUnMapTbl[pevent->OSEventTbl[y]];
sys_ptk("%d,%d,%d,%d", pevent->OSEventGrp, pevent->OSEventTbl[y], x, y);
prio = (INT8U)((y << 3u) + x); /* Find priority of task getting the msg */ ----> 出错位置
....
ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
ptcb->OSTCBDly = 0u; /* Prevent OSTimeTick() from readying task */
#if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u)
ptcb->OSTCBMsg = pmsg; /* Send message directly to waiting task */
#else
pmsg = pmsg; /* Prevent compiler warning if not used */
#endif
单步调试每次也都是到这个位置就飞了,没有下步头绪了,看着都不像会飞的地方,也跟UsageFault对不起来
单步调试执行完0x8008f1e这句之后就直接触发 hardfault 异常中断了
求助
|
|