1 hello对话框,
我使用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 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;
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.
你好,
首先我评论了加速部分,只需向手机发送一些常量数字,仍然崩溃。我发现该程序在断开连接后在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;
处理程序:
void timer0_general_user_callback_function(void)
{
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;
req-> handle = cust1_idx_sensor_val_val;
req-> length = def_cust1_sensor_val_char_len;
memcpy(req->值,&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);// 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文件中的堆的大小进行实验。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张Fri,2018-05-18 02下发布的修订问题吗?
如我上一篇文章所述,看门狗命中循环延迟模块(参见Fri,2018-05-18 02:41)如果我不使用长延迟,如何长时间重复运行计时器,说,1小时或更长时间?根据我的理解,只有在延迟期间,定时器处理程序事件将反复开火。
嗨敏感,
我不确定我是否达到看门狗问题,或者你究竟想做什么,但我想你遇到的原因是因为你有针对WatchDog到期时间而运行的计时器保持设备活动状态。我想出现问题,因为您不经过主循环的末尾,因此您不会更新看门狗定时器,在SDK的Main_Func()函数上有一段时间将继续更新WatchDog WDG_Reload(WatchDog_default_Period);如果您不经过该值才能刷新值,则将发生看门狗,并发出NMI()中断。您必须要做的是继续更新在其到期之前的看门狗的值。
谢谢,PM_DIALOG.