你好对话框
我正在使用“app_easy_timer_modify()”,在修改后运行修改后的计时器时,我遇到了一些问题。
我的问题发生在当前超时与app_easy_timer_modify()调用冲突时。
我设法通过改变call_callback()函数来修复这个问题:
Static 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)];
如果(fn != timer_modified_handler)
{
timer_callbacks [APP_EASY_TIMER_HND_TO_IDX (timer_id)] =零;
modified_timer_callbacks [APP_EASY_TIMER_HND_TO_IDX (timer_id)] =零;
}
fn ();
}
}
其他的
{
ASSERT_WARNING (0);
}
}
所以现在我测试超时是否在计时器上,它目前正在被修改,如果是,我不删除/ NULL回调函数。
首先,如果在本例中它们被设置为NULL,那么数组索引将为创建其他计时器提供自由,这是错误的,因为正在修改计时器,因此索引将被重用。所以在同一时间点创建一个新的计时器,会引起问题。
其次,如果设置为NULL,则cancel_timer_handler()中的修改过程,即行“else if (timer_callbacks[i] == timer_modified_handler)”将不能工作,修改后的计时器将永远不会重新启动新的延迟。
你能确认我的观察结果,并确认我的修正吗?
我的修正可以吗?
或者我应该做些别的事情来让它工作?
最好的问候,
Ciano霜
嗨ciano,
我假设你提到情况计时器即将消逝,但app_easy_timer_modify()已经设法改变回调成假的回调,所以当定时器实际上流逝,将执行假的回调,而不是实际的回调?你指的是这种情况吗?我不确定这样的事情是否可能,因为当app_easy_timer_modify()运行时,它将在更改回调之前清除计时器,因此虚拟回调应该永远不会发生。如果你正在经历这样的事情,那么它是一个竞争条件,修复看起来它覆盖了一个特定的时间,这个问题很可能发生,但再次我不能确定它是否会覆盖所有的计时情况。我会在SDK团队上为此开具一张罚单,但作为请求,我希望你报告你所经历的是否可以复制?如果可以复制,你能分享代码以便我们这边复制这个吗?
由于MT_dialog
你好对话框
是的,我可以复制计时器的问题。
是的,我可以试着选择导致问题发生的代码,这样你就会有一个小例子,它重现了问题。不过我需要一些时间。
最好的问候,
Ciano
嗨,对话框中,
你有没有“non -public”的地方,我可以上传代码,这就产生了这个问题?
最好的问候,
Ciano霜
嗨ciano,
请使用此链接上传文件https://diasemi.egnyte.com/ul/def6jR26jd.
由于MT_dialog
嗨对话框
复制该问题的代码已发送。
最好的问候,
Ciano霜
你好,对话框,
你看过我们发给你的代码了吗?
最好的问候,
Ciano霜
嗨ciano,
我已经在SDK团队发送了复制问题的代码,以便检查出这个并修复SDK上存在的任何问题,关于你的代码,我没有看到任何问题,可能是由你在call_callback中放置的mod引起的。您只需使用旧的计时器执行虚拟回调,并且将创建一个具有修改值的新计时器,并像使用前一个回调时那样到期。我想你会接受的。
由于MT_dialog