你好,
系统老是在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);
}
}
这个一定是什么原因啊?硬件有没有虚焊还?软件上的能定位问题吗,前面的那些寄存仪有色定位问题吗?
谢谢!
找到*(valatile unsigned long *)(status_base + 0x14)= hardfault_args [5];// lr,在生成的的地图文中里面找到的次数。看看是这里
地图文件在这里?
lr是什么啊?要观察status_base + 0x14的值吗?还说hardfault_args [5]记录的就在于程度发生了时,挂死的位置?
lr是栈上的返回地。
地图文件一流在工程目录\ keil_5 \ out_580 \ lst下载
你好,
lr是栈上的保存地址,pc指向当前执行的代码地址,是不是是这个个地址在地图文章中查找查找它属于哪哪个址址址址址址址址址址址
如附件范例中,内部,在app_task.c中的alc_connection_req_ind_handler函数了
谢谢
看代码,应该是批发断言了,你检查一滴的状态看看?
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);
}