6个职位/ 0个新职位
最后发表
z0806020433
离线
最后看到:1年1个月前
加入:2016-05-05 13:32
异常HardFault_HandlerC的跟踪思路

你好,
系统老是挂死在hardFault_handler.c中空白HardFault_HandlerC(无符号长* hardfault_args)的如下地方:
void HardFault_HandlerC(unsigned long *hardfault_args)

如果(DEVELOPMENT_DEBUG)

SetBits16 (SYS_CTRL_REG DEBUGGER_ENABLE 1);//启用调试器能够重新连接
*(volatile unsigned long *)(STATUS_BASE) = hardfault_args[0];/ / R0
*(volatile unsigned long *)(STATUS_BASE + 0x04) = hardfault_args[1];/ / R1
*(volatile unsigned long *)(STATUS_BASE + 0x08) = hardfault_args[2];/ / R2
*(volatile unsigned long *)(STATUS_BASE + 0x0C) = hardfault_args[3];/ / R3
*(volatile unsigned long *)(STATUS_BASE + 0x10) = hardfault_args[4];/ / R12
*(volatile unsigned long *)(STATUS_BASE + 0x14) = hardfault_args[5];/ / LR
*(volatile unsigned long *)(STATUS_BASE + 0x18) = hardfault_args[6];/ /电脑
*(volatile unsigned long *)(STATUS_BASE + 0x1C) = hardfault_args[7];/ / PSR
*(volatile unsigned long *)(STATUS_BASE + 0x20) = (unsigned long)hardfault_args;/ /堆栈指针

*(volatile unsigned long *)(STATUS_BASE + 0x24) = (*((volatile unsigned long *)(0xE000ED28));/ / CFSR
*(volatile unsigned long *)(STATUS_BASE + 0x28) = (*((volatile unsigned long *)(0xE000ED2C));/ / HFSR
*(volatile unsigned long *)(STATUS_BASE + 0x2C) = (*((volatile unsigned long *)(0xE000ED30));/ / DFSR
*(volatile unsigned long *)(STATUS_BASE + 0x30) = (*((volatile unsigned long *)(0xE000ED3C));/ / AFSR
*(volatile unsigned long *)(STATUS_BASE + 0x34) = (*((volatile unsigned long *)(0xE000ED34));/ / MMAR
*(volatile unsigned long *)(STATUS_BASE + 0x38) = (*((volatile unsigned long *)(0xE000ED38));/ / BFAR
如果(USE_WDOG)
wdg_freeze ();/ /停止WDOG

if (GetWord16(SYS_STAT_REG) & DBG_IS_UP) == DBG_IS_UP)
__asm(“BKPT # 0 \ n”);//挂死在此处
其他的
(1);

这个一般是什么原因啊?硬件的有虚焊还是?软件上能定位这个问题吗,前面的那些寄存器有助于定位问题吗?
谢谢!

关键词:
设备:
Gongyu_Dialog
离线
最后看到:1周2小时前
加入:2016-04-27 07:07
找到*(挥发性无符号长*)

找到*(挥发性无符号长*)(STATUS_BASE + 0 x14) = hardfault_args [5];/ / LR,在生成的地图的文件里面找到相应的函数。看看是哪里异常了

z0806020433
离线
最后看到:1年1个月前
加入:2016-05-05 13:32
地图文件在哪里?

地图文件在哪里?
LR是什么啊?要观察STATUS_BASE + 0 x14的值吗?还是说hardfault_args[5]记录的就是程序发生异常时,挂死的位置?

Gongyu_Dialog
离线
最后看到:1周2小时前
加入:2016-04-27 07:07
LR是栈上保存的返回地址。

LR是栈上保存的返回地址。

地图文件一般在工程目录\ keil_5 \ out_580 \ lst下面

z0806020433
离线
最后看到:1年1个月前
加入:2016-05-05 13:32
你好,

你好,
LR是栈上保存的返回地址,PC指向当前执行的代码地址,是不是根据这两个地址在地图文件中查找它属于哪个函数的地址范围。
如附件范例中,程序挂死在app_task.c中的gapc_connection_req_ind_handler函数了。
谢谢

Gongyu_Dialog
离线
最后看到:1周2小时前
加入:2016-04-27 07:07
看代码,应该是触发维护了,你检查一下当前的状态看看

看代码,应该是触发维护了,你检查一下当前的状态看看吗?
Int gapc_connection_req_ind_handler(ke_msg_id_t const msgid,
gapc_connection_req_ind const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)

/ /连接指数
if (ke_state_get(dest_id) == APP_CONNECTABLE)

app_env。conidx = KE_IDX_GET (src_id);

app_connection_func(参数);

其他的

// APP_CONNECTABLE状态用于等待GAP_LE_CREATE_CONN_REQ_CMP_EVT消息
ASSERT_ERR (0);

返回(KE_MSG_CONSUMED);