提升串口100%cpu使用率

时间:2018-04-07 18:43:30

标签: c++ boost boost-asio

我的问题似乎与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%。也许未来的升级更新将解决问题。

0 个答案:

没有答案
相关问题