почему стоит открыть порт USB2Serial дороже, чем в первый раз - PullRequest
0 голосов
/ 20 сентября 2018

Я проверяю временные затраты на открытие USB2Serial порта n Centos 7.4.Но я нашел, что это стоило приблизительно 7 мс впервыеНо в следующем открытии это стоило гораздо больше времени.Если я увеличиваю время ожидания, запускаю снова, это стоит больше времени, кроме первого открытия.

Я использую usb2serial устройство от FTDI, драйвер ядра - ftdi_sio.

Вот мой код:

for (int i = 0; i < 10; i++)
{
    steady_clock::time_point start = steady_clock::now();
    int handle = open("/dev/ttyUSB0", O_RDWR| O_NONBLOCK | O_NDELAY);
    steady_clock::time_point end = steady_clock::now();
    std::cout << "Item " << i <<  ":" << " " << duration_cast<std::chrono::nanoseconds>(end-start).count()/1000000 << " ms" << endl;
    usleep(10000); // us
    close(handle);
}

Результат:

Элемент 0: 6 мс

Элемент 1: 76 мс

Элемент 2: 75 мс

Элемент 3: 75 мс

Элемент 4: 75 мс

Элемент 5: 76 мс

Элемент 6: 75 мс

Элемент 7: 75 мс

Элемент 8: 75 мс

Элемент 9: 74 мс

Мне просто интересно, почему открытоевремя становится больше после первого раза.Может быть, нужна другая операция перед закрытием.

Кто-нибудь сталкивался с подобной проблемой?Или какие-либо комментарии?Спасибо

1 Ответ

0 голосов
/ 20 сентября 2018

std::chrono::duration_cast возвращает std::chrono::duration объект .

printf функция - старая функция совместимости с C, и поэтому ничего не знает об объектах C ++.

Короче говоря, то, что вы печатаете, на самом деле не является продолжительностью, вместо этого у вас есть неопределенное поведение! Учитывая, что вы находитесь в Ubuntu, вы используете либо GCC, либо Clang, оба компилятора, которые должны жаловаться на это.

Если вы хотите напечататьфактическая длительность "count", затем используйте функцию-член count, предпочтительно вместе с std::cout, чтобы получить безопасные для типов преобразования:

std::cout << "Item " << i << ": " << duration_cast<std::chrono::nanoseconds>(e1-s1).count() << " ns\n";

Или, если ваш компилятор может обрабатывать некоторыеиз изменений в будущем стандарте C ++ 20 (который определяет перегрузку operator<< для длительностей):

std::cout << "Item " << i << ": " << duration_cast<std::chrono::nanoseconds>(e1-s1) << " ns\n";

Большой урок: не смешивайте C ++и старые функции Си.Они редко очень хорошо сочетаются.

Возможно, вы захотите получить несколько хороших книг , которые помогут вам правильно изучить C ++.

...