Оптимизация кода LoRa sx1278 (скорость выполнения)

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Как ещё можно оптимизировать трансмиттер LoRa sx1278 ? Выходит ~ Циклов/с: 37911 на arduino nano. У кого-то получається больше ?  На ресивере идеал.. Циклов/с: 274922

Трансмиттер

#include <SPI.h>
#include <LoRa.h>
byte packet[16];
unsigned long timeout, timeoutBeginPacket, countCPU;
void setup() {
  packet[0] = 100;
  packet[1] = 120;
  packet[2] = 140;
  packet[3] = 160;
  packet[4] = 180;
  packet[7] = 255;
  Serial.begin(115200);
  while (!Serial);
  Serial.println("LoRa Transmiter");
  //Serial.println(!Serial);
  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    delay(200);
    while (1);
  }
  //LoRa.setSignalBandwidth(41.7E3); //defaults to 125E3. 7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3, 62.5E3, 125E3, 250E3, 500E3
  LoRa.setTxPower(20);
  //LoRa.setCodingRate4(8);
  //LoRa.setSpreadingFactor(6);
}

void loop() {
  packet[0]++;
  packet[1]++;
  packet[2]++;
  packet[3]++;
  packet[4]++;
  if (millis() - timeoutBeginPacket >= 50) {
    timeoutBeginPacket = millis();
    LoRa.beginPacket(); // Создайом пакет
    for ( byte i = 0; i < 8; i++) {
      LoRa.write(packet[i]);
    }
    LoRa.endPacket();
  }
  if (millis() - timeout >= 1000) {
    timeout = millis();
    Serial.print(" Цыклов/с: ");
    Serial.println(countCPU);
    countCPU = 0;
  }
  countCPU++;
  /*
    Serial.println (packet[0]);
    Serial.println (packet[1]);
    Serial.println (packet[2]);
    Serial.println (packet[3]);
    Serial.print ("Сигнал RSSI: ");
    Serial.println (LoRa.rssi());
  */

}

Ресивер

#include <SPI.h>
#include <LoRa.h>
byte p[16], countLora;
unsigned long timeout, countCPU;
void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println("LoRa Receiver");
  //Serial.println(!Serial);
  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    delay(200);
    while (1);
  }
  LoRa.onReceive(onReceive); //register the receive callback
  LoRa.receive();// put the radio into receive mode
  //LoRa.setSignalBandwidth(41.7E3);
  LoRa.setTxPower(20);
  //LoRa.setCodingRate4(8);
  //LoRa.setSpreadingFactor(6);
}

void loop() {
  if (millis() - timeout >= 1000) {
    timeout = millis();
    Serial.print(" Первый байт ");
    Serial.print(p[0]);
    Serial.print(" packetRSSI ");
    Serial.print(LoRa.packetRssi());
    Serial.print(" SNR ");
    Serial.print(LoRa.packetSnr());
    Serial.print(" RSSI ");
    Serial.print(LoRa.rssi());
    Serial.print(" Пакетов/с: ");
    Serial.print(countLora);
    Serial.print(" Цыклов/с: ");
    Serial.println(countCPU);
    countLora = 0;
    countCPU = 0;
  }
  countCPU++;
}
void onReceive(byte packetSize) {
  for ( byte i = 0; i < packetSize; i++) {
    p[i] = LoRa.read();
  }
  countLora++;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

и что, по вашему, означают эти цифры? - ничего. Это всего лишь число выполнений цикла Луп в секунду. В передатчике вы каждый раз обновляете массив packet[], а в приемнике вообще ничего не делаете, крутите пустой цикл.  Не удивительно, что во втором случае число больше.

как эти цифры связаны с быстродействием лора? - да никак

Ответьте лучше, что это за данные такие, что их нужно передавать с такой дикой частотой?

rkit
Offline
Зарегистрирован: 23.11.2016

b707 пишет:

Ответьте лучше, что это за данные такие, что их нужно передавать с такой дикой частотой?

Там всего 20Гц.

zDimaBY
Offline
Зарегистрирован: 10.06.2018

b707 пишет:

Не удивительно, что во втором случае число больше.

А в таком случаи меньше .. но ардуинка делает много лишнего в этом случаи..

#include <SPI.h>
#include <LoRa.h>
byte p[16], countLora;
unsigned long timeout, countCPU;
void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("LoRa Receiver");

  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {
  if (millis() - timeout >= 1000) {
    timeout = millis();
    Serial.print(" Первый байт ");
    Serial.print(p[0]);
    Serial.print(" packetRSSI ");
    Serial.print(LoRa.packetRssi());
    Serial.print(" SNR ");
    Serial.print(LoRa.packetSnr());
    Serial.print(" RSSI ");
    Serial.print(LoRa.rssi());
    Serial.print(" Пакетов/с: ");
    Serial.print(countLora);
    Serial.print(" Цыклов/с: ");
    Serial.println(countCPU);
    countCPU = 0;
  }
  countCPU++;
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // read packet
    for ( byte i = 0; LoRa.available(); i++) {
      p[i] = LoRa.read();
    }
    countLora = 0;
  }
}

b707 пишет:

а в приемнике вообще ничего не делаете, крутите пустой цикл

Да, и видете получаю пакеты с большим циклом выполнения..(когда приемник принимает пакеты циклов выполнений уменьшаться, а когда не принимает увеличивается) У вас есть идея сделать на передатчике также ?

b707 пишет:

как эти цифры связаны с быстродействием лора? - да никак

Я имел виду скорость выполнения ардуино.. А лора сколько сможет отправить. Тоесть как обратиться к лоре готова ли она отправить пакет чтобы не обновлять каждый раз массив packet[]

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

Я имел виду скорость выполнения ардуино.. А лора сколько сможет отправить. Тоесть как обратиться к лоре готова ли она отправить пакет чтобы не обновлять каждый раз массив packet[]

простите, я вас вообще не понимаю...   если не обновлять массив packet[], то какой смысл отправлять старые данные. те. что уже были отправлены?

Вы чего добиться то хотите? Какой вообще смысл измерять быстродействие пустой ардуины? Настоящую задачу можете изложить, а не этого сферического коня в вакууме?

zDimaBY
Offline
Зарегистрирован: 10.06.2018

b707 пишет:

если не обновлять массив packet[], то какой смысл отправлять старые данные. те. что уже были отправлены?

Тоже верно, (если данные изменились отправить пакет) но это не то что нужно потомучто данные нужно отправлять свежие лора не даст перепроверить. Я отправляю массив из 8 чисел.. это данные потенциометров и кнопок которые постоянно изменяются и ардуинке нужно их перепроверять + ардуинке подключены всякие датчики, экраны, что впираются в быстродействия лоры.

b707 пишет:

Вы чего добиться то хотите? Какой вообще смысл измерять быстродействие пустой ардуины? Настоящую задачу можете изложить, а не этого сферического коня в вакууме?

Это макет, чтобы показать самую суть.. зачем ковырять весь код если я изложил всю суть в таком виде..

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

ардуинке подключены всякие датчики, экраны, что впираются в быстродействия лоры.

повторяю, приведенные выше результаты с быстродействием лоры не связаны никак. Вы не быстродействие лоры проверяете, а занимаетесь откровенной фигней. Если у вас в основном коде тормоза - то и оптимизировать надо тот код, а не крутить пустой ЛУП в ардуине.

Если хотите помощи - Вам надо четко поставить цель - какого именно быстродействия скетча вы хотите добиться. Скажем 10 пакетов в секунду, сто, тысяча... А далее привести ваши текущие результаты для полного кода, со всеми датчиками и экранами. И приготовтесь, что оптимизировать придется конечный код. а не какие-то пустые циклы, что вы показали выше.

 

zDimaBY
Offline
Зарегистрирован: 10.06.2018

OMG, просто нужно чтобы на передатчике ЛУП был ближе к 274922 выполнений, а передача лоры 20пакетов/с. Все, больше ничего. Просто 274922 выполнений/c на передатчике и 20пакетов/с по 8 байт на LoRa sx1278 больше ничего не нужно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Подпишусь.

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

OMG, просто нужно чтобы на передатчике ЛУП был ближе к 274922 выполнений

Если вам нужно тупо увеличить цифру - выкиньте из Лупа все, кроме счетчика

 

Дима, вы правда не въезжаете, что вы хренью занимаетесь? Если хотите измерить быстродействие лоры - это совсем не так делается. Обьяснить?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

zDimaBY пишет:

OMG, просто нужно чтобы на передатчике ЛУП был ближе к 274922 выполнений

Пидец, ты тугой... 

zDimaBY
Offline
Зарегистрирован: 10.06.2018

b707 пишет:

Дима, вы правда не въезжаете, что вы хренью занимаетесь? Если хотите измерить быстродействие лоры - это совсем не так делается. Обьяснить?

Объясните, пожалуйста. 

DetSimen пишет:

Пидец, ты тугой... 

Ну посмотрел каков ты эластичный..

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Ну если так делать то ардуинка совсем медленно измеряет.

void loop() {
  packet[0]++;
  packet[1]++;
  packet[2]++;
  packet[3]++;
  packet[4]++;
  LoRa.beginPacket(); // Создайом пакет
  for ( byte i = 0; i < 8; i++) {
    LoRa.write(packet[i]);
  }
  LoRa.endPacket();
  if (millis() - timeout >= 1000) {
    timeout = millis();
    Serial.print(" Цыклов/с: ");
    Serial.println(countCPU);
    countCPU = 0;
  }
  countCPU++;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

b707 пишет:

Дима, вы правда не въезжаете, что вы хренью занимаетесь? Если хотите измерить быстродействие лоры - это совсем не так делается. Обьяснить?

Объясните. 

если вы хотите понять быстродействие Лора - то и измерять надо время отсылки одного пакета или максимальное число пакетов в секунду. Исправьте свой код, чтобы он непрерывно слал пакеты  - и посчитайте, сколько их уйдет за 1000мс

Только сыпать пакетами надо не тупо подряд, а с прверкой готовности передатчика - см в библиотеке

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

Ну если так делать то ардуинка совсем медленно измеряет.

И сколько получилось?

Что касается "медленно измеряет" - то это ЛОЛ :) Вы правда не понимаеите. что ваши предыдущие цифры типа 271345 раз в секунду - это полный бред?

Добро пожаловать в реальность, как говорится...

 

На самом деле может и еще меньше, код не вполне верный, вы не проверяете готовность передатчика к работе

 

zDimaBY
Offline
Зарегистрирован: 10.06.2018

На передатчике 28 циклов. 

На приемнике Пакетов/с: 26-27 ну, а Циклов/с: 273211

 
b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

На передатчике 28 циклов.

ну значит быстрее оно и не умеет.
А циклы ваши - абсолютно бессмысленная цифра, неужели до сих пор не поняли?
 
 
b707
Offline
Зарегистрирован: 26.05.2017

переходите на асинхронный режим, судя по библиотеке, Лора это умеет.

Число передач в секунду это не увеличит. но на работу остального кода - на все ваши датчики и дисплеи - времени будет оставаться больше.

 

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Быстрее не умет. ну и какбы достаточно. 

Но и ардуинка будет измерять со 28 циклов/с. а нужно 270 000 - то что это за цифры тогда ??? Это время исполнения ?

b707 пишет:

переходите на асинхронный режим, судя по библиотеке, Лора это умеет.

Число передач в секунду это не увеличит. но на работу остального кода - на все ваши датчики и дисплеи - времени будет оставаться больше.

Вот-вот и я про это. Асинхронный режим о господе я к этому шол!.. по библиотеке вижу что на стороне приемника только. Это вот

void setup() {
  LoRa.onReceive(onReceive); //register the receive callback
  LoRa.receive();// put the radio into receive mode
}
void onReceive(byte packetSize) {
  for ( byte i = 0; i < packetSize; i++) {
    p[i] = LoRa.read();
  }
  countLora++;
}

А Асинхронный режим так это и есть это ?

if (millis() - timeoutBeginPacket >= 50) {
    timeoutBeginPacket = millis();
    LoRa.beginPacket(); // Создайом пакет
    for ( byte i = 0; i < 8; i++) {
      LoRa.write(packet[i]);
    }
    LoRa.endPacket();
  }

Нет ?

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

Вот-вот и я про это. Асинхронный режим о господе я к этому шол!.. 

Так это и есть это ?

Нет ?

нет

Во-первых, по умолчанию асинхронный режим выключен. а во-вторых - в асинхронном режиме нельзя посылать новый пакет, пока передатчик занят отправкой предыдущего. А вы в коде сыпете их подряд

только ваши 270 тыс циклов - это все равно бред. Похоже Дедсимен прав

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

Но и ардуинка будет измерять со 28 циклов/с. а нужно 270 000 - то что это за цифры тогда ??? Это время исполнения ?

пипец ты все-таки тупой

zDimaBY
Offline
Зарегистрирован: 10.06.2018

b707 пишет:

пипец ты все-таки тупой

Okay, okay, okay ... Тогда как измерить время исполнения кода ??

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

Тогда как измерить время исполнения кода ??

какого?

Время работы Лора отдельно от остального кода -  вы уже измерили в коде #12. Если вам надо время работы вашей реальной программы - добавляйте в код все "датчики и дисплеи" и измеряйте с ними. В конце концов. ваша конечная программа будет использовать эти датчики или нет? если да - то какой смысл измерять время работы ардуины без них?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мужики, жесть - это 

холоднокатаная отожжённая листовая сталь толщиной 0,10—0,36 мм (по ГОСТ Р 52204-2004) с нанесёнными защитными покрытиями из олова или специальными покрытиями, напр. лаком, цинком, хромом и другими.

Она уже отожжённая! Зачем вы тут ещё отжигаете-то?

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Oh holy jesus, Асинхронный режим работает ! Смотрите 

Теперь на передатчике Циклов/c 132 тис с 1с выполнения асинхронного режима!! и на приемнике получаю Пакетов/с: 27 Циклов/с: 274 тис это КАЛОСАЛЬНАЯ РАЗНИЦА 

#include <SPI.h>
#include <LoRa.h>
byte packet[16];
unsigned long timeout, timeoutBeginPacket, countCPU;

bool Timer(uint32_t *startTime, uint32_t period)
{
  uint32_t currentTime = millis();
  bool result = (currentTime >= *startTime) ? currentTime >= *startTime + period : currentTime >= 4294967295 - *startTime + period;
  if (result) *startTime = currentTime;
  return result;
}

void setup() {
  packet[0] = 100;
  packet[1] = 120;
  packet[2] = 140;
  packet[3] = 160;
  packet[4] = 180;
  packet[7] = 255;
  Serial.begin(9600);
  while (!Serial);
  Serial.println("LoRa Transmiter");
  //Serial.println(!Serial);
  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    delay(200);
    while (1);
  }
  //LoRa.setSignalBandwidth(41.7E3); //defaults to 125E3. 7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3, 62.5E3, 125E3, 250E3, 500E3
  LoRa.setTxPower(20);
  //LoRa.setCodingRate4(8);
  //LoRa.setSpreadingFactor(6);
}

void loop() {
  packet[0]++;
  packet[1]++;
  packet[2]++;
  packet[3]++;
  packet[4]++;
  if (Timer(&timeoutBeginPacket, 1000)) {
    LoRa.beginPacket(); // Создайом пакет
    for ( byte i = 0; i < 8; i++) {
      LoRa.write(packet[i]);
    }
    LoRa.endPacket();
  }
  if (millis() - timeout >= 1000) {
    timeout = millis();
    Serial.print(" Циклов/с: ");
    Serial.println(countCPU);
    countCPU = 0;
  }
  countCPU++;
  /*
    Serial.println (packet[0]);
    Serial.println (packet[1]);
    Serial.println (packet[2]);
    Serial.println (packet[3]);
    Serial.print ("Сигнал RSSI: ");
    Serial.println (LoRa.rssi());
  */

}
ДО Этого было 37 тис с функцией millis() и на приемнике получаю Пакетов/с: 20 Циклов/с: 274 тис
 
А если без Асинхронного режима и без фун. millis() на приемнике получал ВСЕГО 27 Циклов/с и на приемнике получаю Пакетов/с: 27 Циклов/с: 274 тис.
 
Встретил Асинхронный режим ищо в 16 лет.. так и с ним не разобравшись когда ковырял AMS ммм.. на каждой страничке он срабатывал это какбы "познать бесконечность".. b707 Спасобо что напомнил. Не мог вспомнить это.
 
Вы представляете насколько может быть производительные такие микроконтроллеры..
Logik
Offline
Зарегистрирован: 05.08.2014

Так если жесть лаком покрыта, или полимером как ща модно, то один из способов очистить - снова отжечь.

Жгите! Повышайте скорость выполнения пустого цикла!

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Logik пишет:

Так если жесть лаком покрыта, или полимером как ща модно, то один из способов очистить - снова отжечь.

Жгите! Повышайте скорость выполнения пустого цикла!

Он не пустой, а занят обновлением отправляемого массива packet[] что не столь здраво.. 

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

Oh holy jesus, Асинхронный режим работает ! Смотрите

это не асинхронный режим.

Вы. Дима, простите, идиот...

zDimaBY
Offline
Зарегистрирован: 10.06.2018

b707 пишет:

zDimaBY пишет:

Oh holy jesus, Асинхронный режим работает ! Смотрите

это не асинхронный режим.

Вы. Дима, простите, идиот...

А что это ? Сложно объяснить ? аа это таймер асинхронный.

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

А что это ? Сложно обяснить ?

умному человеку - не сложно было бы... а вам, извините, без шансов. Не вижу смысла чего-то обьяснять человеку, который изо всех сил борется за накручивание пустых ЛУПов в программе... зачем вам асинхронный режим?

Не заметил в вашем коде строчку 9... тут еще и борьба с переполнением миллис :) Полный комплект ардуино-халтурщика...

zDimaBY
Offline
Зарегистрирован: 10.06.2018

b707 пишет:

zDimaBY пишет:

А что это ? Сложно обяснить ?

умному человеку - не сложно было бы... а вам, извините, без шансов. Не вижу смысла чего-то обьяснять человеку, который изо всех сил борется за накручивание пустых ЛУПов в программе... зачем вам асинхронный режим?

Не заметил в вашем коде строчку 9... тут еще и борьба с переполнением миллис :) Полный комплект ардуино-халтурщика...

Ну я никогда не щитал себя каким-то сверх умным или вовсе умный)) Да нет на свете человека который не ошибался .. И если человек в чём-то ошибаться не думаю что он тупой.. Ладно спасибо и на этом. Смотрю никто тут объяснить что-то не может или опуститься до "такогоо" что кому-то что-то подсказать.)

b707
Offline
Зарегистрирован: 26.05.2017

изучайте внутренности библиотеки лора. И прочтите внимательно мое сообщение 19

Удачи