由于自定义设备的项目限制,我使用bluez 5.37向后移植到linux 2.6。我注意到gatttool会在断开连接时导致非常高的CPU使用率。这很容易复制。在交互模式下使用gatttool连接到任何BLE设备然后断开连接。在使用disconnect命令之前,CPU使用率很低。观察CPU使用率,gatttool将超过70-80%。我也可以在Ubuntu LTS上复制它。有没有人去解决这个问题? 谢谢。
答案 0 :(得分:1)
我想我发现了什么是错的。 Gatttool使用glib主事件循环,因此io通道作为源附加到默认主要上下文(阅读glib文档以获得更多说明)。作为函数cmd_connect中的'bluez / attrib / interactive.c'中的示例'g_io_add_watch(iochannel,G_IO_HUP,channel_watcher,NULL)'完成。此函数将返回一个gsource,一旦io通道丢失或删除,该gsource必须从手表中删除。如果没有这个,glib将继续等待这个io通道(fd)并导致EINVAL作为返回码。 (我的知识不完整,但我想这就是发生的事情)。因此,在断开设备连接时,需要移除此手表。
我按照以下方式做到 - 定义一个新的全局 -
guint gsrc;
将cmd_connect中的行更改为
gsrc = g_io_add_watch(iochannel, G_IO_HUP, channel_watcher, NULL);
断开连接后,在return_io函数返回之前 - g_source_remove(gsrc);
这以交互模式修复了gatttool cpu使用错误。