Re: 【求助】【TuyaOS OS】使用蓝牙 Mesh 设备开发包 TuyaOS 版本3.5.0 TLSR825X OTA 更新经常性会失败
没有得到解决
简单、多彩、自由讨论
https://tuyaos.com/
没有得到解决
我这边复现验证了下你的问题,设置了 5ms 的硬件中断,并在中断回调中执行 sleep,强制占用 1ms,并使用 ellisys 抓空中包。APP 发出了 ATT write CMD 数据,但是设备的 GATT 回调并未被调用,说明数据并未接收成功,大概率是 timer 中断抢占,导致蓝牙中断无法触发。
Tlsr825x 并无中断优先级的配置,有几个优化的方向,你可以试一下:
Code: Select all
int blt_notify_config(void *p){
// todo stop timer
return 0;
}
#if USE_TUYA_BLE_GATT_SERVICE
#define MY_ATTRIBUTE_USER_DATA_TRANSFER \
{MAX_TUYA_OTA_ATT_NUM, &att_perm_auth_read, 2,2,(u8*)(&my_primaryServiceUUID), (u8*)(&my_user_data_service_UUID), 0},\
\
{0,&att_perm_auth_read, 2, 1,(u8*)(&my_characterUUID), (u8*)(&my_userdata_out_prop), 0},/*prop*/ \
{0,&att_perm_auth_rdwd, 16,1,(u8*)(&my_userdata_out_UUID), (my_userdata_outData), 0, 0},/*value*/ \
{0,&att_perm_auth_read, 2,sizeof (my_userdata_out_Name),(u8*)(&userdesc_UUID), (u8*)(my_userdata_out_Name), 0}, \
{0,&att_perm_auth_rdwd, 2, sizeof(userdata_Out_ccc),(u8*)(&clientCharacterCfgUUID), (u8*)(userdata_Out_ccc), 0,blt_notify_config},/*value*/ \
\
{0,&att_perm_auth_read, 2, 1,(u8*)(&my_characterUUID), (u8*)(&my_userdata_in_prop), 0},/*prop*/ \
{0,&att_perm_auth_rdwd, 16,1,(u8*)(&my_userdata_in_UUID), (my_userdata_inData), &tkl_ble_service_userdata_write, 0},/*value*/ \
{0,&att_perm_auth_read, 2,sizeof (my_userdata_in_Name),(u8*)(&userdesc_UUID), (u8*)(my_userdata_in_Name), 0},\
{0,&att_perm_auth_rdwd, 2, sizeof(userdata_In_ccc),(u8*)(&clientCharacterCfgUUID), (u8*)(userdata_In_ccc), 0},/*value*/
#endif
joey_nobug 2023年 Jun 6日 17:48我这边复现验证了下你的问题,设置了 5ms 的硬件中断,并在中断回调中执行 sleep,强制占用 1ms,并使用 ellisys 抓空中包。APP 发出了 ATT write CMD 数据,但是设备的 GATT 回调并未被调用,说明数据并未接收成功,大概率是 timer 中断抢占,导致蓝牙中断无法触发。
Tlsr825x 并无中断优先级的配置,有几个优化的方向,你可以试一下:
- 增大 timer 的周期;
- 在控制外设时,如果无数据传输则关闭 timer,在通信时再开启 timer;
- timer 中断回调函数中 执行时间尽量短,如果对时序没有特别强的要求,可以通过置标志位的方法,在 loop 函数中做业务处理;
- 在 app_att.c 中做如下处理,在 APP 使能 OTA GATT 服务时,就关闭 timer,有可能能提高部分成功率
Code: Select all
int blt_notify_config(void *p){ // todo stop timer return 0; } #if USE_TUYA_BLE_GATT_SERVICE #define MY_ATTRIBUTE_USER_DATA_TRANSFER \ {MAX_TUYA_OTA_ATT_NUM, &att_perm_auth_read, 2,2,(u8*)(&my_primaryServiceUUID), (u8*)(&my_user_data_service_UUID), 0},\ \ {0,&att_perm_auth_read, 2, 1,(u8*)(&my_characterUUID), (u8*)(&my_userdata_out_prop), 0},/*prop*/ \ {0,&att_perm_auth_rdwd, 16,1,(u8*)(&my_userdata_out_UUID), (my_userdata_outData), 0, 0},/*value*/ \ {0,&att_perm_auth_read, 2,sizeof (my_userdata_out_Name),(u8*)(&userdesc_UUID), (u8*)(my_userdata_out_Name), 0}, \ {0,&att_perm_auth_rdwd, 2, sizeof(userdata_Out_ccc),(u8*)(&clientCharacterCfgUUID), (u8*)(userdata_Out_ccc), 0,blt_notify_config},/*value*/ \ \ {0,&att_perm_auth_read, 2, 1,(u8*)(&my_characterUUID), (u8*)(&my_userdata_in_prop), 0},/*prop*/ \ {0,&att_perm_auth_rdwd, 16,1,(u8*)(&my_userdata_in_UUID), (my_userdata_inData), &tkl_ble_service_userdata_write, 0},/*value*/ \ {0,&att_perm_auth_read, 2,sizeof (my_userdata_in_Name),(u8*)(&userdesc_UUID), (u8*)(my_userdata_in_Name), 0},\ {0,&att_perm_auth_rdwd, 2, sizeof(userdata_In_ccc),(u8*)(&clientCharacterCfgUUID), (u8*)(userdata_In_ccc), 0},/*value*/ #endif
1.2.3点 我都做过尝试,但是业务需求,控制协议对时序是MS级别的,需要随时检测是否有控制器接入,所以这三点应该作用不大。
第4点 跟我现在使用的方式类似,通过检测OTA服务开始的时候关闭TIMER,有一定的作用,但是会出现检测不到OTA开始的情况。函数如我提问的。
那目前来看对于你现在的应用没有特别好的处理办法了。
跟原厂也沟通过,原厂给的回复是 提高系统时钟的主频会有所改善,但是目前 mesh SDK 系统时钟已经最高了 48M。目前 Tlsr825x 系列是没有中断嵌套的,这中业务的处理确实比较难。
现在中断回调里执行的时间是多久,能测一下吗,开始结束都操作下 GPIO 然后用示波器或者逻辑分析仪测一下
joey_nobug 2023年 Jun 8日 10:52那目前来看对于你现在的应用没有特别好的处理办法了。
跟原厂也沟通过,原厂给的回复是 提高系统时钟的主频会有所改善,但是目前 mesh SDK 系统时钟已经最高了 48M。目前 Tlsr825x 系列是没有中断嵌套的,这中业务的处理确实比较难。现在中断回调里执行的时间是多久,能测一下吗,开始结束都操作下 GPIO 然后用示波器或者逻辑分析仪测一下
这个时间我测试过,因为我的检测通信协议是基于ADC 检测电压来判断时序,所以在中断中需要检测ADC, 耗费时间830us