应用程序崩溃是由于看门狗超时

10个帖子/ 0新
最后一篇
费尔南多Effting
离线
最后一次露面:1年7个月前
加入:2014-11-14 13:50
应用程序崩溃是由于看门狗超时

代码开始执行后,NMI发生。即使禁用看门狗(//#定义CFG_Wdog),代码即使是外设无法启动广告,所以我猜它已经崩溃了。

如何弄清楚代码被困的地方?是通过PC寄存器值吗?你能解释一下它是如何完成的吗?
看门狗超时后PC值为0x200005F0。

谢谢你。

设备:
mt_dialog.
离线
最后一次露面:5个月1周前
职员
加入:2015-06-08 11:34
嗨费尔南多,

嗨费尔南多,

当FW崩溃并转到硬脱离或者到NMI_Handler时,发生FW时,FW将ARM寄存器的值存储在两个特定的基础地址0x81800和0x81850中。因此,您可以从内存窗口检查PC计数器的值以及您的应用程序崩溃的位置。你评论nmi和你的代码崩溃的事实并不意味着fw命中nmi_handler(大多数可能没有,因为你没有未定义的看门狗)。程序计数器当看门狗已经发生时,发生了该点的值直接指向当前执行的命令,因此如果您的fW会击中NMI或硬盘重点,则无法使用它,因为PC要么指向nmi或硬盘处理程序。

谢谢mt_dialog.

费尔南多Effting
离线
最后一次露面:1年7个月前
加入:2014-11-14 13:50
如果我禁用看门狗(//

如果停用看门狗(//#限定CFG_WDOG),并通过将断点,我可以验证该代码从未达到wdg_reload(WATCHDOG_DEFAULT_PERIOD);但它确实达到GLOBAL_INT_START();这意味着它是进入睡眠模式,即使我有集app_default_sleep_mode = ARCH_SLEEP_OFF ;.这是为什么?

我所做的是继“使用空项目模板”,从“软件开发人员指南”,在那之后我已经包括葡萄糖档传感器到项目中。
然后,我已经做了以下修改,以使其工作:
OBS:我都inluded所需的.h文件,以及项目编译没有任何错误回报。该代码也能正常工作,做广告和一切,如果我不包括GLPS到项目中。

---------------------------------------------------------------------------------------------------------------------------------------------
user_config.h.

静态常量结构prf_func_callbacks user_prf_funcs [] =
{
{TASK_GLPS,app_glps_create_db,app_glps_enable}
{TASK_NONE,NULL,NULL} //不会移动。必须始终是最后一个
};
---------------------------------------------------------------------------------------------------------------------------------------------
user_profiles_config.h.

#include“pars.h”
#包括“glps.h”
-----------------------------------------------------------------------------------------------------------------------------------------------
user_glucose_application.c

void app_glps_create_db(void)
{
结构glps_create_db_req * REQ = KE_MSG_ALLOC(GLPS_CREATE_DB_REQ,
task_glps,task_app,
glps_create_db_req);
req-> start_hdl = 0;
req-> meas_ctx_supported = 0;
// req-> meas_ctx_supported = GLPS_MEAS_CTX_SUPPORTED;

KE_MSG_SEND(REQ);
}

空隙app_glps_enable(uint16_t conhdl)
{
结构glps_enable_req * REQ = KE_MSG_ALLOC(GLPS_ENABLE_REQ,
task_glps,task_app,
glps_enable_req);
req-> conhdl = conhdl;
// req->特征= feglp_fet_low_bat_det_dur_meas_supp;
// req-> sec_l​​vl = get_user_prf_srv_perm(TASK_DISS);
// req-> con_type = PRF_CON_DISCOVERY;

KE_MSG_SEND(REQ);
}
----------------------------------------------------------------------------------------------------------------------------------------------
user_glucosensor_application.h

void app_glps_enable(uint16_t conhdl);
空隙app_glps_create_db(无效);
-------------------------------------------------------------------------------------------------------------------------------------------------
user_modules_config.h.

#define consuldure_dlg_gap(0)
#define consuldure_dlg_timer(0)
的#define EXCLUDE_DLG_MSG(0)
#define consuldure_dlg_sec(0)
#define consuldure_dlg_diss(0)
的#define EXCLUDE_DLG_PROXR(1)
的#define EXCLUDE_DLG_BASS(1)
#define consuld_dlg_findl(1)
的#define EXCLUDE_DLG_FINDT(1)
的#define EXCLUDE_DLG_SPOTAR(1)
的#define EXCLUDE_DLG_CUSTS1(1)
的#define EXCLUDE_DLG_CUSTS2(1)
-------------------------------------------------------------------------------------------------------------------------------------------------
我真的不明白怎么一个人应该为了弄清楚在FW的地步代码卡住了PROCEDE。
所以,你的意思是我应该检查地址0x81800和0x81850并从这些不会忽略我必须寻找PC值将指向它卡住了代码的一部分吗?
我怎么做?
我真的发送了什么我dubugging期间获得的照片。

依恋:
mt_dialog.
离线
最后一次露面:5个月1周前
职员
加入:2015-06-08 11:34
嗨费尔南多,

嗨费尔南多,

如果禁用看门狗,没有理由FW重新加载看门狗,因为你不使用它。如果定义看门狗则重装的代码将进入执行。此外,由于你没有睡觉下,通过GLOBAL_INT_START操作,事实代码()好好尝试一下意味着该设备正在睡觉,为了使设备休眠它必须输入,如果()条件来检查,如果在mode_ext睡眠或者为了mode_deep_sleep,关断电源域。尝试检查模板项目为是,我不能够看到任何NMI执行,而没有定义的看门狗,所以即使你已经未定义在代码中定义CFG_WDOG某处要启用它。归纳起来有没有办法,我能想到的,除非你有看门狗functionallity发生的NMI_Handler。

关于调试和如何弄清楚代码丢失的位置,例如在模板项目上,我定义了看门狗并放置了一段时间(1);在user_on_connection()函数中,这意味着当我与设备连接时,代码将被困在(1)循环上,看门狗将导致我的nmi_handler()。因此,为了检查我的代码被困,我看到处理程序是NMI,因此Base_Address转储的ARM寄存器是0x81850,所以我打开keil的内存窗口并键入此基本地址。根据寄存器的保存方式,我检查该基地地址的第7位32位值,以便检查我的程序计数器(设置内存窗口以显示未签名长的值)。我看到第7个32位有0x200050Fa的值,所以我转到装配窗口,我跟踪这个地址,大会最终将我指向我的循环在用户的连接中,代码困扰着。

谢谢mt_dialog.

依恋:
费尔南多Effting
离线
最后一次露面:1年7个月前
加入:2014-11-14 13:50
非常感谢你,我

非常感谢你,我设法找出其中的代码卡住了,并且它在GLOBAL_INT_START();
为什么是这种情况发生,任何线索?
我附上一张照片。

依恋:
mt_dialog.
离线
最后一次露面:5个月1周前
职员
加入:2015-06-08 11:34
嗨费尔南多,

嗨费尔南多,

正如我所说,如果看门狗激活。只有对于获得它的原因,我猜我们猜您已经增加了广告间隔的原因,而不是看门狗超时(2.6秒),因此该设备困在WFI()中等待从BLE永远不会出现的中断活动时间很遥远。

谢谢mt_dialog.

费尔南多Effting
离线
最后一次露面:1年7个月前
加入:2014-11-14 13:50
谢谢你的快速重播。

谢谢你的快速重播。

就像我说的,我dind't做别的其他则那些我上面提出的。但是,为了确保该advertinsing间隔是确定的,我甚至将其110(68.7毫秒),仍然没有工作。

OBS:如果注释以下代码行(其中插入“创建”和“启用”函数),则FW不会进入NMI处​​理程序。

静态常量结构prf_func_callbacks user_prf_funcs [] =
{
// {TASK_GLPS,app_glps_create_db,app_glps_enable}
{TASK_NONE,NULL,NULL} //不会移动。必须始终是最后一个
};

mt_dialog.
离线
最后一次露面:5个月1周前
职员
加入:2015-06-08 11:34
嗨费尔南多,

嗨费尔南多,

如果一旦是这样,那么你的数据库的创建只要你发送邮件从来没有得到证实,检查的消息流当您创建数据库时,被消息触发正确的处理程序?我假设default_app_on_db_init_complete回调从未触发器和你VE的数据库来实现,从未创建它。当数据库完成贵FW处理,并确认它发送APP_MODULE_INIT_CMP_EVT消息?检查接近记者与检查有其他配置文件正在处理的数据库创建。

谢谢mt_dialog.

费尔南多Effting
离线
最后一次露面:1年7个月前
加入:2014-11-14 13:50
你是对的,我不是

你说得对,我不处理“GLPS_CREATE_DB_CFM”消息,以发送“APP_MODULE_INIT_CMP_EVT”的消息。

纵观接口规范.PDF,它说,“GLPS_CREATE_DB_CFM”有“目标:TASK_API”。难道他们的意思是“目的地:TASK_APP”?

使用“user_catch_rest_hndl”,我终于让它终于工作。

有没有方法可以使用catch rest cb的提示实现此消息处理,使用app_task和profle_task使用的内容?

静态常量结构ke_msg_handler app_glps_process_handlers [] =
{
{GLPS_CREATE_DB_CFM,(ke_msg_func_t)glps_create_db_cfm_handler}
};

我试着这样做,但没有锻炼。我想这样做,因为它感觉更紧凑,因为我可以处理的所有消息都被限制在一个地方。

mt_dialog.
离线
最后一次露面:5个月1周前
职员
加入:2015-06-08 11:34
嗨费尔南多,

嗨费尔南多,

配置文件具有分配给他们的消息的单独任务,例如,接近报告器,对于邻近配置文件具有Task_proxr任务,因此它取决于您希望如何实现血糖配置文件,因此葡萄糖传感器具有Task_Glps任务专用任务。例如,如果您检查邻近配置文件,您将看到数据库(app_proxr_create_db)的创建作为任务目标任务_proxr和proxr_create_db_req_req_handler()函数提供的确认发送给Task_App(它通知主要任务已经创建了配置文件)。所以是的,确认的目的地必须发送到Task_App,以便知道此配置文件的数据库已完成才能到达下一个。

是的,你可以以处理从与正在添加事件做它像你提到的方式,但为了工作,你必须创建一个app_glps_process_handler()函数(就像app_proxr_process_handler()在app_proxr_task.c文件)轮廓并调用适当的处理程序,而这个处理程序函数应放置在app_process_handlers []阵列中的app_entry_point.c文件。

谢谢mt_dialog.