• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом AdHoc пошаговое руководство

pvvx

Активный участник сообщества
Офигиваю с дури компилятора кайла. На этот код
Посмотреть вложение 8581

выдаёт ошибку.

Посмотреть вложение 8582

требуя писать так
Посмотреть вложение 8580

в то время как ВСЕ прочие С компиляторы прекрасно воспринимают этот код.

алё, кейловй компилятор....
подними глазки на строчку выше и либо трусы надень, либо крестик сними.

Тошниловка...
Это не "тошниловка", анормальные опции компилятору
-Wall
-Wpedantic
-pedantic
-Wextra
-Werror
...
 

pvvx

Активный участник сообщества
Компилятор и сами процедуры switch протокола это самое последнее, что необходимо решить в описываемых задачах.

На первую необходимо рассмотреть интерфейс физической передачи и ресурсы по производительности MCU.
А имеем:
  • Шину USB 1.1 12 мбит/с с ведущим. Он строго в 1 мs опрашивает наше устройство и если у вас что не готово, то следующая любая транзакция будет возможна только на следующий опрос ведущего через эти 1 ms.
  • Шину i2c, с которой большинство MCU не умеют работать без полной озадаченности CPU. Единственный нормальный контроллер i2c/smbus из пролетавших на данном форуме MCU имеется у RTL SoC. В нем загружаете в FIFO набор требуемых для выполнения транзакций с шиной i2c и контроллер без участия CPU их автоматически выполняет, с указанными повторами при ошибках и т.д. По окончанию обработки “скрипта” имеете готовые байтики ответов от устройства. ip модель контролера в нем общедоступная.
Но у нас STM32F103C8T6. Эта фигня по докам не умеет даже поднять CLK i2c выше 400 кГц и требует постоянного облизывания регистров контроллера i2c на для формирования элементарных действий на шине i2c - типа сигнала старт. Т.е. всю транзакцию на i2c CPU усиленно трудится и занят только этим. Такой контроллер i2c, что разницы между софт эмуляцией ногодрыгом не имеет. У ST это в норме.

При минимальном периоде значения замера тока или напряжения от микросхемы INA219 идут через 84 мкс, у INA226 – через 140 мкс.
Без разгона шины i2c их не обслужить. Т.е. стандартные либы и HAL можно сразу отметать. Колдуя с бубном в регистрах делителей i2c выходит максимальный разгон i2c до 800..1000 кГц.
При этом занятость CPU STM32F103C8T6, к примеру для опроса INA226:
STM32F103-INA226.gif
Вот этой дырки уже не хватает его дровам USB для получения хотя-бы минимально необходимого трансфера. Тут придется ещё и переписывать HAL и либу USB. Увольте…

Единственным решением является адаптация протокола передачи данных, что AdHoc исключает и предложить пока не может.
Ему кейловский компилятор мешает. :)
 

pvvx

Активный участник сообщества
Устройство давно готово (много лет назад) и ждет вашего кода для испытания и сравнения...
В нем всё предусмотрено естественным путем - чуть больше загрузки CPU или будет тупить протокол и будет лажа :p
 

pvvx

Активный участник сообщества
У нас есть ещё аналогичный пример:
Это ESP8266. Скорость внешней “шины” WiFi у него 72 Мбит/с, CPU 160 МГц. Но вот полученный максимум для вашего любимого UART всего до 3 Мбит/с.

Тут мы надеемся, что AdHoc нам поможет и с ним выдаст большую скорость… :)
Впрочем, если автор AdHoc сможет достичь у данной связки скромных 1 Мбит/с – это будет уже великим успехом.

PS: думается, что никаких ответов от Автора AdHoc мы не получим - он будет исключительно увиливать и ссылаться на кейл и прочее...
 

cheblin

Member
вот тот код, который мы видим тут был написан либо банщиком, либо ардуинщиком...
впрочим я их слабо различаю

кто?? кто в обычном main цикле ТАК читает и отправляет пакеты в USB? ... а потом ругаеца что пропускная способность недостаточна.
что? стырил демо код вставив в него свои куски?? так делай это с умом...

даже при отправки UART все нормальные используют колбэки от прерываний и в них вычитывают байты либо отправляют...

... а есть ли у использованного USB CDC драйвера колбэки...
оказывается есть прям в файле usb_endp.c один на приём, другой на передачу .

наблюдаем как гений начнёт маняврировать... 4...3...2...
 

cheblin

Member
Это не "тошниловка", анормальные опции компилятору
-Wall
-Wpedantic
-pedantic
-Wextra
-Werror
...
а прочитать моё сообщение внимательно... в приведёном коде, строчкой выше всё тотже компилятор прекрасно с NULL справляется...

банщик?
 

A_D

Active member
Но у нас STM32F103C8T6. Эта фигня по докам не умеет даже поднять CLK i2c выше 400 кГц и требует постоянного облизывания регистров контроллера i2c на для формирования элементарных действий на шине i2c - типа сигнала старт. Т.е. всю транзакцию на i2c CPU усиленно трудится и занят только этим. Такой контроллер i2c, что разницы между софт эмуляцией ногодрыгом не имеет. У ST это в норме.
STM32F103 уже ппц древний, у него проблем реально много... но для легаси, его всё выпускают. А так - лучше уже взять STM32F042 для мелких свистков или STM32F401\411 для более серьезных проектов. Для вторых уже и аналог блупила давно есть.

При минимальном периоде значения замера тока или напряжения от микросхемы INA219 идут через 84 мкс, у INA226 – через 140 мкс.
Без разгона шины i2c их не обслужить. Т.е. стандартные либы и HAL можно сразу отметать. Колдуя с бубном в регистрах делителей i2c выходит максимальный разгон i2c до 800..1000 кГц.
При этом занятость CPU STM32F103C8T6, к примеру для опроса INA226:
Посмотреть вложение 8584
Вот этой дырки уже не хватает его дровам USB для получения хотя-бы минимально необходимого трансфера. Тут придется ещё и переписывать HAL и либу USB. Увольте…
Странно.... у меня HAL, F103 и INA219 и замеры в 1мс прекрасно читаются с INA, есть свободное время для MCU и все по USB отправляется. Уже достаточно скоро всё добро выложу на гит.
Выглядит бомж-вариант измерителя так:
1.jpg
Софт, эмулятор устройства:
2.png
Софт, USB измеритель (с куллером на 5в в качестве нагрузки):
3.PNG 4.PNG 5.png

В динамике это всё намного интереснее смотрится) В телеге могу показать видео.
Софт уже поддерживает USB, LAN (WiFi) измерители, но надо ещё много чего допиливать + железо нормальное разработать (в процессе).
 

A_D

Active member
кто?? кто в обычном main цикле ТАК читает и отправляет пакеты в USB? ... а потом ругаеца что пропускная способность недостаточна.
что? стырил демо код вставив в него свои куски?? так делай это с умом...
Читаю я по колбеку, а вот отправка... у меня тоже в main сделана. :)
1.PNG 2.png
Оч сложный код)
 

cheblin

Member
отправка... у меня тоже в main сделана.
какбудто это что то хорошее...;)

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

скоро выложу версию PowerProfiler с AdHoc протоколом, всё намного проще и понятнее получается.

@A_D что у вас за протокол?

у нас тут канун китайского нового года, ...это когда все на всё забивают... образуется некоторый объем свободного времени...
если есть желание/возможность чётко сформулировать, обмен какими данными в вашем проекте нужен, можно было бы обсудить.
всех этих железяк у меня нет(каганову при встречи всё раздарил), да и для того чтобы встраивать код протокола, их и не нужно
от меня код от Вас тестирование.:)
 

A_D

Active member
какбудто это что то хорошее...;)
Если оно и так прекрасно и стабильно работает, иногда нет смысла усложнять...

что у вас за протокол?

у нас тут канун китайского нового года, ...это когда все на всё забивают... образуется некоторый объем свободного времени...
если есть желание/возможность чётко сформулировать, обмен какими данными в вашем проекте нужен, можно было бы обсудить.
всех этих железяк у меня нет(каганову при встречи всё раздарил), да и для того чтобы встраивать код протокола, их и не нужно
от меня код от Вас тестирование.:)
У меня своё, простое, пакуются данные по структурам описанным и передаются в виде массива байт (буфер), а на софте уже обратно разбирается маршалом (да, на C# работа с указателями..) - проблем с производительностью не заметил, как и усложнять нет смысла пока что. Работает как с USB, так и с UDP пакетами, можно добавить поддержку COM портов, да всё будет аналогично.
Желания пробовать что то новое пока нету, т.к. даже работы по допиливанию текущего не мало... а у меня ещё работа есть, да дела домашние.
 

A_D

Active member
скоро выложу версию PowerProfiler с AdHoc протоколом, всё намного проще и понятнее получается.
Я когда глянул код профайлера - сначала вообще ничего не понял) Сильно уж замудрёно. Потом софт глянул, даже не запускал, просто скрины - куча настроек, параметров и т.п. Что то показалось удобным, как идею интерфейса, что то не оч - в общем, некоторое влияние на видение своего софта оказало. В это время писал LAN версию CV Meter и собственно родилась мысль, а почему бы и не добавить поддержку USB устройств. Только удобную и простую для пользователя.
 

A_D

Active member
всё это за 15 минут делается, вы ж читали, ну ОК, за 22...
Я не про ваш проект, а про свой. У меня комплексный проект - железо + прошифка + софт для пк и вот в этих трёх направлениях работы не на 15 и не на 22 минут.
Как бы прикрутить номер к машине - да, дело 15 минут, но вот создать машину... уже не 15 минут.
 

pvvx

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

кто?? кто в обычном main цикле ТАК читает и отправляет пакеты в USB? ... а потом ругаеца что пропускная способность недостаточна.
что? стырил демо код вставив в него свои куски?? так делай это с умом...

даже при отправки UART все нормальные используют колбэки от прерываний и в них вычитывают байты либо отправляют...

... а есть ли у использованного USB CDC драйвера колбэки...
оказывается есть прям в файле usb_endp.c один на приём, другой на передачу .

наблюдаем как гений начнёт маняврировать... 4...3...2...
Мы же ждем супер правильный код от вас. Я вообще не программист и мне пофигу что вам не нравится в коде десятилетней давности. Та и об этом вас предупреждали - первые дрова ST не содержали явных калбаков :p
 

pvvx

Активный участник сообщества
upload_2020-1-12_15-10-13.png
А далее @cheblin-а будем учить, что в калбаке у него выйдет хуже.
Калбаск там работает и взводит биты... Работа распределяется по ним, а не в самом калбаке, чтобы было правильное распределение загрузки CPU, работающего по прерываниям.
 

A_D

Active member
INA219 - 84 us, по русски микросекунд!
Понял, моя ошибка, я подумал, что между 1мс замерами как то пауза в 84мкс получается и всё. А тогда вопрос, смысл в таком некрасивом числе ? Логичнее же что то более целочисленное - 100мкс, 1мс и подобное.
 
Сверху Снизу