你好对话框
我正在使用“app_easy_timer_modify()”,我有一些问题修改后修改的计时器运行。
当当前超时与对app_easy_timer_modify()的调用碰撞时,发生了我的问题。
我设法通过更改Call_callback()函数来解决问题:
静态void call_callback(const timer_hnd timer_id)
{
如果app_easy_timer_hnd_is_valid(timer_id)
{
if(timer_callbacks [app_easy_timer_hnd_to_idx(timer_id)]!= null)
{
timer_callback fn = timer_callbacks [app_easy_timer_hnd_to_idx(timer_id)];
if(fn!= timer_modified_handler)
{
timer_callbacks [app_easy_timer_hnd_to_idx(timer_id)] = null;
modified_timer_callbacks [app_easy_timer_hnd_to_idx(timer_id)] = null;
}
fn();
}
}
别的
{
assert_warning(0);
}
}
所以现在我测试超时是否在当前正在修改的计时器上,如果是,则我不会删除/ null到回调函数。
首先,如果在这种情况下,它们设置为null,那么阵列索引将免费为要创建的其他计时器,这是错误的,因为定时器正在修改,因此索引正在重用。所以在同一时间创建一个新的计时器勾选,会导致问题。
其次,如果设置为NULL,则CANCEL_TIMER_HANDLER()中的修改过程命名为“else(timer_callbacks [i] == timer_modified_modified_handler)”不起作用,并且修改的计时器永远不会使用新延迟重启。
您能否确认我的观察,并确认我的修正?
我的修正吗?
或者我应该做别的事情来实现这个工作吗?
此致,
Ciano Frost.
嗨Ciano,
我假设您提到了计时器即将经过的情况,但App_easy_timer_modify()已经成功地设法将回调更改为虚拟回调,因此当计时器实际上经过它将执行虚拟回调而不是实际回调?是你所指的情况?我不确定是否有这样的东西,因为它可以在更改回调之前清除定时器,因此永远不会发生虚拟回调。如果您正在遇到这样的内容,那么它的竞赛条件,修复程序看起来它涵盖了一定时间,即问题可能发生,但我无法确定它是否会覆盖所有定时情况。我会在SDK团队中发出一张票,但作为一个要求,我希望您报告您是否可以复制什么?如果可以复制,请您可以共享代码以便在我们身边复制这一点?
谢谢mt_dialog.
你好对话框
是的,我能够复制计时器问题。
是的,我可以尝试选择代码,这会导致问题发生,因此您将拥有一个小的示例,可再现问题。虽然我需要一些时间。
此致,
ciano
嗨对话框,
你有任何“无公共”的地方,我可以上传代码,它可以复制这个问题吗?
此致,
Ciano Frost.
嗨Ciano,
请使用此链接以上传文件https://diasemi.egnyte.com/ul/def6jr26jd.。
谢谢mt_dialog.
嗨对话框
已发送复制问题的代码。
此致,
Ciano Frost.
你好对话框,
你一直在寻找,我们发给你的代码吗?
此致,
Ciano Frost.
嗨Ciano,
我发送了在SDK团队中复制问题的代码,以便检查一下并修复SDK上存在的任何问题,就是我的代码,我没有看到可能由您放置在Call_callback中的mod引起的任何问题。您只需使用旧计时器执行虚拟回调,并且将创建具有修改值的新计时器,并将其过期,因为它应该使用以前的回调。我想你会好的。
谢谢mt_dialog.