Каковы накладные расходы при насыщенном последовательном соединении со скоростью 256 кбит/с?

serial performance

Я собрал несколько arduino в сети RS485 (подключен к Rx/Tx на arduino и использую последовательное соединение через один из них www.ebay.co.uk/itm/272929871278) - RS485, потому что он распространяется на довольно большое расстояние - общая линейная проводка около 200 м.

Мой вопрос: если у меня есть Master, Slave1 и Slave2 на шине, и связь работает на полной скорости в каналах связи между Master и Slave1, то каковы ожидаемые накладные расходы обработчика прерываний на Slave2 при вводе входящего трафика в кольцевой буфер? (так как это RS485, все устройства, которые не отправляют, видят весь трафик)

Моя оценка "палец в воздухе" составляет около 5% -15% при 256 тыс. бод и будет масштабироваться довольно линейно со скоростью передачи данных.

У кого-нибудь есть окончательный ответ на этот вопрос или кто-нибудь может указать на какое-либо профилирование, сделанное по этому вопросу?

, 👍1

Обсуждение

Многое зависит от вашего программного обеспечения. У меня нет информации о той части, которую вы используете, можете ли вы разместить ссылку, содержащую техническую информацию, а не информацию о продажах., @Gil

@Gil технические вопросы на самом деле не имеют отношения к делу. Просто считайте, что все, отправленное любым аппаратным последовательным устройством Arduino по ссылке, принимается любым другим Arduino через аппаратный последовательный, @Simm

@Gil что касается программного обеспечения. На самом деле это не имеет значения. Давайте предположим, что цикл-это просто занятый цикл, выполняющий простые математические операции и подсчитывающий, сколько раз он обходит цикл за 10 секунд., @Simm

@Simm Подсчитывает тактовые циклы, используемые ISR в различных ситуациях (процент использования буфера - пустой, наполовину заполненный, переполнение и т.д.). Вычислите количество тактовых циклов, которые будут проходить в течение периода передачи одного байта. Займись математикой. Вот тебе и ответ., @Majenko


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