1你好对话框中,
我使用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 custs1_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);
申请- > 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
你好,
首先,我评论了accel部分,只是给手机发送了一些常量号码,但还是崩溃了。我发现程序在断开连接后在wrap_platform_reset处停止:
空白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为空函数,但应用程序仍然崩溃,我发现它在运行时停止了。
修改后:
Volatile uint8_t times = 100;
处理程序:
空白timer0_general_user_callback_function(空白)
{
Uint8_t val_acc[4] = {0, 1, 2, 3};
val_acc[0] =乘以,;
struct custs1_val_ntf_req* req = KE_MSG_ALLOC_DYN(custs1_val_ntf_req, task_cust1,TASK_APP,custs1_val_ntf_req,DEF_CUST1_SENSOR_VAL_CHAR_LEN);
申请- > conhdl = app_env - > conhdl;
申请- >处理= CUST1_IDX_SENSOR_VAL_VAL;
申请- >长度= DEF_CUST1_SENSOR_VAL_CHAR_LEN;
memcpy(请求- >值、&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);/ / 2女士
//开启SWTIM_IRQn irq
timer0_enable_irq ();
/ /开始Timer0
timer0_start ();
/ /有限的延迟
For (int I = 0;我< 0 xffff;我+ +){
For (int j = 0;j < 0 x10;j + +) {}
}
set_tmr_enable (CLK_PER_REG_TMR_DISABLED);
}
我将while循环替换为for循环,并驱动有限延迟,应用程序应该发送数据包的次数从100、99、98等减少。
1、使用当前延迟参数,话机可以接收3个数据包。但它们都是以98开头的,而不是{100,…},{99年……}, {98, ...}.
2、当增加延时参数,或使用while循环时,应用程序断开与手机的连接,并点击看门狗。
嗨,多愁善感,
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:41)发布的修改后的问题吗?因为你在帖子中没有提到这个问题。
正如我在上一篇文章中提到的,看门狗点击for循环延迟模块(见文章,2018-05-18 02:41),如果我不使用长延迟,如何能长时间重复运行计时器,比如,1小时或更长时间?根据我的理解,只有在延迟期间,计时器处理程序事件才会重复触发。
嗨,多愁善感,
我不确定如果我得到的监管问题,或者到底是什么你想做的,但我认为你所经历的原因是因为你有计时器运行超过监管机构即将到期的时间,让设备保持活跃。我认为问题的发生是因为你没有通过主循环的结束,因此你没有更新看门狗定时器,在SDK的main_func()函数有一个while循环,将继续更新看门狗wdg_reload(WATCHDOG_DEFAULT_PERIOD);如果你不通过它来刷新值,那么看门狗将出现并发出一个NMI()中断。您必须做的是在看门狗到期之前不断更新它的值。
谢谢,PM_Dialog