代码开始执行后,NMI发生。即使禁用看门狗(//#定义CFG_Wdog),代码即使是外设无法启动广告,所以我猜它已经崩溃了。
如何弄清楚代码被困的地方?是通过PC寄存器值吗?你能解释一下它是如何完成的吗?看门狗超时后PC值为0x200005F0。
谢谢你。
嗨费尔南多,
当FW崩溃并转到硬脱离或者到NMI_Handler时,发生FW时,FW将ARM寄存器的值存储在两个特定的基础地址0x81800和0x81850中。因此,您可以从内存窗口检查PC计数器的值以及您的应用程序崩溃的位置。你评论nmi和你的代码崩溃的事实并不意味着fw命中nmi_handler(大多数可能没有,因为你没有未定义的看门狗)。程序计数器当看门狗已经发生时,发生了该点的值直接指向当前执行的命令,因此如果您的fW会击中NMI或硬盘重点,则无法使用它,因为PC要么指向nmi或硬盘处理程序。
谢谢mt_dialog.
如果我禁用了看门狗(//#define CFG_WDOG),并通过放置断点,我可以验证代码从未达到wdg_重载(看门狗默认时段);但它确实到达了全球范围内的起点();这意味着它正在进入睡眠模式,即使我已经将app\u default\u sleep\u mode=ARCH\u sleep\u OFF;。为什么呢?
所有我所做的就是从“软件开发人员指南”中的“使用空项目模板”之后,并且在我已经将血糖配置文件中包含到项目中。然后我已经进行了以下更改,以使其工作:OBS:我已经介绍了所需的所有.h文件,并且项目编译没有任何错误。如果我没有将GLP与项目一起包含GLP,则代码也适用,宣传和一切。
---------------------------------------------------------------------------------------------------------------------------------------------user_config.h.
static const struct 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”#include“glps.h”-----------------------------------------------------------------------------------------------------------------------------------------------user_glucose_application.c.
void app_glps_create_db(void){结构glps\u create\u db\u req*req=KE\u MSG\u ALLOC(glps\u create\u db\u 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);}
void app_glps_enable(uint16_t conhdl){struct 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_lvl = 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);void app_glps_create_db(void);-------------------------------------------------------------------------------------------------------------------------------------------------用户\模块\配置.h
#define consuldure_dlg_gap(0)#define consuldure_dlg_timer(0)#define outlude_dlg_msg(0)#define consuldure_dlg_sec(0)#define consuldure_dlg_diss(0)#define consuldure_dlg_proxr(1)#define consuldure_dlg_bass(1)#define consuld_dlg_findl(1)#define consuld_dlg_findt(1)#define consuld_dlg_spotar(1)#define consuld_dlg_custs1(1)#define consuld_dlg_custs2(1)-------------------------------------------------------------------------------------------------------------------------------------------------我真的不知道一个人应该如何程序,以弄清楚代码卡的FW中的点。所以你的意思是我应该检查地址0x81800和0x81850,并从那些我要查找pc值,这将指向它被卡住的代码的一部分?我怎么做?我正在拖动我在拖动期间发出的照片。
如果禁用看门狗,则没有理由重新加载看门狗,因为您没有使用它。如果定义看门狗,则重新加载的代码将进入执行。此外,由于您在不睡眠不下运行,因此通过global_int_start()代码的事实不是意味着设备睡眠,以便为设备睡眠,它必须输入检查模式睡眠是否睡眠的if()条件或mode_deep_sleep以便关闭电源域。尝试检查模板项目,我无法看到任何NMI执行,同时没有定义看门狗,所以即使您在代码中的某处未定义,您也可以启用它。总结,除非您拥有看门狗函数,否则我无法想到否则会发生nmi_handler。
关于调试和如何弄清楚代码丢失的位置,例如在模板项目上,我定义了看门狗并放置了一段时间(1);在user_on_connection()函数中,这意味着当我与设备连接时,代码将被困在(1)循环上,看门狗将导致我的nmi_handler()。因此,为了检查我的代码被困,我看到处理程序是NMI,因此Base_Address转储的ARM寄存器是0x81850,所以我打开keil的内存窗口并键入此基本地址。根据寄存器的保存方式,我检查该基地地址的第7位32位值,以便检查我的程序计数器(设置内存窗口以显示未签名长的值)。我看到第7个32位有0x200050Fa的值,所以我转到装配窗口,我跟踪这个地址,大会最终将我指向我的循环在用户的连接中,代码困扰着。
非常感谢你,我设法弄清楚代码被困在哪里,它在global_int_start()中;为什么会这样,有什么线索吗?我正在附上一张照片。
正如我所说,如果看门狗已启用,那时候对于获得它的原因,我猜我们猜您已经增加了广告间隔的原因,而不是看门狗超时(2.6秒),因此该设备困在WFI()中等待从BLE永远不会出现的中断活动时间很遥远。
谢谢你的快速重播。
就像我说的那样,我不做其他任何其他事情,那么我上面呈现的其他任何事情。但为了确保广告间隔是可以的,我甚至将其设置为110(68.7毫秒),仍然没有任何工作。
OBS:如果注释以下代码行(其中插入“创建”和“启用”函数),则FW不会进入NMI处理程序。
static const struct prf_func_callbacks user_prf_funcs [] ={// {task_glps,app_glps_create_db,app_glps_enable},{TASK_NONE,NULL,NULL},//不要移动。必须永远是最后一个};
如果是这样的情况然后是在发送消息的情况下创建了数据库,请从未得到确认,检查消息的流程创建数据库时,是否邮件触发正确的处理程序?我想default_app_on_db_init_complete回调从不触发,你实现它永远不会创建它的数据库。当数据库完成后,您的FW会处理确认并发是否发送APP_Module_init_cmp_evt消息?检查Proximity Reporter并检查其他配置文件如何处理数据库创建。
你是对的,我不是为了发送“APP\u MODULE\u INIT\u CMP\u EVT”消息而处理“GLPS\u CREATE\u DB\u CFM”消息的。
查看接口规范.pdf,它表示“glps_create_db_cfm”具有“destination:task_api”。他们的意思是“目的地:task_app”吗?
使用“user_catch_rest_hndl”,我终于让它终于工作。
有没有方法可以使用catch rest cb的提示实现此消息处理,使用app_task和profle_task使用的内容?
static const struct ke_msg_handler app_glps_process_handlers [] ={{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或硬盘处理程序。
谢谢mt_dialog.
如果我禁用了看门狗(//#define CFG_WDOG),并通过放置断点,我可以验证代码从未达到wdg_重载(看门狗默认时段);但它确实到达了全球范围内的起点();这意味着它正在进入睡眠模式,即使我已经将app\u default\u sleep\u mode=ARCH\u sleep\u OFF;。为什么呢?
所有我所做的就是从“软件开发人员指南”中的“使用空项目模板”之后,并且在我已经将血糖配置文件中包含到项目中。
然后我已经进行了以下更改,以使其工作:
OBS:我已经介绍了所需的所有.h文件,并且项目编译没有任何错误。如果我没有将GLP与项目一起包含GLP,则代码也适用,宣传和一切。
---------------------------------------------------------------------------------------------------------------------------------------------
user_config.h.
static const struct 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”
#include“glps.h”
-----------------------------------------------------------------------------------------------------------------------------------------------
user_glucose_application.c.
void app_glps_create_db(void)
{
结构glps\u create\u db\u req*req=KE\u MSG\u ALLOC(glps\u create\u db\u 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);
}
void app_glps_enable(uint16_t conhdl)
{
struct 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_lvl = 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);
void app_glps_create_db(void);
-------------------------------------------------------------------------------------------------------------------------------------------------
用户\模块\配置.h
#define consuldure_dlg_gap(0)
#define consuldure_dlg_timer(0)
#define outlude_dlg_msg(0)
#define consuldure_dlg_sec(0)
#define consuldure_dlg_diss(0)
#define consuldure_dlg_proxr(1)
#define consuldure_dlg_bass(1)
#define consuld_dlg_findl(1)
#define consuld_dlg_findt(1)
#define consuld_dlg_spotar(1)
#define consuld_dlg_custs1(1)
#define consuld_dlg_custs2(1)
-------------------------------------------------------------------------------------------------------------------------------------------------
我真的不知道一个人应该如何程序,以弄清楚代码卡的FW中的点。
所以你的意思是我应该检查地址0x81800和0x81850,并从那些我要查找pc值,这将指向它被卡住的代码的一部分?
我怎么做?
我正在拖动我在拖动期间发出的照片。
嗨费尔南多,
如果禁用看门狗,则没有理由重新加载看门狗,因为您没有使用它。如果定义看门狗,则重新加载的代码将进入执行。此外,由于您在不睡眠不下运行,因此通过global_int_start()代码的事实不是意味着设备睡眠,以便为设备睡眠,它必须输入检查模式睡眠是否睡眠的if()条件或mode_deep_sleep以便关闭电源域。尝试检查模板项目,我无法看到任何NMI执行,同时没有定义看门狗,所以即使您在代码中的某处未定义,您也可以启用它。总结,除非您拥有看门狗函数,否则我无法想到否则会发生nmi_handler。
关于调试和如何弄清楚代码丢失的位置,例如在模板项目上,我定义了看门狗并放置了一段时间(1);在user_on_connection()函数中,这意味着当我与设备连接时,代码将被困在(1)循环上,看门狗将导致我的nmi_handler()。因此,为了检查我的代码被困,我看到处理程序是NMI,因此Base_Address转储的ARM寄存器是0x81850,所以我打开keil的内存窗口并键入此基本地址。根据寄存器的保存方式,我检查该基地地址的第7位32位值,以便检查我的程序计数器(设置内存窗口以显示未签名长的值)。我看到第7个32位有0x200050Fa的值,所以我转到装配窗口,我跟踪这个地址,大会最终将我指向我的循环在用户的连接中,代码困扰着。
谢谢mt_dialog.
非常感谢你,我设法弄清楚代码被困在哪里,它在global_int_start()中;
为什么会这样,有什么线索吗?
我正在附上一张照片。
嗨费尔南多,
正如我所说,如果看门狗已启用,那时候对于获得它的原因,我猜我们猜您已经增加了广告间隔的原因,而不是看门狗超时(2.6秒),因此该设备困在WFI()中等待从BLE永远不会出现的中断活动时间很遥远。
谢谢mt_dialog.
谢谢你的快速重播。
就像我说的那样,我不做其他任何其他事情,那么我上面呈现的其他任何事情。但为了确保广告间隔是可以的,我甚至将其设置为110(68.7毫秒),仍然没有任何工作。
OBS:如果注释以下代码行(其中插入“创建”和“启用”函数),则FW不会进入NMI处理程序。
static const struct prf_func_callbacks user_prf_funcs [] =
{
// {task_glps,app_glps_create_db,app_glps_enable},
{TASK_NONE,NULL,NULL},//不要移动。必须永远是最后一个
};
嗨费尔南多,
如果是这样的情况然后是在发送消息的情况下创建了数据库,请从未得到确认,检查消息的流程创建数据库时,是否邮件触发正确的处理程序?我想default_app_on_db_init_complete回调从不触发,你实现它永远不会创建它的数据库。当数据库完成后,您的FW会处理确认并发是否发送APP_Module_init_cmp_evt消息?检查Proximity Reporter并检查其他配置文件如何处理数据库创建。
谢谢mt_dialog.
你是对的,我不是为了发送“APP\u MODULE\u INIT\u CMP\u EVT”消息而处理“GLPS\u CREATE\u DB\u CFM”消息的。
查看接口规范.pdf,它表示“glps_create_db_cfm”具有“destination:task_api”。他们的意思是“目的地:task_app”吗?
使用“user_catch_rest_hndl”,我终于让它终于工作。
有没有方法可以使用catch rest cb的提示实现此消息处理,使用app_task和profle_task使用的内容?
static const struct ke_msg_handler app_glps_process_handlers [] =
{
{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[]数组中。
谢谢mt_dialog.