我的问题似乎与https://svn.boost.org/trac10/ticket/10496有关。
只需打开一个boost串口并等待数据就会导致其中一个cpu 嵌入式CPU的核心有100%的使用率。
我的硬件是运行Ubuntu 16.04的redpitaya STEMLAB 125-14。一些相关的 代码片段如下:
// In the header
namespace ba = boost::asio;
typedef std::shared_ptr < boost::asio::serial_port serial_port_ptr;
typedef std::shared_ptr<boost::asio::io_service::work> work_ptr;
class SerialPort {
boost::asio::io_service m_io_service;
serial_port_ptr m_port;
work_ptr m_work;
bool open(const std::string &portname);
};
// in the source file,
bool SerialPort::open(const std::string &portname) {
m_port = serial_port_ptr(new ba::serial_port(m_io_service));
m_work = work_ptr(new ba::io_service::work(m_io_service));
m_port->open(portname, ec);
if (ec) {
std::cout << "open failed" << std::endl;
return false;
}
m_io_service.reset();
std::thread t(boost::bind(&ba::io_service::run, &m_io_service));
t.detach();
}
如果我注释掉最后两行,我得到0%的cpu利用率。代码有效 很好,我可以从串口读取和发送。 USB串口是一个usb 串口设备(这有什么效果吗?)。
之前是否还有其他人遇到此问题,并且之前有解决方法 由促进开发者“修复”或我做错了什么?
编辑:我最初认为硬件可能不够强大,所以我在i7笔记本电脑上的VMWare上安装了Ubuntu。并使用USB串行设备仅运行其上的串行代码,我获得了相同的结果 - 在一个核心上100%的CPU使用率。我理解在没有看到完整代码的情况下很难提供帮助,因此我创建了一个简单的代码来演示问题:可以从goo.gl/FD5RNE下载。为简单起见,代码只查找USB串行设备,并尝试打开它找到的第一个设备。
如果从sp.open()中删除注释,您将看到cpu使用率接近完全利用率。感谢。
编辑:仍然没有解决方案,但由于我不希望串行设备向客户端发送未经请求的消息,我已将程序更改为始终关闭端口,即写入/读取与端口打开一起执行阅读后关闭。
到目前为止,这种方法运行良好,我的平均CPU大约为0-0.8%。也许未来的升级更新将解决问题。