Но не теоретические данные, т.к. скорость шины известна, а то что реально удалось получить на практике.
Т.к. по шине помимо полезных данных передаются управляющие сигналы, и реальная скорость ниже (зависит от условий).
Данный материал будет полезен новичкам при выборе способа связи между контроллерами.
За основу я взял тестовые программы с сайта http://neophob.com/2011/04/serial-laten ... s-arduino/
Протестировал rs-232 (1 000 000 бод) и i2c.
Вечером выложу результаты.
Если кто знает ссылку на подобные тесты прошу поделиться.
Интересует задержка между пакетами, и скорость передачи - количество байт в секунду.
Отдельно стоит рассмотреть производительность контроллера по сравнению со скоростью передачи.
Т.е. сколько ресурсов останется на исполнение полезной работы, но пока я не знаю как это посчитать.
Видимо нужен какой то тест типа расчёта числа pi,но достаточно лёгкий для 8ми разрядного контроллера.
алгоритм:
читаем пакеты определенного размера, замеряя время между пакетами, процедура повторяется 100 раз,
скорость = (размер пакета * 100/затраченное время)
I2C чтение данных с контроллера atmega168 16MHz = i2c 400kHz => OSIF = USB => ubuntu x86_64, через переходник OSIF http://www.robotfuzz.com/OSIF
- Код: Выделить всё • Развернуть
package size @ 1 bytes, latency: 9.99 ms average, 10.15 ms maximum, repeated 100 times speed=100 bytes/sec elased: 999.69 ms
package size @ 2 bytes, latency: 9.99 ms average, 11.04 ms maximum, repeated 100 times speed=200 bytes/sec elased: 999.75 ms
package size @ 12 bytes, latency: 10.99 ms average, 11.12 ms maximum, repeated 100 times speed=1091 bytes/sec elased: 1099.89 ms
package size @ 30 bytes, latency: 11.99 ms average, 12.05 ms maximum, repeated 100 times speed=2500 bytes/sec elased: 1199.82 ms
package size @ 62 bytes, latency: 14.99 ms average, 15.05 ms maximum, repeated 100 times speed=4133 bytes/sec elased: 1499.88 ms
package size @ 71 bytes, latency: 15.67 ms average, 16.16 ms maximum, repeated 100 times speed=4528 bytes/sec elased: 1567.81 ms
package size @ 128 bytes, latency: 19.99 ms average, 20.22 ms maximum, repeated 100 times speed=6400 bytes/sec elased: 1999.83 ms
package size @ 255 bytes, latency: 30.07 ms average, 31.02 ms maximum, repeated 100 times speed=8477 bytes/sec elased: 3007.81 ms
rs-232 чтение данных с контроллера atmega168 16MHz = UART 2000000 baud => FT232RL = USB => в программу ubuntu x86_64
- Код: Выделить всё • Развернуть
package size @ 1 bytes, latency: 2.03 ms average, 3.54 ms maximum, repeated 100 times speed=492 bytes/sec elased: 202.90 ms
package size @ 2 bytes, latency: 2.01 ms average, 3.47 ms maximum, repeated 100 times speed=995 bytes/sec elased: 200.86 ms
package size @ 12 bytes, latency: 2.02 ms average, 3.01 ms maximum, repeated 100 times speed=5944 bytes/sec elased: 201.86 ms
package size @ 30 bytes, latency: 2.01 ms average, 2.57 ms maximum, repeated 100 times speed=14933 bytes/sec elased: 200.89 ms
package size @ 62 bytes, latency: 2.11 ms average, 11.90 ms maximum, repeated 100 times speed=29397 bytes/sec elased: 210.91 ms
package size @ 71 bytes, latency: 2.02 ms average, 2.59 ms maximum, repeated 100 times speed=35164 bytes/sec elased: 201.91 ms
package size @ 128 bytes, latency: 3.03 ms average, 4.76 ms maximum, repeated 100 times speed=42152 bytes/sec elased: 303.66 ms
error reading result, r=0
rs-232 чтение данных с контроллера atmega168 16MHz = UART 1000000 baud => FT232RL = USB => в программу ubuntu x86_64
- Код: Выделить всё • Развернуть
package size @ 1 bytes, latency: 2.07 ms average, 9.69 ms maximum, repeated 100 times speed=483 bytes/sec elased: 206.98 ms
package size @ 2 bytes, latency: 2.07 ms average, 7.48 ms maximum, repeated 100 times speed=967 bytes/sec elased: 206.75 ms
package size @ 12 bytes, latency: 2.10 ms average, 11.50 ms maximum, repeated 100 times speed=5718 bytes/sec elased: 209.83 ms
package size @ 30 bytes, latency: 2.09 ms average, 9.55 ms maximum, repeated 100 times speed=14363 bytes/sec elased: 208.87 ms
package size @ 62 bytes, latency: 2.03 ms average, 3.12 ms maximum, repeated 100 times speed=30550 bytes/sec elased: 202.94 ms
package size @ 71 bytes, latency: 2.05 ms average, 3.54 ms maximum, repeated 100 times speed=34656 bytes/sec elased: 204.87 ms
package size @ 128 bytes, latency: 3.02 ms average, 4.49 ms maximum, repeated 100 times speed=42394 bytes/sec elased: 301.93 ms
package size @ 255 bytes, latency: 4.12 ms average, 14.60 ms maximum, repeated 100 times speed=61908 bytes/sec elased: 411.90 ms
rs-232 чтение данных с контроллера atmega168 16MHz = UART 115200 baud => FT232RL = USB => в программу ubuntu x86_64 таблица увеличена
- Код: Выделить всё • Развернуть
package size @ 1 bytes, latency: 2.09 ms average, 5.42 ms maximum, repeated 100 times speed=478 bytes/sec elased: 209.07 ms
package size @ 2 bytes, latency: 2.06 ms average, 5.28 ms maximum, repeated 100 times speed=971 bytes/sec elased: 205.88 ms
package size @ 12 bytes, latency: 3.01 ms average, 3.97 ms maximum, repeated 100 times speed=3987 bytes/sec elased: 300.95 ms
package size @ 30 bytes, latency: 5.10 ms average, 11.35 ms maximum, repeated 100 times speed=5884 bytes/sec elased: 509.82 ms
package size @ 62 bytes, latency: 7.14 ms average, 13.39 ms maximum, repeated 100 times speed=8684 bytes/sec elased: 713.92 ms
package size @ 71 bytes, latency: 8.06 ms average, 10.04 ms maximum, repeated 100 times speed=8810 bytes/sec elased: 805.82 ms
package size @ 128 bytes, latency: 13.07 ms average, 16.58 ms maximum, repeated 100 times speed=9794 bytes/sec elased: 1306.92 ms
package size @ 255 bytes, latency: 24.04 ms average, 25.82 ms maximum, repeated 100 times speed=10603 bytes/sec elased: 2404.83 ms
package size @ 500 bytes, latency: 45.06 ms average, 45.81 ms maximum, repeated 100 times speed=11094 bytes/sec elased: 4506.69 ms
package size @ 1000 bytes, latency: 89.08 ms average, 96.40 ms maximum, repeated 100 times speed=11224 bytes/sec elased: 8908.81 ms
package size @ 2000 bytes, latency: 175.09 ms average, 176.24 ms maximum, repeated 100 times speed=11422 bytes/sec elased: 17510.07 ms
package size @ 4000 bytes, latency: 349.00 ms average, 350.48 ms maximum, repeated 100 times speed=11461 bytes/sec elased: 34900.62 ms
package size @ 8000 bytes, latency: 695.05 ms average, 696.92 ms maximum, repeated 100 times speed=11509 bytes/sec elased: 69506.39 ms
Выводы: (Поправьте меня если я ошибаюсь)
1) Видно что в i2c большие задержки в самом протоколе, перед передачей каждого пакета происходит подключение к устройству, отправляется стартовый сигнал + адрес контроллера+ регистр который читаем.
с увеличением размера пакета , отношение полезныех даннын к служебным увеличивается поэтому скорость возрастает,
но всё равно сильно проигрывает uart, но имеет хорошее приемущество ввиде встроенной адрессации усстройств и регистров в устройствах.
2) С последовательным портом тоже не всё гладко, при маленьком размере пакета (или иначе говоря, при резмере пакетов не кратным размеру буфера в драйвере ОС), сильно прыгает задержка между передачами пакетов, хотя они передаются непрерывным потоком.
Так же отсутствует адрессация регистров в устройстве, т.е. нужен дополнительные протокол который возьмёт на себя работу по управлению данными внутри потока.
Дополнение:
Скорость последовательного интерфейса на STM32F103 72Mhz usb CDC (ChibiOS/RT Virtual COM Port)
OR-STM32-DS =>USB => в программу ubuntu x86_64
- Код: Выделить всё • Развернуть
package size @ 1 bytes, latency: 2.00 ms average, 2.36 ms maximum, repeated 100 times speed=500 bytes/sec errors: 0 elased: 199.87 ms
package size @ 2 bytes, latency: 2.00 ms average, 2.51 ms maximum, repeated 100 times speed=1001 bytes/sec errors: 0 elased: 199.78 ms
package size @ 12 bytes, latency: 2.06 ms average, 6.08 ms maximum, repeated 100 times speed=5814 bytes/sec errors: 0 elased: 206.37 ms
package size @ 30 bytes, latency: 1.99 ms average, 2.97 ms maximum, repeated 100 times speed=15052 bytes/sec errors: 0 elased: 199.30 ms
package size @ 62 bytes, latency: 2.01 ms average, 3.99 ms maximum, repeated 100 times speed=30866 bytes/sec errors: 0 elased: 200.86 ms
package size @ 64 bytes, latency: 2.01 ms average, 4.06 ms maximum, repeated 100 times speed=31862 bytes/sec errors: 0 elased: 200.86 ms
OR-STM32-DS =>USB =>USB HUB JET.A => в программу ubuntu x86_64
- Код: Выделить всё • Развернуть
package size @ 1 bytes, latency: 0.26 ms average, 0.77 ms maximum, repeated 100 times speed=3857 bytes/sec errors: 0 elased: 25.93 ms
package size @ 2 bytes, latency: 0.37 ms average, 5.94 ms maximum, repeated 100 times speed=5342 bytes/sec errors: 4 elased: 37.44 ms
package size @ 12 bytes, latency: 0.29 ms average, 3.21 ms maximum, repeated 100 times speed=40607 bytes/sec errors: 4 elased: 29.55 ms
package size @ 30 bytes, latency: 0.33 ms average, 5.10 ms maximum, repeated 100 times speed=90620 bytes/sec errors: 34 elased: 33.10 ms
package size @ 62 bytes, latency: 0.56 ms average, 18.62 ms maximum, repeated 100 times speed=110011 bytes/sec errors: 2 elased: 56.36 ms
package size @ 64 bytes, latency: 0.48 ms average, 7.01 ms maximum, repeated 100 times speed=133980 bytes/sec errors: 12 elased: 47.77 ms
Видно, что если подключить черз хаб скорость передачи возрастает но появляются ошибки.
Видимо в хабе есть буфер, поэтому он быстро принимает данные от компа, и быстро передаёт обратно, видимо на скорости USB 2.0 full speed, к сожалению тестовая программа не ведёт учёт очерёдности данных.
Я добавил простую проверку на количество принятых байт, но и это не гарантия, хотя даже с такой простой проверкой видно что связь не стабильная.
Так же видно что не важно будь то FT232RL или нативная поддержка USB в контроллере, минимальная задержка 2ms поэтому скорость обмена можно увеличивать только за счёт больших транзакции.