1你好对话框中,
我使用Timer0遇到问题,并每次都崩溃。在我的应用程序中,我想使用Timer0反复对传感器数据进行采样,例如每2ms(500Hz),然后将数据发送回Android手机。以前我使用app_easy_timer运行良好,但由于Easy_Timer的最小时间间隔为10ms,因此我切换到Timer0。我测试了Timer0样本项目,似乎工作正常,所以我修改了样本并将其添加到我的代码中:
//为timer0标志,从电话端接收
BOOL运行=真;
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,0,0,0,0,0},
.pos = 0,
};
/ /回调
void timer0_general_user_callback_function(void)
{
Uint8_t val_acc[3] = {0, 0, 0};
get_accel(val_acc);
if(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-> handle = cust1_idx_sensor_val_val;
req-> length = def_cust1_sensor_val_char_len;
memcpy(req->值,&data_buff.data,def_cust1_sensor_val_char_len);
KE_MSG_SEND(REQ);
}
}
void 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);// 2000US.
//开启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;
处理程序:
void timer0_general_user_callback_function(void)
{
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;
req-> handle = cust1_idx_sensor_val_val;
req-> length = def_cust1_sensor_val_char_len;
memcpy(请求- >值、&val_acc DEF_CUST1_SENSOR_VAL_CHAR_LEN);
KE_MSG_SEND(REQ);
}
设置:
void 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文件中的堆的大小进行实验。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小时或更长时间?根据我的理解,只有在延迟期间,计时器处理程序事件才会重复触发。
嗨,多愁善感,
我不确定我是否达到看门狗问题,或者你究竟想做什么,但我想你遇到的原因是因为你有针对WatchDog到期时间而运行的计时器保持设备活动状态。我想出现问题,因为您不经过主循环的末尾,因此您不会更新看门狗定时器,在SDK的Main_Func()函数上有一段时间将继续更新WatchDog WDG_Reload(WatchDog_default_Period);如果您不经过该值才能刷新值,则将发生看门狗,并发出NMI()中断。您必须要做的是继续更新在其到期之前的看门狗的值。
谢谢,PM_Dialog