你好,
我在app_on_connection上启动一个计时器。这个计时器在给定的时间后终止连接。如果用户在计时器结束前断开连接,则应取消计时器。这在用户在计时器结束之前断开连接的情况下是有效的,但它在计时器处理程序终止连接时给我一个错误。
根据我的理解,发生这种情况是因为当计时器过期时,传递给app_easy_timer_cancel的timer_id无效。然而,我认为添加一个检查像if(conn_timeout != EASY_TIMER_INVALID_TIMER){..就能解决这个问题。
1.)有人能告诉我为什么app_easy_timer_cancel仍然执行,即使我之前检查有效性?这是在app_on_disconnect上执行的代码片段。
printf_string(“用户断开连接! \ n \ r”);
如果(conn_timeout ! = EASY_TIMER_INVALID_TIMER) {
/ /取消计时器
Printf_string ("conn_timeout被取消,由于用户断开连接\n\r");
app_easy_timer_cancel (conn_timeout);
}
2.)我使用Keil的监视工具来监视conn_timeout的值。它最初是0x00,如果我在计时器结束之前连接和断开,它将保持这个值。然而,当计时器结束并执行conn_timeout的回调时,conn_timeout保持值0x03。即使我继续软件(当它在void app_easy_timer_cancel(const timer_hnd timer_id)中的ASSERT_WARNING(0)上卡住后),它仍然保持这个值。连接和断开仍然是可能的。这样做(比计时器周期快)也不会改变值0x03。
这个值是什么意思?当计时器结束或计时器被取消时,这个值不应该被重置为0x00吗?
亲切的问候,
Niek
嗨Niekvdd,
1)当你设置计时器计数,当计时器经过时,存储计时器句柄的句柄变量没有得到一个无效的值,如果你不显式地在计时器的回调中改变它,你检查的计时器句柄仍然有一个有效的计时器id。例如,当计时器结束并执行回调时,在计时器的回调存储中处理一个无效的值,在使用app_easy_timer_cancel()之前检查存储在该句柄中的值是否有效。
2)正如我上面提到的,变量存储定时器的句柄是在应用程序级别,并没有得到更新时,定时器的流逝,除非你显式地这样做。
由于MT_dialog
嗨MT_dialog,
在回调中将计时器处理程序设置为EASY_TIMER_INVALID_TIMER修复了这个问题。
谢谢你的帮助!
你能告诉我在哪里可以找到像EASY_TIMER_INVALID_TIMER这样的定义吗?
在UM-B-050和UM-B-051中提到了EASY_TIMER_INVALID_TIMER的定义。我是不是遗漏了一些文件?
我通过论坛知道这个值,但我认为会有更多定义的返回值,如EASY_TIMER_INVALID_TIMER。
(就像我之前问的,当定时器处理程序是有效的,它返回0x03;我能找到这些值的含义吗?)
亲切的问候,
Niek
嗨Niekvdd,
我认为没有任何文档提到这个定义,并不是所有SDK的定义和api都有文档。当你设置一个计时器时返回的值只是id值很长,因为它们与EASY_TIMER_INVALID_TIMER不同,它是一个有效的计时器id。
由于MT_dialog