1 hello对话框,
我使用timer0有问题,应用程序每次都崩溃。在我的应用程序中,我希望使用timer0重复采样传感器数据,比如每2ms(500Hz)一次,然后将数据发送回Android手机。以前我使用app_easy_timer工作得很好,但是由于easy_timer的最小时间间隔是10毫秒,所以我切换到timer0。我测试了timer0样本项目,似乎工作良好,所以我修改了样本,并将其添加到我的代码中,如:
// timer0的标志,从电话端接收
Bool running = true;
struct user_data_buffer data_buff = {
.SIZE = 20,
. data = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
.pos = 0,
};
// 打回来
空白timer0_general_user_callback_function(空白)
{
uint8_t val_acc [3] = {0,0,0};
get_accel (val_acc);
如果(data_buff。Pos < 18) {
data_buff.data [data_buff。pos + +] = val_acc [0];
data_buff.data [data_buff.pos ++] = val_acc [1];
data_buff.data [data_buff.pos ++] = val_acc [2];
}
其他{
data_buff。pos = 0;
//通过ble发送数据
struct musts1_val_ntf_req * req = ke_msg_alloc_dyn(custs1_val_ntf_req,
task_custs1,
task_app,
custs1_val_ntf_req,
DEF_CUST1_SENSOR_VAL_CHAR_LEN);
req-> conhdl = app_env-> conhdl;
申请- >处理= CUST1_IDX_SENSOR_VAL_VAL;
申请- >长度= DEF_CUST1_SENSOR_VAL_CHAR_LEN;
memcpy(请求- >价值,&data_buff。数据,DEF_CUST1_SENSOR_VAL_CHAR_LEN);
ke_msg_send(要求的);
}
}
空白timer0_setup ()
{
//停止计时器输入设置
timer0_stop();
//注册SWTIM_IRQn的irq回调函数
timer0_register_callback(timer0_general_user_callback_function);
//启用TIMER0时钟
set_tmr_enable (CLK_PER_REG_TMR_ENABLED);
//设置TIMER0、TIMER2时钟划分因子为8,则TIM0 Fclk为F = 16MHz/8 = 2Mhz
set_tmr_div(clk_per_reg_tmr_div_8);
//清除PWM设置寄存器不产生PWM
timer0_set_pwm_high_counter(no_pwm);
timer0_set_pwm_low_counter (NO_PWM);
//设置定时器的2MHz源时钟除以10,因此Fclk = 2MHz/10 = 200kHz
timer0_init(tim0_clk_32k,pwm_mode_one,tim0_clk_div_by_10);
timer0_set_pwm_on_counter (RELOAD_2000US);/ / 2000
//启用SWTIM_IRQN IRQ
timer0_enable_irq();
//启动Timer0.
timer0_start();
在跑步的时候);
set_tmr_enable(clk_per_reg_tmr_disabled);
}
问题是当我调用timer0_setup()来启用计时器时,该应用程序断开电话和崩溃。
你能提供一些建议吗?
为了使用timer0,我也通过更改(user_config.h)来关闭休眠模式:
const static sleep_state_t app_default_sleep_mode = arch_ext_sleep_on;
到
const static sleep_state_t app_default_sleep_mode = arch_sleep_off;
仍然是同样的问题。
嗨敏感,
你能澄清你在哪里崩溃的地方,以便更好地了解你的问题吗?设备断开连接后,您的代码在哪里?由于我能够在代码段中看到,因此在计时器运行时获得加速度计的值,因此可能是一个问题。您能否请在调试模式下运行代码,以检查WDOG命中或NMI是否已发生?请注意睡眠模式配置不会影响您的应用程序。
谢谢,PM_DIALOG.
你好,
首先我评论了加速部分,只需向手机发送一些常量数字,仍然崩溃。我发现该程序在断开连接后在Wrap_platform_Reset停止:
void wrap_platform_reset(UINT32_T错误)
{
ASSERT_WARNING(错误= = RESET_AFTER_SPOTA_UPDATE);//在SPOTA重置的情况下不中断
platform_reset_func(错误);
}
似乎错误代码是reset_mem_alloc_fail(0xf2f2f2f2),不确定为什么会发生这种情况。
现在我试图使timer0_general_user_callback_function为空函数,但应用程序仍然崩溃,我发现它在运行时停止了。
修改:
挥发性UINT8_T TIMES = 100;
处理程序:
空白timer0_general_user_callback_function(空白)
{
Uint8_t val_acc[4] = {0, 1, 2, 3};
val_acc[0] =乘以,;
struct musts1_val_ntf_req * req = ke_msg_alloc_dyn(custs1_val_ntf_req,task_custs1,task_app,custs1_val_ntf_req,def_cust1_sensor_val_char_len);
req-> conhdl = app_env-> conhdl;
申请- >处理= CUST1_IDX_SENSOR_VAL_VAL;
申请- >长度= DEF_CUST1_SENSOR_VAL_CHAR_LEN;
memcpy(req->值,&val_acc,def_cust1_sensor_val_char_len);
ke_msg_send(要求的);
}
设置:
空白timer0_setup ()
{
//停止计时器输入设置
timer0_stop();
* = 100;
//注册SWTIM_IRQn的irq回调函数
timer0_register_callback(timer0_general_user_callback_function);
//启用TIMER0时钟
set_tmr_enable (CLK_PER_REG_TMR_ENABLED);
//设置TIMER0、TIMER2时钟划分因子为8,则TIM0 Fclk为F = 16MHz/8 = 2Mhz
set_tmr_div(clk_per_reg_tmr_div_8);
//清除PWM设置寄存器不产生PWM
timer0_set_pwm_high_counter(no_pwm);
timer0_set_pwm_low_counter (NO_PWM);
//设置定时器的2MHz源时钟除以10,因此Fclk = 2MHz/10 = 200kHz
timer0_init(tim0_clk_32k,pwm_mode_one,tim0_clk_div_by_10);
//重新加载值100US()
timer0_set_pwm_on_counter(reload_100us * 20);// 2ms.
//启用SWTIM_IRQN IRQ
timer0_enable_irq();
//启动Timer0.
timer0_start();
/ /有限的延迟
for(int i = 0; i <0xffff; i ++){
for(int j = 0; j <0x10; j ++){}
}
set_tmr_enable(clk_per_reg_tmr_disabled);
}
我在循环到循环时替换,并打开有限延迟,该应用应该发送数据包,从100,99,98等中减少次数。
1,使用当前延迟参数,手机可以接收3个数据包。但所有这些都与98开始的相同,而不是{100,...},{99,...},{98,...}。
2,当增加延迟参数或在循环时使用时,应用程序与手机断开连接并点击看门狗。
嗨敏感,
wrap_platform_reset有关(),最明显的理由发生是由于内存分配失败,这意味着有一个内存泄漏你的软件,你分配数据的地方和你永远不会释放他们(您可以验证在函数的参数错误,应该RESET_MEM_ALLOC_FAIL)。为您的应用程序选择最优的堆,您应该通过改变da1458x_config_advanced.h文件中的堆大小来进行试验。没有办法确切知道应该堆的确切大小,您的应用程序应该有,但是如果我的假设是正确的,有一个内存泄漏,增加你的堆不会帮助的,它只会增加设备的时间最终会停止在一个平台复位。
当您尝试制作空Timer0_general_user_callback_function函数时,您的应用程序仍然崩溃在Wrap_platform_reset()或其他某处?看门狗击中,因为某些东西延迟了你的代码,所以你不应该长时间延迟。你能澄清看门狗击中的地方吗?
谢谢,PM_DIALOG.
你好,
关于wrap_platform_reset()问题我认为我通过减少连接间隔来修复它。但是,看门狗问题没有解决。你可以在2018-05-18 02张Fri,2018-05-18 02下发布的修订问题吗?
如我上一篇文章所述,看门狗命中循环延迟模块(参见Fri,2018-05-18 02:41)如果我不使用长延迟,如何长时间重复运行计时器,说,1小时或更长时间?根据我的理解,只有在延迟期间,定时器处理程序事件将反复开火。
嗨敏感,
我不确定如果我得到的监管问题,或者到底是什么你想做的,但我认为你所经历的原因是因为你有计时器运行超过监管机构即将到期的时间,让设备保持活跃。我认为问题的发生是因为你没有通过主循环的结束,因此你没有更新看门狗定时器,在SDK的main_func()函数有一个while循环,将继续更新看门狗wdg_reload(WATCHDOG_DEFAULT_PERIOD);如果你不通过它来刷新值,那么看门狗将出现并发出一个NMI()中断。您必须做的是在看门狗到期之前不断更新它的值。
谢谢,PM_DIALOG.