由于自定义设备上的项目限制,我正在将bluez 5.37移植回linux 2.6。我注意到gatttool在断开连接时会导致很高的CPU使用率。这很容易复制。在交互模式下使用gatttool连接到任何BLE设备,然后断开连接。在您给出断开连接命令之前,CPU的使用情况还不错。观察CPU使用率,gattool将超过70-80%。我也可以在Ubuntu LTS上复制它。有没有人去解决这个问题?
谢谢。
最佳答案
我想我发现了什么问题。 Gatttool使用glib主事件循环,因此io通道作为源附加到默认主上下文(请阅读glib文档以获取更多说明)。作为函数cmd_connect'g_io_add_watch(iochannel,G_IO_HUP,channel_watcher,NULL)'中'bluez/attrib/interactive.c'的示例,已完成。一旦io通道丢失或删除,此函数将返回一个必须从监视中删除的gsource。否则,glib将继续在此io通道(fd)上等待,并导致EINVAL作为返回码。 (我的知识是零散的,但是我想那是会发生的)。因此,在断开设备连接时,需要将 watch 取下。
我按照以下方式进行操作-定义新的全局-guint gsrc;
将cmd_connect中的行更改为gsrc = g_io_add_watch(iochannel, G_IO_HUP, channel_watcher, NULL);
断开连接后,在disconnect_io函数中返回之前-g_source_remove(gsrc);
这修复了交互式模式下gatttool cpu的使用错误。
关于linux - bluez 5.3+中的Gatttool断开连接会导致很高的cpu使用率(Linux蓝牙),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36289272/