почему close () занимает намного больше времени, чем write () в последовательном и как сделать write () на 100% синхронным - PullRequest
0 голосов
/ 09 июля 2019

Задача моей программы - записать в последовательный порт следующее:

@@020102030000000000000000000002

... Далее следует новая строка. По словам Стрейса, данные выводятся, но время кажется не подходящим. Я пытаюсь отправить данные последовательно в микроконтроллер через последовательное соединение 56 Кбит / с.

open("/dev/ttyS0", O_WRONLY|O_NOCTTY|O_SYNC) = 3 <0.000076>
write(3, "@"..., 1)                     = 1 <0.000023>
write(3, "@"..., 1)                     = 1 <0.000009>
nanosleep({0, 100000}, {134521857, 3085980016}) = 0 <0.000966>
write(3, "020102030000000000000000000002"..., 30) = 30 <0.000038>
nanosleep({0, 100000}, {134521857, 3085980016}) = 0 <0.000747>
write(3, "\n"..., 1)                    = 1 <0.000008>
ioctl(3, TCFLSH, 0x2)                   = 0 <0.000008>
close(3)                                = 0 <0.001707>
open("/dev/ttyS0", O_RDONLY|O_NOCTTY|O_SYNC) = 3 <0.000075>
nanosleep({0, 1000}, NULL)              = 0 <0.000709>
read(3, ^C <unfinished ...>

Я предполагаю, что числа в < > в выводе строки приведены в микросекундах.

Когда я смотрю на цифры и делаю свои собственные расчеты, для отправки всех 33 байтов данных требуется 5,72 мс. Сложение всех этих чисел не равно этому. Когда я снял смыв

ioctl(3, TCFLSH, 0x2)                   = 0 <0.000008>

И использовал strace, я получил следующее:

open("/dev/ttyS0", O_WRONLY|O_NOCTTY|O_SYNC) = 3 <0.000076>
write(3, "@"..., 1)                     = 1 <0.000023>
write(3, "@"..., 1)                     = 1 <0.000009>
nanosleep({0, 100000}, {134521857, 3086340464}) = 0 <0.000984>
write(3, "020102030000000000000000000002"..., 30) = 30 <0.000038>
nanosleep({0, 100000}, {134521857, 3086340464}) = 0 <0.000722>
write(3, "\n"..., 1)                    = 1 <0.000008>
close(3)                                = 0 <0.004835>
open("/dev/ttyS0", O_RDONLY|O_NOCTTY|O_SYNC) = 3 <0.000076>
nanosleep({0, 1000}, NULL)              = 0 <0.000655>
read(3, ^C <unfinished ...>

Предполагается, что почти вся последовательная обработка выполняется ПОСЛЕ последней выполненной команды записи байтов. Это проблематично, потому что я хочу, чтобы чтение началось примерно через 1 мс после записи, а не через 6 мс позже.

Есть ли способ настроить все так, чтобы каждая запись показала нормальное время ожидания для записи символов вместо постановки в очередь времени ожидания, пока не будет выполнено закрытие?

например, я бы хотел, чтобы это выглядело более похоже на strace ...

write(3, "020102030000000000000000000002"..., 30) = 30 <0.004638>

не это:

write(3, "020102030000000000000000000002"..., 30) = 30 <0.000038>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...