Каковы накладные расходы при насыщенном последовательном соединении со скоростью 256 кбит/с?
Я собрал несколько arduino в сети RS485 (подключен к Rx/Tx на arduino и использую последовательное соединение через один из них www.ebay.co.uk/itm/272929871278) - RS485, потому что он распространяется на довольно большое расстояние - общая линейная проводка около 200 м.
Мой вопрос: если у меня есть Master, Slave1 и Slave2 на шине, и связь работает на полной скорости в каналах связи между Master и Slave1, то каковы ожидаемые накладные расходы обработчика прерываний на Slave2 при вводе входящего трафика в кольцевой буфер? (так как это RS485, все устройства, которые не отправляют, видят весь трафик)
Моя оценка "палец в воздухе" составляет около 5% -15% при 256 тыс. бод и будет масштабироваться довольно линейно со скоростью передачи данных.
У кого-нибудь есть окончательный ответ на этот вопрос или кто-нибудь может указать на какое-либо профилирование, сделанное по этому вопросу?
@Simm, 👍1
Обсуждение1 ответ
Лучший ответ:
Поэтому я решил, что небольшое эмпирическое тестирование не помешает. Это делается с помощью nano (328P)
Используя простой цикл for в цикле() (вычисление квадратов от 0 до 255) в течение 10 секунд с последовательным трафиком и без него и на разных скоростях.
Примечание: это без какой - либо проверки кольцевого буфера входящих данных-просто измерение накладных расходов, связанных с трафиком по проводу. Трафик по проводу был максимальным, который arduino mega мог передавать с такой скоростью передачи данных.
No load: 2600462 iterations
256k: 2381219 iterations
2M: 1349142 iterations
256k takes 8.5% of the runtime
2M takes 48% of the runtime
Блок кода в соответствии с запросом для устройства, выполняющего синхронизацию (он включает вызовы библиотек, которые я использую для своей среды, но я уверен, что вы можете абстрагировать их от чего-то другого и не должен иметь значения для статистики)
uint32_t start_time;
void setup() {
init_serial();
start_time = millis();
}
uint32_t count = 0;
uint16_t foo;
void loop() {
byte buff[MESSAGE_BUFFER_SIZE];
if (millis() - start_time < 10000){
for(int i = 0; i<256; i++) {
foo = i * i;
}
count++;
}
else {
if (getMessage(buff)) {
char msg[30];
sprintf(msg, "Count: %lu ---", count);
send_debug_message(msg);
}
}
}
код расскажет нам, что на самом деле означал тест, более подробно, чем примечание. это также облегчило бы повторение и проверку результатов теста, @Abel
- Почему Serial.Write работает медленнее при записи x+1 символов, чем при записи x символов?
- Асимметричное шифрование на Teensy?
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
Многое зависит от вашего программного обеспечения. У меня нет информации о той части, которую вы используете, можете ли вы разместить ссылку, содержащую техническую информацию, а не информацию о продажах., @Gil
@Gil технические вопросы на самом деле не имеют отношения к делу. Просто считайте, что все, отправленное любым аппаратным последовательным устройством Arduino по ссылке, принимается любым другим Arduino через аппаратный последовательный, @Simm
@Gil что касается программного обеспечения. На самом деле это не имеет значения. Давайте предположим, что цикл-это просто занятый цикл, выполняющий простые математические операции и подсчитывающий, сколько раз он обходит цикл за 10 секунд., @Simm
@Simm Подсчитывает тактовые циклы, используемые ISR в различных ситуациях (процент использования буфера - пустой, наполовину заполненный, переполнение и т.д.). Вычислите количество тактовых циклов, которые будут проходить в течение периода передачи одного байта. Займись математикой. Вот тебе и ответ., @Majenko