Page 1 of 1
[求助]【tuyaos】PHY6222 关于软定时的使用
Posted: 2023年 Dec 27日 19:52
by luzhihui
1)开发包全称:PHY6222_TUYAOS_3.9.0
2)开启单次定时器,每次按键会重新复位定时器,复位定时器我是使用tal_sw_timer_start,每次start后我也获取剩余时间看了,确实是重置时间了,但是有时候还是会进到超时回调函数。
//创建定时器并启动
Code: Select all
tal_sw_timer_create(oled_pswd_enter_timeout_handlercb, NULL, &window_timer_id);
tal_sw_timer_start(window_timer_id,OLED_WINDOW_PSWD_ENTER_TIME_MS,TAL_TIMER_ONCE);
//当按键按下重置定时器
Code: Select all
tal_sw_timer_start(window_timer_id,OLED_WINDOW_PSWD_ENTER_TIME_MS,TAL_TIMER_ONCE);/* 重置定时器 */
uint32_t time=0;
tal_sw_timer_remain_time_get(window_timer_id,&time);
TAL_PR_INFO("retain time = %d!!!\n",time);
//定时器超时回调
Code: Select all
static void oled_pswd_enter_timeout_handlercb(TIMER_ID timer_id, VOID_T *arg)
{
TAL_PR_INFO("########ENTER PSWD timeout!!!###########\n");
tal_sw_timer_delete(timer_id);
}
log如下
[0000000026 ty I][oled_window.c:2325] WINDOW_PSWD_ENTER!!!
[0000000026 ty I][oled_window.c:2341] retain time = 25000!!!
[0000000026 ty I][oled_key.c:164] key=9 short down
[0000000026 ty I][oled_window.c:2325] WINDOW_PSWD_ENTER!!!
[0000000026 ty I][oled_window.c:2341] retain time = 25000!!!
[0000000027 ty I][oled_key.c:164] key=9 short down
[0000000027 ty I][oled_window.c:2325] WINDOW_PSWD_ENTER!!!
[0000000027 ty I][oled_window.c:2341] retain time = 25000!!!
[0000000068 ty I][oled_window.c:1385] ########ENTER PSWD timeout!!!###########
Re: [求助]【tuyaos】PHY6222 关于软定时的使用
Posted: 2023年 Dec 27日 20:12
by 逻辑的院子
可以参考app_key.c文件中的代码,有类似的应用方式
Re: [求助]【tuyaos】PHY6222 关于软定时的使用
Posted: 2023年 Dec 28日 09:09
by luzhihui
我只是想问下我这样使用定时器有什么问题或者隐患没?而且我不知道为什么重新start还会超时。
我按键没什么问题,做的功能是停留在一个显示页面,无按键操作超时返回功能
Re: [求助]【tuyaos】PHY6222 关于软定时的使用
Posted: 2023年 Dec 28日 10:04
by luzhihui
逻辑的院子 2023年 Dec 27日 20:12
可以参考app_key.c文件中的代码,有类似的应用方式
我只是想问下我这样使用定时器有什么问题或者隐患没?而且我不知道为什么重新start还会超时。
我按键没什么问题,做的功能是停留在一个显示页面,无按键操作超时返回功能,问题是我的超时定时器偶尔会出现即使我有按键操作还是超时了。
Re: [求助]【tuyaos】PHY6222 关于软定时的使用
Posted: 2023年 Dec 28日 10:10
by 逻辑的院子
根据您描述的方式进行了测试,并未遇到你描述的现象:
代码:
现象:
另外,app_key.c文件中的代码,有类似的应用方式,也没有遇到过类似问题,建议您参考使用
Re: [求助]【tuyaos】PHY6222 关于软定时的使用
Posted: 2023年 Dec 28日 12:06
by luzhihui
逻辑的院子 2023年 Dec 28日 10:10
根据您描述的方式进行了测试,并未遇到你描述的现象:
代码:
Snipaste_2023-12-28_10-08-16.jpg
现象:
Snipaste_2023-12-27_15-16-01.jpg
另外,app_key.c文件中的代码,有类似的应用方式,也没有遇到过类似问题,建议您参考使用
我现在做了一个简单测试,我的实际工程中还开了一个20MS循环定时器,一个50MS循环定时器,一个100MS循环定时器。所以我现在简单的模拟也同样开了这三个,复现出来了,但是很难复现出来。
下面是log
[11:59:52:209]
[11:59:52:575][0000000112 ty I][key_test.c:78] reset timer start 444
[11:59:52:576]
[11:59:52:842][0000000113 ty I][key_test.c:64] reset timer start 222
[11:59:52:842]
[11:59:53:092][0000000113 ty I][key_test.c:78] reset timer start 444
[11:59:53:093]
[11:59:53:342][0000000113 ty I][key_test.c:64] reset timer start 222
[11:59:53:342]
[11:59:53:559][0000000113 ty I][key_test.c:78] reset timer start 444
[11:59:53:559]
[11:59:53:842][0000000114 ty I][key_test.c:64] reset timer start 222
[11:59:53:842]
[11:59:54:025][0000000114 ty I][key_test.c:78] reset timer start 444
[11:59:54:025]
[11:59:54:326][0000000114 ty I][key_test.c:64] reset timer start 222
[11:59:54:326]
[11:59:54:809][0000000115 ty I][key_test.c:64] reset timer start 222
[11:59:54:809]
[11:59:55:293][0000000115 ty I][key_test.c:64] reset timer start 222
[11:59:55:294]
[11:59:55:492][0000000115 ty I][key_test.c:78] reset timer start 444
[11:59:55:492]
[11:59:55:775][0000000116 ty I][key_test.c:64] reset timer start 222
[11:59:55:776]
[11:59:55:992][0000000116 ty I][key_test.c:78] reset timer start 444
[11:59:55:992]
[11:59:56:258][0000000116 ty I][key_test.c:64] reset timer start 222
[11:59:56:259]
[11:59:56:509][0000000116 ty I][key_test.c:78] reset timer start 444
[11:59:56:509]
[11:59:56:758][0000000117 ty I][key_test.c:64] reset timer start 222
[11:59:56:758]
[11:59:56:992][0000000117 ty I][key_test.c:78] reset timer start 444
[11:59:56:992]
[11:59:57:242][0000000117 ty I][key_test.c:64] reset timer start 222
[11:59:57:243]
[11:59:57:457][0000000117 ty I][key_test.c:78] reset timer start 444
[11:59:57:458]
[11:59:57:726][0000000118 ty I][key_test.c:64] reset timer start 222
[11:59:57:726]
[11:59:57:942][0000000118 ty I][key_test.c:78] reset timer start 444
[11:59:57:943]
[11:59:58:192][0000000118 ty I][key_test.c:64] reset timer start 222
[11:59:58:192]
[11:59:58:224][0000000159 ty I][key_test.c:39] ##################reset timer timeout####################
[11:59:58:224]
[11:59:58:392][0000000159 ty I][key_test.c:78] reset timer start 444
[11:59:58:393]
[11:59:58:708][0000000159 ty I][key_test.c:64] reset timer start 222
[11:59:58:709]
[11:59:58:925][0000000160 ty I][key_test.c:78] reset timer start 444
Re: [求助]【tuyaos】PHY6222 关于软定时的使用
Posted: 2023年 Dec 28日 14:20
by 逻辑的院子
循环定时器的使用,理论上一个循环定时器通过标记位的方式就可以实现多个循环定时器的功能,避免直接使用多个循环定时器,降低系统复杂度
Re: [求助]【tuyaos】PHY6222 关于软定时的使用
Posted: 2023年 Dec 28日 17:09
by luzhihui
我做了三轮测试
系统中只有按键功能,且无其他循环定时器。
1.在按键中断的下降沿开定时器,上升沿关定时器(此定时器用于消抖及长按等判断,测试时候定时器回调没做处理),上升沿我就认为是按键按下,发送事件复位一个10秒定时器。这种情况下偶尔会出现10S定时器会超时。
2.在按键中断的下降沿不开定时器,上升沿不关定时器(定时器完全没使用),上升沿我就认为是按键按下,发送事件复位一个10秒定时器。这种情况下10S定时器不会超时。
3.开启一个定时器,定时时间是20MS-1000MS的随机值,每次超时的时候发送一个事件去复位10S定时器同时用随机值再次开启定时器。这种情况下10S定时器不会超时。
经过我大致的测试,大概是在GPIO中断回调中操作定时器导致的我复位定时器有问题。但是没找到最终的一个合理解释。想请教下,在GPIO中断回调中去操作定时器,会对整个定时器(timer_list)可能产生异常吗?我也看了sw timer的代码,关键操作都是有进临界的。
代码如下
Code: Select all
static key_check_t g_key_check;
STATIC TIMER_ID key_timer_id = NULL;
STATIC TIMER_ID reset_timer_id = NULL;
//发送事件
void event_test_msg_send(event_data_t *msg)
{
tuya_ble_custom_evt_send_with_data(APP_EVT_0, msg, sizeof(event_data_t));
}
//10超时回调
static void reset_timeout_handlercb(TIMER_ID timer_id, VOID_T *arg)
{
TAL_PR_INFO("##################reset timer timeout####################");
}
//按键事件处理 最终会在tuya_ble_app_data_process调用
void event_test_handle(void *rxdata)
{
event_data_t *rxmsg = (event_data_t *)rxdata;
switch(rxmsg->num)
{
case KEY_NUM_ADD:
{
TAL_PR_INFO("reset timer start 333");
tal_sw_timer_start(reset_timer_id,10000,TAL_TIMER_ONCE);
}
break;
case KEY_NUM_SUB:
{
TAL_PR_INFO("reset timer start 444");
tal_sw_timer_start(reset_timer_id,10000,TAL_TIMER_ONCE);
}
break;
default:
break;
}
}
//按键处理定时器
static void oled_key_check_timeout_handlercb(TIMER_ID timer_id, VOID_T *arg)
{
}
// 边沿沿中断处理回调
STATIC VOID_T oled_key_edge_handleCb(gpio_pin_e pin,gpio_polarity_e type)
{
event_data_t data;
/*当前没有按键按下检测*/
if(g_key_check.state == KEY_UP)
{
//下降沿 按键按下
if(type == POL_FALLING)
{
g_key_check.state = KEY_DOWN;
g_key_check.num = pin;
g_key_check.long_time = 0;
tal_sw_timer_start(key_timer_id,KEY_CHECK_TIMER_PERIOD,TAL_TIMER_CYCLE);//开启此处 偶尔出现10S超时
}
}
if(type == POL_RISING && pin == g_key_check.num)
{
tal_sw_timer_stop(key_timer_id);//开启此处 偶尔出现10S超时
data.num = g_key_check.num;
data.action = KEY_ACTION_SHORT_PRESS;
event_test_msg_send(&data);
g_key_check.state = KEY_UP;
g_key_check.num = KEY_NUM_DUMMY;
g_key_check.long_time = 0;
g_key_check.decode_time=0;
}
}
//key_test_init 按键初始化
void key_test_init()
{
/* POWER LOCK CHECK*/
hal_gpio_pull_set(OLED_ADD_KEY_PIN, GPIO_PULL_UP_S);
hal_gpioin_register(OLED_ADD_KEY_PIN, oled_key_edge_handleCb, oled_key_edge_handleCb);
hal_gpio_pull_set(OLED_SUB_KEY_PIN, GPIO_PULL_UP_S);
hal_gpioin_register(OLED_SUB_KEY_PIN, oled_key_edge_handleCb, oled_key_edge_handleCb);
//创建检测定时器
g_key_check.state = KEY_UP;
g_key_check.num = KEY_NUM_DUMMY;
g_key_check.long_time = 0;
tal_sw_timer_create(oled_key_check_timeout_handlercb, NULL, &key_timer_id);
tal_sw_timer_create(reset_timeout_handlercb, NULL, &reset_timer_id);
tal_sw_timer_start(reset_timer_id,10000,TAL_TIMER_ONCE);
}