6个帖子/ 0新
最后一篇
Z0806020433.
离线
最后一次露面:1年1个月前
加入:2016-05-05 13:32
异常hardfault_handlerc的跟踪思路

你好,
系统老是在hardfault_handler.c中void hardfault_handlerc(unsigned long * hardfault_args)的如下面:
void stardfault_handlerc(unsigned long * hardfault_args)
{

if(development_debug)
{
setbits16(sys_ctrl_reg,debugger_enable,1);//使调试器能够重新连接
*(volatile unsigned long *)(status_base)= hardfault_args [0];// r0.
*(varatile unsigned long *)(status_base + 0x04)= hardfault_args [1];// r1.
*(valatile unsigned long *)(status_base + 0x08)= hardfault_args [2];// r2.
*(valatile unsigned long *)(status_base + 0x0c)= hardfault_args [3];// r3.
*(volatile unsigned long *)(status_base + 0x10)= hardfault_args [4];// r12.
*(valatile unsigned long *)(status_base + 0x14)= hardfault_args [5];// lr.
*(valatile unsigned long *)(status_base + 0x18)= hardfault_args [6];// 个人电脑
*(varatile unsigned long *)(status_base + 0x1c)= hardfault_args [7];// psr.
*(valatile unsigned long *)(status_base + 0x20)=(无符号长)hardfault_args;//堆栈指针

*(volatile unsigned long *)(status_base + 0x24)=(*((varatile unsigned long *)(0xe000ed28))));// cfsr.
*(valatile unsigned long *)(status_base + 0x28)=(*((varatile unsigned long *)(0xe000ed2c)))));// HFSR.
*(valatile unsigned long *)(status_base + 0x2c)=(*((volatile unsigned long *)(0xe000ed30)))));// dfsr.
*(valaTile unsigned long *)(status_base + 0x30)=(*((varatile unsigned long *)(0xe000ed3c)))));// AFSR.
*(volatile unsigned long *)(status_base + 0x34)=(*((volatile unsigned long *)(0xe000ed34))));// mmar.
*(valatile unsigned long *)(status_base + 0x38)=(*((valatile 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.
离线
最后一次露面:3天前1周
加入:2016-04-27 07:07
找到*(挥发性无符号长*)

找到*(valatile unsigned long *)(status_base + 0x14)= hardfault_args [5];// lr,在生成的的地图文中里面找到的次数。看看是这里

Z0806020433.
离线
最后一次露面:1年1个月前
加入:2016-05-05 13:32
地图文件在这里?

地图文件在这里?
lr是什么啊?要观察status_base + 0x14的值吗?还说hardfault_args [5]记录的就在于程度发生了时,挂死的位置?

Gongyu_dialog.
离线
最后一次露面:3天前1周
加入: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中的alc_connection_req_ind_handler函数了
谢谢

Gongyu_dialog.
离线
最后一次露面:3天前1周
加入:2016-04-27 07:07
看代码,应该是批发断言了,你检查一滴的状态看看

看代码,应该是批发断言了,你检查一滴的状态看看?
int gapc_connection_req_ind_handler(ke_msg_id_t const msgid,
struct 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(param);
}
别的
{
// app_connectable状态用于等待Gap_Le_Create_Conn_Req_cmp_evt消息
assert_err(0);
}

return(ke_msg_consumed);
}