代码开始执行后,NMI发生。即使禁用看门狗(//#定义CFG_Wdog),代码即使是外设无法启动广告,所以我猜它已经崩溃了。
如何弄清楚代码被困的地方?是通过PC寄存器值吗?你能解释一下它是如何完成的吗?看门狗超时后PC值为0x200005F0。
非常感谢。
嗨费尔南多,
当FW崩溃并转到硬脱离或者到NMI_Handler时,发生FW时,FW将ARM寄存器的值存储在两个特定的基础地址0x81800和0x81850中。因此,您可以从内存窗口检查PC计数器的值以及您的应用程序崩溃的位置。你评论nmi和你的代码崩溃的事实并不意味着fw命中nmi_handler(大多数可能没有,因为你没有未定义的看门狗)。程序计数器当看门狗已经发生时,发生了该点的值直接指向当前执行的命令,因此如果您的fW会击中NMI或硬盘重点,则无法使用它,因为PC要么指向nmi或硬盘处理程序。
谢谢你的对话
如果我禁用看门狗(//#定义cfg_wdog),并且通过放置断点,我可以验证代码从未到达wdg_recoad(watchdog_default_period);但它确实达到global_int_start();这意味着它即使我已经设置了app_default_sleep_mode = arch_sleep_off,它也在进入睡眠模式;这是为什么?
我所做的只是遵循“软件开发人员指南”中的“使用空项目模板”,然后我将葡萄糖剖面传感器加入到项目中。然后,为了使其正常工作,我做了以下更改:Obs:我已经包含了所有需要的.h文件,项目编译没有任何错误。如果我不将GLP包括在项目中,代码也可以很好地工作,包括广告和其他一切。
----------------------------------------------------------------------------------------------------------------user_config.h.
静态常量结构prf_func_回调用户prf_funcs[]={{task_glps,app_glps_create_db,app_glps_enable},{task_none,null,null},//不要移动。必须始终持久};-----------------------------------------------------------------------------------------------------------------user_profiles_config.h.
#包括“diss.h”#包括“glps.h”------------------------------------------------------------------------------------------------------------------用户\葡萄糖\应用程序.c
void app_glps_create_db(void){struct glps_create_db_req * req = ke_msg_alloc(glps_create_db_req,task_glps,task_app,glps(创建数据库请求);请求->启动\u hdl=0;req->meas\U ctx\U SUPPORED=0;//req->meas\U ctx\U supported=GLPS\U meas\U ctx\U supported;
KE_MSG_SEND(REQ);}
无效应用程序glps启用(uint16控制){结构glps_enable_req*req=KE_MSG_ALLOC(glps_enable_req,task_glps,task_app,glps_启用_请求);req->conhdl=conhdl;// req->特征= feglp_fet_low_bat_det_dur_meas_supp;//req->sec_lvl=get_user_prf_srv_perm(任务分配);//请求->控制类型=PRF控制发现;
KE_MSG_SEND(REQ);}-------------------------------------------------------------------------------------------------------------------用户\葡萄糖传感器\应用程序.h
void app_glps_enable(uint16_t conhdl);作废应用程序\ glps\创建\数据库(作废);--------------------------------------------------------------------------------------------------------------------user_modules_config.h.
#define consuldure_dlg_gap(0)#define consuldure_dlg_timer(0)#定义排除消息(0)#define consuldure_dlg_sec(0)#define consuldure_dlg_diss(0)#定义排除项目(1)#定义排除低音(1)#define consuld_dlg_findl(1)#定义排除(1)#定义排除点(1)#定义排除客户1(1)#定义排除客户2(1)--------------------------------------------------------------------------------------------------------------------我真的不明白应该如何处理,以找出FW中代码卡住的地方。你的意思是我应该检查地址0x81800和0x81850,从这些地址中我必须寻找PC值,它将指向代码中卡住的部分?我怎么做?我在发一张我在配音时得到的照片。
如果禁用看门狗,fw没有理由重新加载看门狗,因为您没有使用它。如果定义了看门狗,则重新加载的代码将进入执行。此外,由于您是在无睡眠的情况下操作的,因此通过GLOBAL_INT_START()的代码并不意味着设备正在睡眠,为了使设备睡眠,它必须进入if()条件,该条件检查睡眠模式是在mode_ext还是mode_deep_sleep以关闭电源域。尝试按原样检查模板项目,在没有定义看门狗的情况下,我无法看到任何NMI执行,因此即使您在代码中的某个地方未定义CFG_WDOG定义,您也正在启用它。总而言之,除非你有看门狗功能,否则我想不出NMI_处理程序会发生。
关于调试和如何弄清楚代码丢失的位置,例如在模板项目上,我定义了看门狗并放置了一段时间(1);在user_on_connection()函数中,这意味着当我与设备连接时,代码将被困在(1)循环上,看门狗将导致我的nmi_handler()。因此,为了检查我的代码被困,我看到处理程序是NMI,因此Base_Address转储的ARM寄存器是0x81850,所以我打开keil的内存窗口并键入此基本地址。根据寄存器的保存方式,我检查该基地地址的第7位32位值,以便检查我的程序计数器(设置内存窗口以显示未签名长的值)。我看到第7个32位有0x200050Fa的值,所以我转到装配窗口,我跟踪这个地址,大会最终将我指向我的循环在用户的连接中,代码困扰着。
非常感谢,我设法找出了代码被卡住的地方,它在全局的INT START()中;为什么会发生这种情况,任何线索?我正在附上一张照片。
如我所说,如果启用了看门狗,只有那时对于获得它的原因,我猜我们猜您已经增加了广告间隔的原因,而不是看门狗超时(2.6秒),因此该设备困在WFI()中等待从BLE永远不会出现的中断活动时间很遥远。
谢谢你的快速重播。
就像我说的,除了上面提到的那些,我什么也不做。但为了确保广告间隔是正常的,我甚至将其设置为110(68.7毫秒),但仍然没有任何效果。
OBS:如果注释以下代码行(其中插入“创建”和“启用”函数),则FW不会进入NMI处理程序。
静态常量结构prf_func_回调用户prf_funcs[]={//{TASK_GLPS,app_GLPS_create_db,app_GLPS_enable},{task_none,null,null},//不要移动。必须始终持久};
如果是这种情况,那么一旦发送消息,数据库的创建就永远不会得到确认,请在创建数据库时检查消息流,消息是否触发了正确的处理程序?我假设默认的\u db\u init\u complete回调永远不会触发,并且您实现它的数据库永远不会创建。数据库完成后,您的fw是否处理确认,是否发送应用程序模块初始化CMP EVT消息?检查邻近报告器,并检查其他配置文件如何处理数据库创建。
您是对的,我没有处理“Glps_create_db_cfm”消息,以便发送“app_module_init_cmp_evt”消息。
查看Interface Specification.pdf,它说“GLPS\u CREATE\u DB\u CFM”有“Destination:TASK\u API”。他们的意思是“目的地:任务应用程序”吗?
使用“user_catch_rest_hndl”,我终于让它终于工作。
有没有方法可以使用catch rest cb的提示实现此消息处理,使用app_task和profle_task使用的内容?
静态const struct ke_msg_handler app_glps_process_handler[]={{GLPS_CREATE_DB_CFM,(ke_msg_func_t)GLPS_CREATE_DB_CFM_handler},};
我试着这样做,但没有锻炼。我想这样做,因为它感觉更紧凑,因为我可以处理的所有消息都被限制在一个地方。
配置文件具有分配给他们的消息的单独任务,例如,接近报告器,对于邻近配置文件具有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_task.c文件中的app_proxr_process_handler(),以便处理来自的事件配置文件并调用相应的处理程序,此处理程序函数应放在App_Entry_point.c文件中的App_process_handlers []数组中。
嗨费尔南多,
当FW崩溃并转到硬脱离或者到NMI_Handler时,发生FW时,FW将ARM寄存器的值存储在两个特定的基础地址0x81800和0x81850中。因此,您可以从内存窗口检查PC计数器的值以及您的应用程序崩溃的位置。你评论nmi和你的代码崩溃的事实并不意味着fw命中nmi_handler(大多数可能没有,因为你没有未定义的看门狗)。程序计数器当看门狗已经发生时,发生了该点的值直接指向当前执行的命令,因此如果您的fW会击中NMI或硬盘重点,则无法使用它,因为PC要么指向nmi或硬盘处理程序。
谢谢你的对话
如果我禁用看门狗(//#定义cfg_wdog),并且通过放置断点,我可以验证代码从未到达wdg_recoad(watchdog_default_period);但它确实达到global_int_start();这意味着它即使我已经设置了app_default_sleep_mode = arch_sleep_off,它也在进入睡眠模式;这是为什么?
我所做的只是遵循“软件开发人员指南”中的“使用空项目模板”,然后我将葡萄糖剖面传感器加入到项目中。
然后,为了使其正常工作,我做了以下更改:
Obs:我已经包含了所有需要的.h文件,项目编译没有任何错误。如果我不将GLP包括在项目中,代码也可以很好地工作,包括广告和其他一切。
----------------------------------------------------------------------------------------------------------------
user_config.h.
静态常量结构prf_func_回调用户prf_funcs[]=
{
{task_glps,app_glps_create_db,app_glps_enable},
{task_none,null,null},//不要移动。必须始终持久
};
-----------------------------------------------------------------------------------------------------------------
user_profiles_config.h.
#包括“diss.h”
#包括“glps.h”
------------------------------------------------------------------------------------------------------------------
用户\葡萄糖\应用程序.c
void app_glps_create_db(void)
{
struct glps_create_db_req * req = ke_msg_alloc(glps_create_db_req,
task_glps,task_app,
glps(创建数据库请求);
请求->启动\u hdl=0;
req->meas\U ctx\U SUPPORED=0;
//req->meas\U ctx\U supported=GLPS\U meas\U ctx\U supported;
KE_MSG_SEND(REQ);
}
无效应用程序glps启用(uint16控制)
{
结构glps_enable_req*req=KE_MSG_ALLOC(glps_enable_req,
task_glps,task_app,
glps_启用_请求);
req->conhdl=conhdl;
// req->特征= feglp_fet_low_bat_det_dur_meas_supp;
//req->sec_lvl=get_user_prf_srv_perm(任务分配);
//请求->控制类型=PRF控制发现;
KE_MSG_SEND(REQ);
}
-------------------------------------------------------------------------------------------------------------------
用户\葡萄糖传感器\应用程序.h
void app_glps_enable(uint16_t conhdl);
作废应用程序\ glps\创建\数据库(作废);
--------------------------------------------------------------------------------------------------------------------
user_modules_config.h.
#define consuldure_dlg_gap(0)
#define consuldure_dlg_timer(0)
#定义排除消息(0)
#define consuldure_dlg_sec(0)
#define consuldure_dlg_diss(0)
#定义排除项目(1)
#定义排除低音(1)
#define consuld_dlg_findl(1)
#定义排除(1)
#定义排除点(1)
#定义排除客户1(1)
#定义排除客户2(1)
--------------------------------------------------------------------------------------------------------------------
我真的不明白应该如何处理,以找出FW中代码卡住的地方。
你的意思是我应该检查地址0x81800和0x81850,从这些地址中我必须寻找PC值,它将指向代码中卡住的部分?
我怎么做?
我在发一张我在配音时得到的照片。
嗨费尔南多,
如果禁用看门狗,fw没有理由重新加载看门狗,因为您没有使用它。如果定义了看门狗,则重新加载的代码将进入执行。此外,由于您是在无睡眠的情况下操作的,因此通过GLOBAL_INT_START()的代码并不意味着设备正在睡眠,为了使设备睡眠,它必须进入if()条件,该条件检查睡眠模式是在mode_ext还是mode_deep_sleep以关闭电源域。尝试按原样检查模板项目,在没有定义看门狗的情况下,我无法看到任何NMI执行,因此即使您在代码中的某个地方未定义CFG_WDOG定义,您也正在启用它。总而言之,除非你有看门狗功能,否则我想不出NMI_处理程序会发生。
关于调试和如何弄清楚代码丢失的位置,例如在模板项目上,我定义了看门狗并放置了一段时间(1);在user_on_connection()函数中,这意味着当我与设备连接时,代码将被困在(1)循环上,看门狗将导致我的nmi_handler()。因此,为了检查我的代码被困,我看到处理程序是NMI,因此Base_Address转储的ARM寄存器是0x81850,所以我打开keil的内存窗口并键入此基本地址。根据寄存器的保存方式,我检查该基地地址的第7位32位值,以便检查我的程序计数器(设置内存窗口以显示未签名长的值)。我看到第7个32位有0x200050Fa的值,所以我转到装配窗口,我跟踪这个地址,大会最终将我指向我的循环在用户的连接中,代码困扰着。
谢谢你的对话
非常感谢,我设法找出了代码被卡住的地方,它在全局的INT START()中;
为什么会发生这种情况,任何线索?
我正在附上一张照片。
嗨费尔南多,
如我所说,如果启用了看门狗,只有那时对于获得它的原因,我猜我们猜您已经增加了广告间隔的原因,而不是看门狗超时(2.6秒),因此该设备困在WFI()中等待从BLE永远不会出现的中断活动时间很遥远。
谢谢你的对话
谢谢你的快速重播。
就像我说的,除了上面提到的那些,我什么也不做。但为了确保广告间隔是正常的,我甚至将其设置为110(68.7毫秒),但仍然没有任何效果。
OBS:如果注释以下代码行(其中插入“创建”和“启用”函数),则FW不会进入NMI处理程序。
静态常量结构prf_func_回调用户prf_funcs[]=
{
//{TASK_GLPS,app_GLPS_create_db,app_GLPS_enable},
{task_none,null,null},//不要移动。必须始终持久
};
嗨费尔南多,
如果是这种情况,那么一旦发送消息,数据库的创建就永远不会得到确认,请在创建数据库时检查消息流,消息是否触发了正确的处理程序?我假设默认的\u db\u init\u complete回调永远不会触发,并且您实现它的数据库永远不会创建。数据库完成后,您的fw是否处理确认,是否发送应用程序模块初始化CMP EVT消息?检查邻近报告器,并检查其他配置文件如何处理数据库创建。
谢谢你的对话
您是对的,我没有处理“Glps_create_db_cfm”消息,以便发送“app_module_init_cmp_evt”消息。
查看Interface Specification.pdf,它说“GLPS\u CREATE\u DB\u CFM”有“Destination:TASK\u API”。他们的意思是“目的地:任务应用程序”吗?
使用“user_catch_rest_hndl”,我终于让它终于工作。
有没有方法可以使用catch rest cb的提示实现此消息处理,使用app_task和profle_task使用的内容?
静态const struct ke_msg_handler app_glps_process_handler[]=
{
{GLPS_CREATE_DB_CFM,(ke_msg_func_t)GLPS_CREATE_DB_CFM_handler},
};
我试着这样做,但没有锻炼。我想这样做,因为它感觉更紧凑,因为我可以处理的所有消息都被限制在一个地方。
嗨费尔南多,
配置文件具有分配给他们的消息的单独任务,例如,接近报告器,对于邻近配置文件具有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_task.c文件中的app_proxr_process_handler(),以便处理来自的事件配置文件并调用相应的处理程序,此处理程序函数应放在App_Entry_point.c文件中的App_process_handlers []数组中。
谢谢你的对话