【求助】【TuyaOS OS】使用蓝牙 Mesh 设备开发包 TuyaOS 版本3.5.0 TLSR825X OTA 更新经常性会失败

蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等


勇敢牛牛不怕代码难
Posts: 15

NICE 2023年 Jun 6日 16:00

你好,请问问题解决了吗?解决的话我们就关闭该问题了。关于OTA的指令可以在关闭高频定时器的环境下正常OTA时打印收到的app的每一条数据做个对比。

没有得到解决

User avatar
joey_nobug
Posts: 116

Re: 【求助】【TuyaOS OS】使用蓝牙 Mesh 设备开发包 TuyaOS 版本3.5.0 TLSR825X OTA 更新经常性会失败

我这边复现验证了下你的问题,设置了 5ms 的硬件中断,并在中断回调中执行 sleep,强制占用 1ms,并使用 ellisys 抓空中包。APP 发出了 ATT write CMD 数据,但是设备的 GATT 回调并未被调用,说明数据并未接收成功,大概率是 timer 中断抢占,导致蓝牙中断无法触发。
Tlsr825x 并无中断优先级的配置,有几个优化的方向,你可以试一下:

  1. 增大 timer 的周期;
  2. 在控制外设时,如果无数据传输则关闭 timer,在通信时再开启 timer;
  3. timer 中断回调函数中 执行时间尽量短,如果对时序没有特别强的要求,可以通过置标志位的方法,在 loop 函数中做业务处理;
  4. 在 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
    
    
Talk is cheap, show me the code.
勇敢牛牛不怕代码难
Posts: 15

Re: 【求助】【TuyaOS OS】使用蓝牙 Mesh 设备开发包 TuyaOS 版本3.5.0 TLSR825X OTA 更新经常性会失败

joey_nobug 2023年 Jun 6日 17:48

我这边复现验证了下你的问题,设置了 5ms 的硬件中断,并在中断回调中执行 sleep,强制占用 1ms,并使用 ellisys 抓空中包。APP 发出了 ATT write CMD 数据,但是设备的 GATT 回调并未被调用,说明数据并未接收成功,大概率是 timer 中断抢占,导致蓝牙中断无法触发。
Tlsr825x 并无中断优先级的配置,有几个优化的方向,你可以试一下:

  1. 增大 timer 的周期;
  2. 在控制外设时,如果无数据传输则关闭 timer,在通信时再开启 timer;
  3. timer 中断回调函数中 执行时间尽量短,如果对时序没有特别强的要求,可以通过置标志位的方法,在 loop 函数中做业务处理;
  4. 在 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开始的情况。函数如我提问的。

User avatar
joey_nobug
Posts: 116

Re: 【求助】【TuyaOS OS】使用蓝牙 Mesh 设备开发包 TuyaOS 版本3.5.0 TLSR825X OTA 更新经常性会失败

那目前来看对于你现在的应用没有特别好的处理办法了。
跟原厂也沟通过,原厂给的回复是 提高系统时钟的主频会有所改善,但是目前 mesh SDK 系统时钟已经最高了 48M。目前 Tlsr825x 系列是没有中断嵌套的,这中业务的处理确实比较难。

现在中断回调里执行的时间是多久,能测一下吗,开始结束都操作下 GPIO 然后用示波器或者逻辑分析仪测一下

Talk is cheap, show me the code.
勇敢牛牛不怕代码难
Posts: 15

Re: 【求助】【TuyaOS OS】使用蓝牙 Mesh 设备开发包 TuyaOS 版本3.5.0 TLSR825X OTA 更新经常性会失败

joey_nobug 2023年 Jun 8日 10:52

那目前来看对于你现在的应用没有特别好的处理办法了。
跟原厂也沟通过,原厂给的回复是 提高系统时钟的主频会有所改善,但是目前 mesh SDK 系统时钟已经最高了 48M。目前 Tlsr825x 系列是没有中断嵌套的,这中业务的处理确实比较难。

现在中断回调里执行的时间是多久,能测一下吗,开始结束都操作下 GPIO 然后用示波器或者逻辑分析仪测一下

这个时间我测试过,因为我的检测通信协议是基于ADC 检测电压来判断时序,所以在中断中需要检测ADC, 耗费时间830us

Post Reply