内核定时器(app_timer_set)的准确性将受程序加载影响

4个帖子/ 0新
最后一篇
千岛
离线
最后一次露面:3年5个月前
加入:2016-01-15 01:32
内核定时器(app_timer_set)的准确性将受程序加载影响

我需要一个计时器来计算每秒甚至睡眠模式。因此,我设置了一个内核计时器和处理程序,如下所示。
int app_ble_timer_handler(xxx)
{
gbletimer ++;
app_timer_set(sps_timer,task_app,100);//1秒
return(ke_msg_consumed);
}

在主循环时,我通过UART打印变量GBletimer,结果的准确性是可接受的。在循环中添加延迟进入主时,让说3秒钟,我期待在那些3秒钟内延迟,应该更新变量gbletimer,但情况并非如此。我尝试做的是模拟有程序加载(读写RFID标签,测量会影响内核定时器的电池电压)。

设备:
mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
嗨Jackiechau,

嗨Jackiechau,

内核定时器由内核处理,这意味着当Timer_Handler函数执行调度器时的时间必须检查队列中是否存在计时器以执行相应的回调函数。调度程序在主循环中运行(是RWIP_Schedule()函数)如果您停止主循环,则调度程序将延迟调度消息,因此将延迟计时器回调的执行。

谢谢mt_dialog.

千岛
离线
最后一次露面:3年5个月前
加入:2016-01-15 01:32
嗨mt_dialog,

嗨mt_dialog,

理解,但我需要每秒计算,无论程序加载有多重,所以请建议我应该将“gbletimer ++”放入以获得准确的计数值,谢谢。

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
嗨Jackiechau,

嗨Jackiechau,

它不可建议在系统中长时间停滞,因为即使是循环中的延迟延迟也可能会定期调度,所以你也可能错过关键的BLE事件(也许你不会去能够保持链接)。它可建议如果代码耗时,如果可能,如果可能的话,对于较小的块以定期执行rwip_schedule()以便定期执行(从app_asynch_trm返回true以强制580保持唤醒,请运行RWIP_Schedule()再次继续执行代码)。

在您的情况下,您可以尝试使用580的定时器并计数(当设备睡眠时,它们被关闭)或者您可以尝试在设备睡觉时睡着了嵌入式和硬件定时器时嵌入式计时器并且有可能的代码虽然将失去系统。

谢谢mt_dialog.