使用timer0时APP崩溃

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
9个帖子/ 0新
最后发表
伤感
离线
最后看到:3年1个月前
加入:2016-11-28 15:55
使用timer0时APP崩溃

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()来启用计时器,应用程序断开与电话和崩溃。
你能提供一些建议吗?

设备:
伤感
离线
最后看到:3年1个月前
加入:2016-11-28 15:55
为了使用Timer0,我

为了使用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;
还是同样的问题。

PM_Dialog
离线
最后看到:1天22小时前
工作人员
加入:2018-02-08 11:03
嗨,多愁善感,

嗨,多愁善感,

为了更好地了解你的问题,你能说明你的代码在哪里崩溃吗?设备断开后,你的代码去哪里?正如我能够在您的代码片段中看到的,您在计时器运行时获得加速度计的值,因此这可能是一个问题。你能否在调试模式下运行你的代码,以检查是否命中了WDOG或出现了NMI ?请注意,睡眠模式配置不会影响您的应用程序。

谢谢,PM_Dialog

伤感
离线
最后看到:3年1个月前
加入:2016-11-28 15:55
你好,

你好,
首先,我评论了加速部分,只是发送一些常量号码到手机,仍然崩溃。我发现程序停止在wrap_platform_reset后断开:
空白wrap_platform_reset (uint32_t错误)

assert_warning(错误== reset_after_spota_update);//在Spota重置的情况下不要破裂
platform_reset_func(错误);

错误代码似乎是RESET_MEM_ALLOC_FAIL (0xF2F2F2F2),不确定为什么会发生这种情况。

伤感
离线
最后看到:3年1个月前
加入:2016-11-28 15:55
现在我试图制作timer0

现在我试图制作Timer0_general_User_CallBack_Function一个空函数,但应用程序仍然崩溃,我发现它在(正在运行)时停止。

伤感
离线
最后看到:3年1个月前
加入:2016-11-28 15:55
修改后:

修改后:

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_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(请求- >值、&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循环,并dring有限的延迟,应用程序应该以减少的时间发送数据包从100,99,98等。
1、使用当前延迟参数,话机可以接收3个包。但是它们都是相同的,以98开始,而不是{100,…},{99年……}, {98, ...}.
2、当增加延迟参数,或使用while循环,应用程序断开与手机和点击看门狗。

PM_Dialog
离线
最后看到:1天22小时前
工作人员
加入:2018-02-08 11:03
嗨,多愁善感,

嗨,多愁善感,

关于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

伤感
离线
最后看到:3年1个月前
加入:2016-11-28 15:55
你好,

你好,
关于wrap_platform_reset()问题,我认为我已经通过减少连接间隔解决了这个问题。然而,看门狗的问题并没有得到解决。你能再检查一下我在周五2018-05-18 02:41发布的修改后的问题吗?因为你在帖子中没有提到这个。
正如我在上一篇文章中提到的,看门狗点击for循环延迟模块(见文章2018-05-18 02:41)如果我不使用长延迟,怎么能重复运行计时器很长时间,比如,1小时或更多?根据我的理解,只有在延迟期间,timer handler事件才会重复触发。

PM_Dialog
离线
最后看到:1天22小时前
工作人员
加入:2018-02-08 11:03
嗨,多愁善感,

嗨,多愁善感,

我不确定我是否达到看门狗问题,或者你究竟想做什么,但我想你遇到的原因是因为你有针对WatchDog到期时间而运行的计时器保持设备活动状态。我想出现问题,因为您不经过主循环的末尾,因此您不会更新看门狗定时器,在SDK的Main_Func()函数上有一段时间将继续更新WatchDog WDG_Reload(WatchDog_default_Period);如果您不经过该值才能刷新值,则将发生看门狗,并发出NMI()中断。您必须要做的是继续更新在其到期之前的看门狗的值。

谢谢,PM_Dialog