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

Делюсь опытом Power Profiler на рельсах AdHoc protocol

cheblin

Member
кстати совершенно не понимаю притензий по поводу того, что для того чтобы написать и отправить спецификацию AdHoc протокола, а затем получить сгенерёный код необходимо установить Java...

CubeMX точно также требует такую же Java .. чёта не слышал возмущений...
ставят и нахваливают
ставят и нахваливают
ставят и нахваливают

это ж не какого то там питона... навязывают
 

pvvx

Активный участник сообщества
косаемо USB на HAL
гуглить:
на приём CDC_Receive_FS это колбэк и там всё просто
а на передачу не блокирующий CDC_Transmit_FS но отловить конец передачи будет чуточку сложнее

по I2C на HAL
гуглить:
на приём HAL_I2S_Receive_IT и HAL_I2S_RxCpltCallback
на передачу не блокирующий HAL_I2S_Transmit_IT + HAL_I2S_TxCpltCallback
I2S - это другая шина. Для звука...
CDC_Receive_FS это прием, но никакой гарантии, что в данном калбаке отработает CDC_Transmit_FS. Он может быть занят.
По тому и повторите то, что накалякано в PowerProfiler - все ваши калбаки будут ставить флаги, а по ним уже и определитесь что и когда и куда, чтобы вписаться в макс трансфер.
 

cheblin

Member
I2S - это другая шина. Для звука..
верно. исправляюсь:
на приём HAL_I2C_Master_Receive_IT и HAL_I2C_MasterRxCpltCallback
на передачу не блокирующий HAL_I2C_Master_Transmit_IT+ HAL_I2C_MasterTxCpltCallback

все ваши калбаки будут ставить флаги
нет.
простешие операции типа заполнения пакета с инфой версии устройства и постановки на отправку , будут выполняться прям в колбэке!
операции "длительной" обработки думаю перекинуть в колбэки one pulse timer с детерменированной задержкой.

например, опрос устройств на I2C, по колбэку HAL_I2C_MasterRxCpltCallback стартуем пульс таймера с нужной задержкой периода опроса, по его колбэку стартует следуший запрос по шине I2C и так далее... если в колбэке обнаружится что пакет заполнился и на отправку готов, обмениваем указатели заполненного пакета и пустого , стартуем отправку USB...

это другая философия, да
 

pvvx

Активный участник сообщества
простешие операции типа заполнения пакета с инфой версии устройства и постановки на отправку , будут выполняться прям в колбэке!
Он будет вызываться в пределе 1 раз в 1 ms по получению данных от хоста в USB в данной RX EndPoint.
А I2C регистр INA219 надо опрашивать через 84 us. И эта задача важнее - джиттер не допустим, т.е. чем меньше - тем лучше.
Передача блока в USB так-же возможна только тогда, когда хост произведет опрос с шагом 1 ms TX EndPoint передачи.
Если у вас потоки RX/TX имеют дисбаланс по трафику, то всё будет криво.
В данном примере PowerProfiler RX поток мал - иногда, в раз в сотни секунд приходит команда, а вот поток TX предельный для дров USB у STM32F103 при загрузке основной задачей - работой c I2С.
Трафик всей шины USB будет распределен на передачу. А в дровах от ST это в теоретическом пределе 64 байта раз в 1 ms (по опросу RX TX EndPoint хостом).
 

pvvx

Активный участник сообщества
Если превалирует RX, то балансировка потоков RX и TX производится путем не считывания RX EndPoint. При занятой RX EndPoint хост не сможет записать туда ничего и будет вынужден ожидать (через 1 ms) следующего опроса освобождения RX EndPoint и т.д. Тем самым и балансируется. Но в дровах ST этого недано :p
 

pvvx

Активный участник сообщества
Буфер TX EndPoint вы можете заполнить в любой момент когда он свободен, т.е. прошлый считан хостом и снят флаг занятости. А буфер RX EndPoint можно не считывать пока не будет времени на его обработку, т.е. не будет свободен TX EndPoint для передачи. По этому ваш калбак в RX никому не нужен.
Возможно использование только калбака по освобождению TX EndPoint. Но есть ли такой в дровах USB от ST? :)
 

pvvx

Активный участник сообщества
например, опрос устройств на I2C, по колбэку HAL_I2C_MasterRxCpltCallback стартуем
Время выполнения этого калбаск в тактиках STM32F103 более чем вся транзакция по шине I2C на 800 кГц CLK. Как и любое переключение контекста...
пульс таймера с нужной задержкой периода опроса, по его колбэку стартует следуший запрос по шине I2C и так далее...
и не так далее, а получаете скорость опроса I2C регистров не более пары тысяч в сек, а надо 11904 раза в сек для INA219 на максимальной частоте готовности её ADC.
это другая философия, да
да, да :) :)
 

pvvx

Активный участник сообщества
Перед вами элементарная задача - решить сколько времени занимает переключение контекста у STM32F103 в вашей так называемой ОС от ST. И рассчитать сколько их возможно в секунду. Только на таймер опроса регистров потребуется 11904 раза в сек... На USB уже останется то, что останется :) А останется очень мало и дрова будут тормозить, т.е. пропускать часть событий инициированных хостом - не успевать подготавливать всё в RX и TX EndPoint до следующего опроса хоста с шагом 1 ms. Та и пусть - но упадет трафик шины USB1.1. :p
Изначальный (теоретический) трафик в USB дровах ST - 64 байта* 1 ms, т.е. 64 000 байта в сек на оба направления RX и TX.
Для передачи 11904.761905 значений из 16- битного регистра INA219 надо всего 23809.52381 байта в сек.
 

pvvx

Активный участник сообщества
"Сначала маленький экскурс в историю,
А к практике мы перейдем потом (опосля, значит).
Так вот, все это началось в те самые времена,
Когда Исус Христос сказал впервые “Ом”.
"
В i386 в DOS (! скорость обработки прерываний) была беда - не могла опрашивать UART RX со скоростью 115200 baud (11520 байт/прерываний в сек). И так пока в UART не сделали FIFO на 8 байт.
Через десяток лет, на ГГц процах с много ядер на шевеление ногой в порту (путь LPT) происходит - переход на самый низкий уровень ОС с опустошением всея кеши всех ядер и ожиданием выполнения транзакции по pci express на которой сидит аппаратный эмуль шины i8080, тактируемый 8 МГц. Опустошение кешей свзяно с тем, что а вдурх это переключение банков памяти, как ранее использовалось в DOS в качестве дополнительной, в окне...
Ещё через десяток лет. pci express обучили выполнять отложенные транзакции - т.е. между запросом и ответом можно работать с другими транзакциями. И наконец забыли и забили о совместимости с i8080 - первой PC. Но скорости дрыгания ногой в порту это не прибавило...
 

pvvx

Активный участник сообщества
"А к практике мы перейдем потом (опосля, значит)."
Время переключения контекста для процессов в Linux для малых SoC:
https://esp8266.ru/forum/threads/mt7688an-hlk-7688a.2934/page-2#post-61018
760 микросекунд на создание процесса на не самом производительном CPU - кошмар ?
Вы посмотрите сколько времени уходит на 1 системный вызов или на переключение контекста во взрослом CPU.
Если вы создает процессы за микросекунды - вы явно что -то делаете не так.
 

pvvx

Активный участник сообщества
.. в доме также должны быть и мясные закуски!
Значит AdHoc сдулся перед MCU и малыми SoC?
Подавай жирненькое ?
Дык жирненькое тоже не тянет. Те циферки и на него действуют, даже при передаче между процессами, не говоря уже о их создании.
Убирайте из авто генерируемого кода любые вызовы call. Это плохо отражается на производительности MCU и малых SoC - беды с кеш и предсказанием.
Only inline. И то следите за размером вписывания в скорость заполнения кеша проца... :p
 

pvvx

Активный участник сообщества
Так-же не забываем, что для SMT32 любое обращение проца к периферии - это остановка на дцать тактов WAIT ожидания отработки медленной шины к устройству и его низкочастотному тактированию.
В HAL на это наплевали. А тем более вызовы калбаков апосля прерываний в RTOS - это вообще тысячи никчемо загубленных тактов CPU.
 

pvvx

Активный участник сообщества
И т.к. вы приползли на форум чипов с WiFi и BLE, то RTOS с тиком 1 ms на основных типах CPU (Cortex или ESP) при CLK CPU на 8..10 MHz полностью занят только задачей WiFi или BLE и на пользовательскую задачу у проца времени уже нет. При этом и трафик примера типа Echo уже дает заниженные показания до 2-х раз от предельного на максимальной частоте CPU. Т.е. на 8..10 MГц всего осуществляется минимальная поддержка работы WiFi или BLE.
Для STM32F103 с USB, HAL и ST дровами всё значительно хуже. Там для задачи пользователя времени вообще нет и при этом полный трафик USB1.1 не обеспечивается.
 

pvvx

Активный участник сообщества
??? генератор безсмысленных наукообразных слов врубил?
RTOS - Операционная система реального времени — Википедия
Real-Time Operating System
Я знаю, что вы как программист с этим не знакомы. У вас есть понятия только Виртуальная мнимая система. Для них вы и создаете AdHoc.
 

pvvx

Активный участник сообщества
Урезание функциональности от FreeRTOS ни о чем не говорит.
Вы опять застряли в лейбочках, не понимая сути их работы.
Это норма для программеров :p Они заучивают названия процедур из библиотек и а как это работает им всё равно.
 
Сверху Снизу