init third里有两个中断引脚初始化 试过去掉初始化会能够正常进入长链接 不然一旦conn param update 后第一次唤醒就会导致一直在mainloop里跑循环无法进入suspend 同时蓝牙和gpio中断业务都失效
泰凌微tuyaos3.9.0开发遇到长链接后无法进中断问题
Re: 泰凌微tuyaos3.9.0开发遇到长链接后无法进中断问题
leslieli 2024年 May 13日 15:48init third里有两个中断引脚初始化 试过去掉初始化会能够正常进入长链接 不然一旦conn param update 后第一次唤醒就会导致一直在mainloop里跑循环无法进入suspend 同时蓝牙和gpio中断业务都失效
我尝试把 main 里面irq_enable() 分别放到init normal里最后和 user_init_deepRetn里 init third 之前就正常 但是如果一个中断频繁触发的话 会导致整个死机
Re: 泰凌微tuyaos3.9.0开发遇到长链接后无法进中断问题
- 针对泰凌微tuyaos3.9.0这个版本的外部GPIO中断业务失效的问题 init third 中 对GPIO 初始化的问题可以试下如下操作 :
在tkl_gpio.c中的 tkl_gpio_irq、irq_pin、irq_idx 这几个变量前怎加 attribute_no_ret_bss 修饰
如图所示: - 问题里说的无法进入suspend 是怎么判定的?泰凌的低功耗有两种,一种是suspend 一种是deepsleep,两种的最低电流和唤醒后的启动入口是不一样的, conn param update 后更新的连接参数是多少? SDK会通过下次唤醒的时间来选择休眠的最优选择是deepsleep还是suspend。
Re: 泰凌微tuyaos3.9.0开发遇到长链接后无法进中断问题
你说的方式我已经加了 现在我找到的一个解决方法是把 main 里面irq_enable() 分别放到init normal里最后和 user_init_deepRetn里 init third 之前 判断进入suspend我是在进入之前把打印标志位 发现是 到 bls_pm_setSuspendMask(SUSPEND_ADV | DEEPSLEEP_RETENTION_ADV | SUSPEND_CONN | DEEPSLEEP_RETENTION_CONN); 这里 正常情况下长链接 跟 adv一样会进低功耗 只是间隔短了我这里是120ms 但是如果是我老的程序的话 进入长链接状态的第一次 init third 之后 程序就一直在mainloop里跑 能进到bls_pm_setSuspendMask(SUSPEND_ADV | DEEPSLEEP_RETENTION_ADV | SUSPEND_CONN | DEEPSLEEP_RETENTION_CONN); 但是无法进入 app_suspend_enter 这个回调 所以我怀疑是不是blt_sdk_main_loop()这里在处理低功耗状态下的长链接里出了点问题导致程序无法进入低功耗模式
Re: 泰凌微tuyaos3.9.0开发遇到长链接后无法进中断问题
telink芯片在deepsleep休眠后需要再次初始化(TuyaOS中需要在tuya_init_third 函数中填入需要再次初始化的函数),需要先deinit再init ,但tkl_gpio中即不允许重复初始化,又没有对deinit的实现,所以实际上deepsleep之后GPIO IRQ没有被初始化,进而出现之前反馈的系列问题。故建议直接用原厂接口先解决这个问题。
在即将发布的3.11.0版本这类问题都已经解决。