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

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

cheblin

Member
...на самом деле нет.:)

встречайте I2C-SensorsDataCollector

от оригинального Power Profiler осталось только старое окружение, которое тоже в принципе большой ценности не представляет.

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

Изюминка: псевдо-ассемблерный набор инструкций, которые "проигрываются" микроконтроллером. Может быть легко переконфигурирован, способен работать с любыми типами устройств на шине I2C.

И да нужна отладка, которой не было. Проект сырой, уверен за протокол, но не уверен за взаимодействие с железом. Обязательно доведу этот проект до полностью рабочего состояния.

Основная идея публикации этого, "сырого" проекта - помощь в понимании базовых принципов как всё работает в связке с AdHoc протоколом
 

pvvx

Активный участник сообщества
Нельзя в IRQ такой громоздкий цикл cheblin/I2C-SensorsDataCollector Когда будет работать USB?
В оригинале там был один опрос одного значения c I2C с временем занятости и запретом IRQ для USB на 50..70 us. Поставлен на IRQ для минимизации джиттера опроса и дабы исключить дополнительное чтение регистра состояния готовности датчика I2C (на это нужна ещё одна транзакция по I2C и подбор времени опроса с синхронизацией таймера периода опроса с точностью менее 1 us, на что данный проект не рассчитан и не хватает частоты CLK на шину I2C у STM32).
 

pvvx

Активный участник сообщества
И да нужна отладка, которой не было.
Для отладки нужна приемная часть с USB и отображением что там читается на чем угодно.
Проект сырой, уверен за протокол, но не уверен за взаимодействие с железом. Обязательно доведу этот проект до полностью рабочего состояния.
Параметры у INA219 - шаг опроса по I2C 84 мкс. Максимальная частота I2C у STM около 800 кГц. Кол-во тактов на транзакцию чтения регистра в тактах I2C от 51. Время исполнения транзакции 51/800000 = 0.000064 сек. т.е. примерно за 70 мкс без использования HAL. C HAL не влезает вообще.
На все остальные процессы у вас есть до 14 мкс (оптимистично). Это значит до 0.000014(сек)*72000000(Hz макс CLK CPU STM32F103) = 1008 тактов со всеми вычетами прерываний, ожидания шин, вставки тактов ожидания CPU при работе программы с Flash (Flash память медленная и выборки с частотой 24 МГц для нее потолок.) (с SRAM успевает и не вставляет такты ожидания), обработки ужасного HAL USB.
 

pvvx

Активный участник сообщества
Более точные временные диаграммы по состоянию CLK на I2C с рабочего примера PowerProfiler и INA219:
upload_2020-1-27_21-57-27.png
Цикл опроса 84 us. Выходной поток в USB 11.9 ksps (> 23.24 kbytes/sec - такой поток нормально буферизировать в STM32F103 негде).
Джиттер опроса менее 1 us.
Предельно разогнанная и стабильно работающая частота CLK I2C порядка 833 kHz.
Время между опросами I2C у CPU на другие процессы менее 11 us. (до пары переключений контекста в RTOS :))
В них желательно уложить сборку пакета и отправку в USB...
 

A_D

Active member
Посмотрел то там, то сям, зашёл в demo_.c, а там вижу:
upload_2020-1-28_0-1-36.png

Да, сразу понятно, номер канала (?)... куча функций-прототипов пустых... и всё в таком духе. В итоге - надо ещё изучать, как это работает, а не просто написать, как требуется для конкретной задачи.
И да, это ещё не тестилось на реальном железе. Выложенный пример - какой то огрызок (который вы, видимо, доделывать не имеете желания, предоставляя такую возможность пользователям форума), а не готовая прошивка, на которой можно собственно и проверить работоспособность всего.
 

pvvx

Активный участник сообщества
В итоге - надо ещё изучать, как это работает, а не просто написать, как требуется для конкретной задачи.
Я изучил, что там понакалякал @cheblin.
Глупостей много, с жизнью несовместимо, но это только начало. Так сказать вхождение @cheblin в жизнь MCU и малых SoC...
Он же написал - доделает, а пока прототип стыковки к AdHoc. Дальше будет хуже и именно с авто-кодом от генератора AdHoc. Потом забросит, поняв что не вписывается AdHoc в тему MCU и малых SoC, исключая случай Arduino (там производительность чипов в лучшем случае используют до 5%). Это не шутки...
 
  • Like
Реакции: A_D

cheblin

Member
Нельзя в IRQ такой громоздкий цикл
в оригинале говнокод, о чём я ранее и писал. таймер не просто не нужен. он даже вреден, подозреваю является одной из причин низкой производительности устройства в целом.

код опроса и записи в I2C шину должны делаться по прерыванию.
 

pvvx

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

код опроса и записи в I2C шину должны делаться по прерыванию.
Пару лет назад был такой код - прерывание таймера ставило флаг... :)
Такие решения были выброшены по причине ужасного джиттера опроса с выбросами и дублями на снятых показаниях с автоматически обновляемых регистров измерения у INA2xx со своим плавающим дискретным шагом от встроенного RC генератора, а так-же по причине не прокачки потока в USB самой ОС/RTOS.
Сейчас разнобой обновления бьет в несколько секунд давая одинаковый код. А тогда, при том-то джиттере RTOS - примерно каждый третий - на осле смотреть страшно - более похоже на шум :)
 

pvvx

Активный участник сообщества
в оригинале говнокод, о чём я ранее и писал.
Вы сами влипли выбрав этот пример - там усё по максимуму и любой лишний код и ... :p Как раз для теста ваших глупостей с AdHoc.
Полное исключение HAL и любых калбаков и XTOS сможет спасти ситуацию.
 

cheblin

Member
Да, сразу понятно, номер канала (?)... куча функций-прототипов пустых... и всё в таком духе.
нет.
в каждом канале , если у него по дизайну есть возможность отправки пакетов, есть transmitter
upload_2020-1-28_6-44-53.png
у которого есть ссылка на функцию вытягивания пакетов предназначенных для отправки.

конструктивно это может быть сделано по-разному.
от простейщего статического кольцевого буфера пакетов, как сделано в I2C-SensorsDataCollector

до более сложного, когда очередь отправляемых пакетов встраивается в структуру канала
upload_2020-1-28_6-40-34.png

и это привидено как пример в Demo.c

"проблемма" в том, что функция вытягитвания пакетов получает ссылку на transmitter, канала, а не на сам канал. вот тот подчёркнутый, вами приведёный код - это получение ссылки на канал, по ссылке на transmitter канала
 

cheblin

Member
куча функций-прототипов пустых..
это функции обработки прилетающих пакетов... а что там должно быть в демокоде?

смотрите в Test.c там ничего пустого нет ибо тестирование отправки приёма пакетов.

обратите внимание это полностью, машино генерённый код.
 

pvvx

Активный участник сообщества
обратите внимание это полностью, машино генерённый код.
А разве это какое-то достижение, спустя 35 лет после выхода всяких пакетов собирающих оптимизированную архитектуру ALU с готовым кодом транслятора СИ с учетом всех зависимостей под конкретную задачу?
STM32CubeMX тоже что-то генерит, у Microchip так-же аналогичная приблуда есть...
 

pvvx

Активный участник сообщества
Для начала вам советую сгенерировать в STM32CubeMX проект USB-COM на STM32F103C8T6 с Echo (там это штатный пример) и проверить throughput своего AdHoc.
 

pvvx

Активный участник сообщества
А я вам пока историческую справку приведу:

USB <-> JTAG SWD: J-Link и ST-Link сделанные на STM32F103C8T6.

У обоих один тип USB булки. Но у производителя STM итоговая скорость дрыгания ножками SWD в два раза меньше, чем говонокод от SEGGER. И throughput отладки и прошивки имеет такие-же различия. У “сообщества миллионов мух” на нем-же есть OpenOCD. Он самый медленный.
 

A_D

Active member
нет.
в каждом канале , если у него по дизайну есть возможность отправки пакетов, есть transmitter
Посмотреть вложение 8739
у которого есть ссылка на функцию вытягивания пакетов предназначенных для отправки.

конструктивно это может быть сделано по-разному.
от простейщего статического кольцевого буфера пакетов, как сделано в I2C-SensorsDataCollector

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

и это привидено как пример в Demo.c

"проблемма" в том, что функция вытягитвания пакетов получает ссылку на transmitter, канала, а не на сам канал. вот тот подчёркнутый, вами приведёный код - это получение ссылки на канал, по ссылке на transmitter канала
Я не про то, что там по факту получается в строке, а про то, как это выглядит - длинная непонятная строка, не влезающая даже в гитхабовский вьюер. Это и выглядит не читабельно и нельзя однозначно сразу сказать, что там происходит..
 

cheblin

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

A_D

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

pvvx

Активный участник сообщества
изучать код не скачивая его с гитхаба - это сильно. максимум что у меня получается это поверхностный осмотр, на предмет стоит ли качать вообще.
Я не скачивал. прямо в github всё посмотрел открыв сразу десяток страниц и CTRL-F. Контекстных ссылок он же не дает :) Как и Keil.
cheblin - Купите нормальные мониторы от 4K, они ныне дешевы
 
Сверху Снизу