NMI发生在代码开始执行之后。代码崩溃,甚至当看门狗禁用(//#define CFG_WDOG),因为外设没有开始广告,所以我猜它崩溃了。
我怎么知道代码在哪里卡住了?它是通过PC寄存器值吗?你能解释一下这是怎么做的吗?看门狗超时后,PC值为0x200005F0。
谢谢你。
嗨费尔南多,
当fw崩溃并进入Hardfault或NMI_Handler时,当这种情况发生时,fw将ARM寄存器的值存储在两个特定的基址0x81800和0x81850。因此,您可以从内存窗口检查PC计数器的值,以及应用程序崩溃的确切位置。事实上,你注释掉NMI和你的代码崩溃并不意味着fw击中了NMI_Handler(最有可能它没有,因为你没有定义看门狗)。程序计数器,当监管机构已经发生的值,直接指向当前执行的命令,所以你不能够使用,如果你的弗兰克-威廉姆斯打敝中断或Hardfault,因为电脑会点敝中断或Hardfault处理程序。
谢谢mt_dialog.
如果我禁用看门狗(//#定义cfg_wdog),并且通过放置断点,我可以验证代码从未到达wdg_recoad(watchdog_default_period);但它确实达到global_int_start();这意味着它即使我已经设置了app_default_sleep_mode = arch_sleep_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.
空白app_glps_create_db(空白){struct 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(要求的);}
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;/ /请求- > = 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(要求的);}-------------------------------------------------------------------------------------------------------------------user_glucosensor_application.h.
空白app_glps_enable (uint16_t conhdl);void app_glps_create_db(void);--------------------------------------------------------------------------------------------------------------------user_modules_config.h.
#定义EXCLUDE_DLG_GAP (0)#定义EXCLUDE_DLG_TIMER (0)#define outlude_dlg_msg(0)#定义EXCLUDE_DLG_SEC (0)#定义EXCLUDE_DLG_DISS (0)#define consuldure_dlg_proxr(1)#define consuldure_dlg_bass(1)#定义EXCLUDE_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。
关于调试和如何找出你的代码停滞的地方,例如在模板项目上,我已经定义了看门狗并放置了一个while(1);在user_on_connection()函数中,这意味着当我连接到一个设备时,代码将在while(1)循环中卡住,看门狗将引导我到NMI_Handler()。所以为了检查我的代码是否卡住了,我看到Handler是NMI,所以ARM寄存器被转储的BASE_ADDRESS是0x81850,所以我从keil打开一个内存窗口并输入这个基地地址。根据寄存器是如何保存的,我检查第7位的基地地址的值,以检查我的程序计数器(设置您的内存窗口显示在unsigned长)。我看到第7位的值是0x200050FA,所以我去到程序集窗口并跟踪这个地址,程序集最终将指向用户连接中的while(1)循环,在那里代码卡住了。
非常感谢你,我设法弄清楚代码被困在哪里,它在global_int_start()中;为什么会发生这种情况,任何线索?我正在附上一张照片。
正如我所说,如果看门狗已启用,那时候NMI将发生,关于得到它的原因,我猜你已经增加了广告间隔超过看门狗超时(2.6秒),所以设备卡在WFI()等待一个从未到来的中断,因为BLE事件是远远在时间。
谢谢你的快速回放。
就像我说的那样,我不做其他任何其他事情,那么我上面呈现的其他任何事情。但为了确保广告间隔是可以的,我甚至将其设置为110(68.7毫秒),仍然没有任何工作。
obs:如果下面的代码行(插入了"create"和"enable"函数)有注释,则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并检查其他配置文件如何处理数据库创建。
您是对的,我没有处理“Glps_create_db_cfm”消息,以便发送“app_module_init_cmp_evt”消息。
查看接口规范.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)任务的目的地TASK_PROXR和确认proxr_create_db_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崩溃并进入Hardfault或NMI_Handler时,当这种情况发生时,fw将ARM寄存器的值存储在两个特定的基址0x81800和0x81850。因此,您可以从内存窗口检查PC计数器的值,以及应用程序崩溃的确切位置。事实上,你注释掉NMI和你的代码崩溃并不意味着fw击中了NMI_Handler(最有可能它没有,因为你没有定义看门狗)。程序计数器,当监管机构已经发生的值,直接指向当前执行的命令,所以你不能够使用,如果你的弗兰克-威廉姆斯打敝中断或Hardfault,因为电脑会点敝中断或Hardfault处理程序。
谢谢mt_dialog.
如果我禁用看门狗(//#定义cfg_wdog),并且通过放置断点,我可以验证代码从未到达wdg_recoad(watchdog_default_period);但它确实达到global_int_start();这意味着它即使我已经设置了app_default_sleep_mode = arch_sleep_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.
空白app_glps_create_db(空白)
{
struct 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(要求的);
}
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;
/ /请求- > = 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(要求的);
}
-------------------------------------------------------------------------------------------------------------------
user_glucosensor_application.h.
空白app_glps_enable (uint16_t conhdl);
void app_glps_create_db(void);
--------------------------------------------------------------------------------------------------------------------
user_modules_config.h.
#定义EXCLUDE_DLG_GAP (0)
#定义EXCLUDE_DLG_TIMER (0)
#define outlude_dlg_msg(0)
#定义EXCLUDE_DLG_SEC (0)
#定义EXCLUDE_DLG_DISS (0)
#define consuldure_dlg_proxr(1)
#define consuldure_dlg_bass(1)
#定义EXCLUDE_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。
关于调试和如何找出你的代码停滞的地方,例如在模板项目上,我已经定义了看门狗并放置了一个while(1);在user_on_connection()函数中,这意味着当我连接到一个设备时,代码将在while(1)循环中卡住,看门狗将引导我到NMI_Handler()。所以为了检查我的代码是否卡住了,我看到Handler是NMI,所以ARM寄存器被转储的BASE_ADDRESS是0x81850,所以我从keil打开一个内存窗口并输入这个基地地址。根据寄存器是如何保存的,我检查第7位的基地地址的值,以检查我的程序计数器(设置您的内存窗口显示在unsigned长)。我看到第7位的值是0x200050FA,所以我去到程序集窗口并跟踪这个地址,程序集最终将指向用户连接中的while(1)循环,在那里代码卡住了。
谢谢mt_dialog.
非常感谢你,我设法弄清楚代码被困在哪里,它在global_int_start()中;
为什么会发生这种情况,任何线索?
我正在附上一张照片。
嗨费尔南多,
正如我所说,如果看门狗已启用,那时候NMI将发生,关于得到它的原因,我猜你已经增加了广告间隔超过看门狗超时(2.6秒),所以设备卡在WFI()等待一个从未到来的中断,因为BLE事件是远远在时间。
谢谢mt_dialog.
谢谢你的快速回放。
就像我说的那样,我不做其他任何其他事情,那么我上面呈现的其他任何事情。但为了确保广告间隔是可以的,我甚至将其设置为110(68.7毫秒),仍然没有任何工作。
obs:如果下面的代码行(插入了"create"和"enable"函数)有注释,则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.
您是对的,我没有处理“Glps_create_db_cfm”消息,以便发送“app_module_init_cmp_evt”消息。
查看接口规范.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)任务的目的地TASK_PROXR和确认proxr_create_db_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.