1你好对话框中,
我有使用定时器0的问题,和应用程序崩溃每次。在我的应用程序,我想使用定时器0采样传感器数据反复,也就是说,每2ms(500Hz的),然后将数据发送回的Android手机。以前我用app_easy_timer运作良好,但由于easy_timer为10ms的最小时间间隔,我切换到定时器0。我测试了定时器0示例项目,似乎工作正常,所以我修改了样品,并添加到我的代码如下所示:
//为timer0标志,从电话端接收
bool的运行= TRUE;
Struct user_data_buffer data_buff = {
.SIZE = 20,
。数据= {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;
req->手柄= CUST1_IDX_SENSOR_VAL_VAL;
req->长度= DEF_CUST1_SENSOR_VAL_CHAR_LEN;
的memcpy(req->值,&data_buff.data,DEF_CUST1_SENSOR_VAL_CHAR_LEN);
KE_MSG_SEND(REQ);
}
}
无效timer0_setup()
{
//停止进入设置的定时器
timer0_stop ();
//寄存SWTIM_IRQN IRQ的回调函数
timer0_register_callback (timer0_general_user_callback_function);
//允许定时器时钟
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);// 2000us
//开启SWTIM_IRQn irq
timer0_enable_irq ();
/ /开始Timer0
timer0_start ();
(运行时);
set_tmr_enable (CLK_PER_REG_TMR_DISABLED);
}
问题是,当我调用timer0_setup()来启用计时器时,应用程序与手机断开连接并崩溃。
你能提供一些建议吗?
为了使用定时器0,我还可以通过改变(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] = times--;
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;
req->手柄= CUST1_IDX_SENSOR_VAL_VAL;
req->长度= DEF_CUST1_SENSOR_VAL_CHAR_LEN;
memcpy(请求- >值、&val_acc DEF_CUST1_SENSOR_VAL_CHAR_LEN);
KE_MSG_SEND(REQ);
}
设置:
无效timer0_setup()
{
//停止进入设置的定时器
timer0_stop ();
倍= 100;
//寄存SWTIM_IRQN IRQ的回调函数
timer0_register_callback (timer0_general_user_callback_function);
//允许定时器时钟
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文件进行实验。There is no way to know exactly what should be the exact size of the heap that your application should have, but in case my assumption is correct and there is an memory leakage, increasing your heap won’t help, it will just increase the time that the device would eventually halt in a platform reset.
当您尝试创建一个空的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