Перейти к содержанию
    

AltairNsk

Участник
  • Постов

    11
  • Зарегистрирован

  • Посещение

Весь контент AltairNsk


  1. Свалилось освоить ESP32-C3 и BLE на нем. Смотрю в гугл и ESP-IDF Examples и не понимаю вот что: Концепция GATT по обзорным статьям вроде понятна. В устройстве типа server (периферия) GATT профиль (возможно несколько), внутри профиля несколько сервисов, внутри сервиса характеристики. Предопределенные UUID'ы и пользовательские, группировки атрибутов в сервисы - с этим разобрался, по крайней мере, куда вникать дальше. А что реализуется множественными профилями - недопонял. Это возможность нескольких представлений для client'ов? Теперь смотрю в код ESP-IDF. Вижу таблицу атрибутов сервиса Дальше по этой структуре создается сервис Своими характеристиками дополнить сумею, но гайды рекомендуют группировать атрибуты по сущностям в профили и пользоваться предопределенными. Например, нужно добавить сервис батарейки... И вот тут уперся в новые ворота. В примере с двумя сервисами заводятся два профиля, в каждом профиле по сервису Где gatts_profile_a_event_handler(), gatts_profile_b_event_handler() - по сути коллбэки, реализующие функционал соответствующего сервиса. Как уместить в один ESP-IDF профиль пару сервисов, я не понял. Если так то компилируется, на исполнении ломается, "не удалось создать сервис". Явно что-то не так делаю и не понимаю... Или в ESP-IDF профиль - это не совсем то, что профиль в BLE? И надо просто мои сервисы обернуть, как в примере, каждый в свою структуру профиля? Ткните носом, пожалуйста, куда смотреть, что почитать?
  2. Добрый день, свалилась на голову задачка: Есть OrangePi c Аrmbian'ом. Юзеркод на питоне: забирает кусками бинарный поток из usb-cdc, парсит данные, отправляет по wifi на kafka сервер, бинарник параллельно складывает в локальный файл. Реализация – модель акторов силами pykka библиотеки. Нужен автостарт и далее непрерывная работа в фоне. Задача осложняется тем, что и линукс, и питон я впервые вижу, третий день гляжу, как баран на новые ворота (и, возможно, не на те ворота). Как я понял: Cтартует python процесс, внутри несколько тредов с асинхронным обменом. При этом должны быть розданы права на доступ к оборудованию, сети, файловой системе. И вся балалайка должна быть запущена не ранее, чем оборудование/сеть/и т.д. поднимется... Сейчас: запуск через rc.local cd /root/scripts python3 /root/scripts/start_actors.py & exit 0 (ну да, всё незатейливо под рутом) (и заодно понял, зачем первая строчка – в скрипте файл создается относительно рабочей директории) Результат: автостарт – через раз, но если запустилось – работает, в смысле вижу данные на сервере. Если не запустилось и перезапустить руками rc.local systemctl restart rc.local То заводится и работает. Как я понял, в данном случае rc.local – это один из сервисов systemd. Для сервисов можно назначать зависимости (=>порядок запуска). Сервисы запускаются по возможности параллельно. В какую очередь дело доходит до rc.local, я не знаю. Иногда все готово для работы python скрипта, иногда нет. "Окей гугл: How To Autorun A Python Script On Boot Using systemd" "Да всё просто: пиши свой юнит" [Unit] Description=MyService Wants=network-online.target After=network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/bin/var DEV=1 /usr/bin/python3 /root/scripts/start_actors.py WorkingDirectory=/root/scripts User=root StandardOutput=file:/root/scripts/script.log StandardError=file:/root/scripts/error.log [Install] WantedBy=multi-user.target Необходимые зависимости – один большой вопрос... Пока я вижу, что модуль стартует. Но данных нет. Нет доступа к USB или оно не готово? Какие сервисы за него отвечают? Назначение вывода – а так можно? Вроде бы да, питон-скрипт свой лог сюда кладет...
  3. Одноплатник - пока что темный лес, подключил к обычному компу с виндой. "STM32 Virtual ComPort" в системе появлется, данные в терминал приходят. Переподключение к компу без сброса STM - энумерация есть, данных в терминале нет. Смотрю в свой код и вижу, что все так и будет, возможность переподключения я не учел.
  4. STM32L412, HAL Virtual COM port и OrangePi

    Досталось "в наследство": STM32L412 опрашивает радиомодуль, пакует принятое и по USB в режиме virtual com port отправляет на хост, тут я немного в теме. STM32CubeIDE 1.6.1, HAL 1.17 - as is. CDC_Transmit_FS(...) для отправки, в коллбэке CDC_TransmitCplt_FS поднимаю флаг окончания передачи. хост - одноплатник OrangePi с Armbian на борту, выгребает данные с usb-com, вроде бы питоновским скриптом и складывает в локальный файл. Вроде бы регулярно опрашивает порт на доступность. Не моё и тут я пока что по нолям. Максимум - зайти по ssh и убедиться, растет ли файл. (1) Включаю одноплатник. После того, как загрузится (и видимо, начнет целевым образом опрашивать порт), включаю STM - так работает. Проблема: (2) Включаю STM до загрузки одноплатника - и что-то случается с USB_CDC - не вызывается CDC_TransmitCplt_FS. Вижу, что hUsbDeviceFS.pClassData инициализируется. Как понял, это происходит в прерывании, при опросе хостом (про порочность malloc читал, но в первом случае ведь работает) До ухода в главный цикл жду while (hUsbDeviceFS.pClassData == 0){} - как аллоцировало pClassData, интерфейс готов, можно работать? После вызова CDC_Transmit_FS TxLength == посылке, TxState == 1 - брейкпоинт на вызове CDC_Transmit_FS, затем один шаг посмотреть состояние. Второй брейкпоинт - внутри CDC_TransmitCplt_FS, в (1) я в него прихожу, в (2) - нет. Ладно, дальше в (2) подождал, останов, и вижу, что стало: TxLength == 0, TxState == 0. Получается, хост данные забрал? В какую сторону разгребать? Как со стороны STM определить, что хост готов к работе? Внутри CDC_Transmit_FS вижу USBD_BUSY только по проверке pClassData->TxState. Как правильно запускать USB CDC на STM в условиях, что я не знаю, как именно хост будет дергать порт?
  5. Итого выкинул из проекта совсем лишнюю логику (лишний счетчик, два десятка регистров). В процессе проверил на железе с осциллографом, исправил грубые ошибки (в симуляторе глядел, но плохо). И методом последовательного тыка настроек компилятора получилось уложить в 100 МГц. Счетчики пока не переделывал.
  6. bit_cnt[11:0], word_cnt[3:0], msg_cnt[6:0]; *_cntmax - регистры, значения загружаются перед счетом как-то так always @(posedge clk, posedge rst) begin if (rst) begin bit_cnt <= 0; end else begin if (bit_cnt < bit_cntmax) bit_cnt <= bit_cnt + 1; else bit_cnt <= 0; end end Вот от ручного написания хотелось бы уйти. Точнее понять, где заканчивается интеллектуальность компилятора и только руками. Поглядел что делает megawizard plugin. Похоже, вяжет цепочку LABов по канонам счетчикостроения и оно тикает, если cnt_en. Когда q==bit_cntmax, дёрнуть sclr. От сумматора избавляюсь, верно?
  7. Добрый день Осваиваю плисоводство, на плате MaxII EPM570T100, соответственно quartus 13.0sp1 webedition. Нарисовалась вот такая штука, три вложенных счетчика с параметрами, задающих времянки //input bit_cntmax, word_cntmax if (bit_cnt < bit_cntmax) bit_cnt <= bit_cnt + 1; else bit_cnt <= 0; if (bit_cnt == bit_cntmax) begin if (word_cnt < word_cntmax) word_cnt <= word_cnt + 1; else word_cnt <= 0; end if (bit_cnt == bit_cntmax && word_cnt == word_cntmax) begin if (msg_cnt < MSG_LENGTH) msg_cnt <= msg_cnt + 1; else msg_cnt <= 0; end //output sig = f(bit_cnt, word_cnt, msg_cnt) Привычно глазам, в симуляторе тикает как надо, но в железе не успевает. Можно ли как-то объяснить синтезатору, что тут нужно делать именно счетчики, а не регистры+сумматор+компаратор? Или смириться и привыкать вставлять мегафункции?
  8. ТС нашелся. Уточнил параметры импульса тока: 40 +/-5 нс длительность, ~ 5 нс фронты, амплитуда задается, 80-2000 мА. Перечитал тему и сел делать железяку... Вот как раз понял, что это будет определяющий момент. По датащитам ~5 нс каждая вторая рассыпуха может. А потом я начинаю ставить это на текстолит и плавать в вопросе... Про точность амплитуды - не формализовано. На пальцах - "ну примерно прямоугольник". Все-таки не колокол и тем более не зуб пилы.
  9. Возникла задача выдать на нагрузку (импульсный волоконный лазер, ~= светодиод) одиночные импульсы тока: Длительность импульса тока 10..50 нс, амплитуда 100..2000 мА, управляемые. Фронты <=2..3 нс. Между импульсами ~ n*мс. Крайне желательна защита от отказа ключа и некорректного управления. Сейчас сделал на частично разряжаемой емкости, проще некуда: V+ -> C -> Rтокоогр. -> Нагр. -> мосфет -> земля. Как-то работает, но вместо прямоугольного импульса - кочка с переходными процессами. И беззащитность. Как это сделать правильно? В какую сторону, по каким ключевым словам читать, искать и разбираться?
  10. Добрый день всем. Присоединюсь к теме с тем же по сути вопросом и небольшими уточнениями: Есть разведенные платы (для определености - в старом альтиуме), покупная комплектуха. Задача: задокументировать сборку в корпус - схема соединений, сборочный чертеж, жгуты,... И первый раз с такой задачей сталкиваюсь. С чего начать и в чем будет проще-быстрее? Элементов и соединений сравнительно мало, можно рисовать картинками и проверить глазами.
×
×
  • Создать...