Обновить
1
Максим@mctMaks

инженер-программист

1
Подписчики
Отправить сообщение

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


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

Рано или поздно Вам скажут, что надо сделать 55+ конфигураций одной и той же прошивки с косметическими изменениями для разных клиентов

накину на вентилятор)
у segger можно с полтыка сделать отдельную конфигурации сборки с наследованием свойств от базовой. а дальше переопределить то что душе начальству угодно. коллега так сделал поддержку пачки проектов загрузчиков (штук этак 10). функционал общий, отличие только в железе. Определил нужные настройки параметров через блок DEFINES.
так что аргумент слабоват)))

но согласен, cmake более контролируемый и его проще подружить с CI/CD на гитлаб сервере

Спасибо, работает как и описано - прекрасно. Вот только не хватает возможности установить DTR / RTS сигналы для выбранного порта.

как альтернатива Hercules отлично смотрится. Нужно посмотреть ещё какими пакетами драйвер работает на нижнем уровне, тот геркулес по 20 байт отправляет игнорируя настройки размера буферов драйвера, а putty работает по максимуму (512 байт), но с ним самим не очень удобно работать.

Возможно, но тогда какой смысл их вводить и описывать для простых ядер типа М3 и М4? Я согласен с тем что надо понимать когда они действительно работают, а когда нет.

В моем понимании, если у переменной (64 бита например) обращается кто-то из кода и в этот же момент приходит прерывание в котором эта же переменная обновляется, то очень с большой долей вероятности можно получить некорректное значение переменной. Отсюда и возникает необходимость в DMB, которая заставит конвейер выполнить все операции с памятью до этой инструкции:

Команда DМВ используется в качестве барьера памяти данных. Она rарантирует, что все обращения к памяти) явно указанные до вызова команды DMB будут выполнены до Toro, как начнут выполняться явные обращения к памяти) появляющиеся после команды DМВ. Команда DМВ не влияет на порядок или выполнение

Причем в тестах, DMB именно что следовало располагать в прерывании таймера. (Я делал составной таймер, правда на nrf52840, но в данном случае речь по то же самое ядро М4. Сложность была в том, что мастер периодически делал коррекцию тика через алгоритм синхронизации. Поэтому в прерывании нужно было считать как целые, так и доли секунд. Проблема была именно в атомарном доступе к переменной, которая средствами языка не решилась. Неделя ушла на то, чтобы научиться получать эту Ситуацию стабильно и примерно месяц тестов чтобы убедится в полноценном решении.

Dsb в этом плане для аппаратных регистров подходит. Она нужна чтобы предыдущая команда была исполнена сразу. В применении к таймера - когда нужно забрать значение и тут же обнулить таймер. Проблемная ситуация: кто-то влезает между этими действиями. Вендор рекомендует после записи делать "volatile void" чтение. Документация на ядро - DSB.

Поэтому польза не только для многоядерных, но и для одиночных контроллер есть.

Edit: да, если параноить дальше, то ещё REX (исклюзианый доступ) надо пользовать. Эти инструкции позволят оценить что при обращении к ячейке памяти никто больше туда не влезал. Но это уже отдельная тема, которую я совсем поверхностно смотрел

Конечно. И статик и volatile вешал.

Я делал свой таймер, с коррекцией типа под мастера. Спасение было в расстановке барьеров.

Вот тут нюанс описывается

По дизассемблеру - нет. Компилятор использовал от segger, который явно сделан на основе arm clang.

На том же stackoverflow есть несколько тем посвященных dsb и dmb.

А ещё книжка хорошая есть по ядру М3 и М4 от (имя забыл, Янг кажется). Плюс спеку на ядро полезно посмотреть. Там как раз описывается зачем эти инструкции нужны и область их применения.

Проблемы навскидку данного примера кода:

  1. слишком частые прерывания будут в системе;

  2. нарушение атомарности

контроллер 32 бита, переменная 64 -> запись за один такт не возможна. нужно либо ставить критическую секцию, что чревато блокировкой чего-то важного достаточно часто.

и да, на ARM Cortex M критическая секция не гарантирует что инструкции внутри нее будут выполнены в правильном порядке, поэтому нужны ещё барьерные инструкции.

tim3Tick64 ++;

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

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

А что на русский язык слово task, никак не переводится?

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

По итогу настройка ищется просто методом "тыка". Исхожу из опыта работы с "русским" сервером гитлаб, блендером и те же VS Code.

если для Vim частый запрос "как выйти", то для VS Code достаточно популярный запрос "как вернуть английский язык"

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

Так получается в идеале по стандарту минимум 7.5мс, не считая время опроса и обработки нажатия самой мышью?

Вы не учитываете неидеальность доставки. Это просто период времени, с которым устройства могут выйти в эфир. Далеко не факт что в данный момент данные будут готовы для передачи, либо хост может быть не готов обслуживать именно это соединение. В случае ошибки доставки, следующая передача только в следующий интервал подключения (если стек строго по спецификации работает). Так что 7.5мс это очень сильно оптимистично и дорого по потреблению (да, несмотря на LE это будет в сумму прилично). Хотя с потреблением как раз можно через Max_Latency решить вопрос: это грубо говоря разрешение не выходить указанное число интервалов в эфир для обмена данными, если этих данных нет.

Различие задержки аудиокодеков

аудио через BLE помимо кодека, использует ещё и кэширование на стороне устройства. Кэш в данном случае решает процедуру задержки сигналов при передаче.

Для справки: реакция человека на внешний раздражитель примерно 200 мс.

Реакцию среднестатистического человека оценивают от 100мс (я участвовал в разработке устройств для фиксации времени реакции на раздражение, в составлении ТЗ принимали участия в том числе и доктора).

для беспроводного МК антенны не хватает, но рядом явно флешка с QUAD-SPI интерфейсом.

Раз есть интрига, то предположил бы что-нибудь редкое. Возможно на Cortex M-33, что-то типа stm32u5 серии. Либо STM32G4/G0 серия, в которых удобно питание разводить

ну как появилась, лет 6 назад судя по шиту появились первые версии этого кабеля. Насчет размеров, несколько спорный момент. Требуется порядка 12-15 мм "чистого" края платы для размещения 6-пиновой версии. Но оно явно меньше версии, которая на подпружинных контактах.

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

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

Ждем теперь "Bad Apple" на основе этой пасты

программы открываются то в 1-м дисплее то во 2-м

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

из отдельных багов/особенностей:

не всегда убиваются сетевые соединения. Был неприятно удивлен когда VPN вдруг перестал работать из-за занятого порта. Оказалось что все свободные порты ... кончились из-за не убитых процессов. Спасение оказалось в сбросе всех сетевых подключений. Перезагрузка не помогла.

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

пойду тоже закажу парочку))

Не совсем понял как китайский аналог работает. Он по сути простая прищепка с пого-пинами? Целевая плата просто вставляется в него? По ссылке на Али пока не понятно, вижу версии с разной длиной штырей, но принципа работы не нашел (пока что). Можно немного подробнее?

Разве Segger виноват в том, что программист задает нулевой размер кучи а потом создает экземпляр класса при помощи new, причем там, где это совершенно не нужно?

проблема в другом. Программист явно указал не использовать кучу, но зачем-то решил это делать (забыл например или не знал что нельзя использовать кучу). Segger в данном случае создал кучу сам в некой области памяти. По map файлу это видно было, но нет данных о размере этой кучи.

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

 Классический ленивый Singleton может так выглядеть

есть много разных вариантов, тот что в моем комментарии выше приведен для примера кода. При желании можно даже такое написать:

template <typename T>
class Singleton {
public:
  static constexpr T& instance() { 
    return inst_;   
  }
  
  const Singleton<T>& operator=(const Singleton<T>&) = delete;

private:  
  inline static T inst_;
};

лакированный провода от наушников лудил в обыкновенной канифоли. на паяльнике капля припоя, провод кладется на канифоль и там уже греется. температура ~350, время порядка 5 секунд на провод. И никаких танцев с бритвой для снятия лака.И приятный запах канифоли вокруг.

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

Что тру C++ программисты думают о reinterpret_cast, кстати?

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

 А потом, и собственный HAL компании, написанный на плюсах разросся, и охватил многие STM32 и Nordic. 

Разрешите поинтересоваться, в целях повышения образованности, а кто такой будет Иван Федорович Крузенштерн код данного HAL является закрытым? Или все же можно посмотреть некоторые интересные моменты?

Сейчас по сути занимаюсь тем же, связка Nrf + STM. Задачи однотипные, но сделать универсальным получается только базовые вещи. Плюсом идет то, что плюсы изучаю в процессе. Некоторые вещи получается сделать красиво, некоторые нет. Хотелось бы повысить свои навыки.

1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Таганрог, Ростовская обл., Россия
Дата рождения
Зарегистрирован
Активность