All streams
Search
Write a publication
Pull to refresh
2
0
Максим @mctMaks

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

Send message
динамическая память в Qt, для GUI приложения. Там во всю пользуюсь, а тут… с учетом того что SEGGER не понятно когда, где и как создает кучу, как-то не особо приятно.
lamerok, ага, его статьи зачитаны до дыр. Более того, по сути эти статьи и сподвигли меня на переход в с++ при разработке проектов.

Потому что обернуть можно тысячей разных способов.

Согласен, но не все одинаково удобны. у меня аллергия на динамическую работу с памятью в МК, поэтому делаю все по максимуму в статике. Счастье было, когда удалось статический полиморфизм (CRTP) реализовать у себя. Ну по крайней мере мне так кажется что удалось)
Я к чему, таких статей можно нагенерить множество (по каждому проекту, свои «велосипеды»), и, кстати ИМХО — это будет своего рода база знаний, что можно сделать при написании кода.

Идея интересная. Задумался над тем, чтобы показать свой «шаблонный» велосипед над freeRTOS и стеком BLE. Но терзают определенные сомнения ибо «вроде работает, если вот и тут не трогать» )

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

Да, но у меня достаточно часто при переносе велосипеда из проекта в проект он обрастает новыми деталями. Потому что предусмотреть все и сразу не возможно. Обязательно что-нибудь не обычное вылезет.

на тему развития велосипедов

mode = Sarcasm;
можно предположить что от транскрипции [ˈnʌmbə®], достаточно «близко» )
абстракция она на то и абстракция, чтобы уйти от конкретики. В Вашем случае абстракция получилась над одним, уже теряющем популярность (ибо по практически той же цене и в том же форм-факторе доступна stm32f411/f401), stm32f103.

опять же, как часто Вам приходилось в устройстве с МК менять настройки пинов динамически? Я даже сходу пример-то не могу такой придумать. Максимум что приходилось делать, это переводить в состояние, при котором потребление будет минимальным. Опять же, однократно перед сном. Получается что динамика в данном случае избыточна. Шаблоны тема сложная, но интересная.

Вот собственно и все. Думаю в таком виде работать с портами ввода-вывода гораздо удобнее, чем напрямую с регистрами.

Относительно. Когда говорят «пишу на регистрах» не стоит считать что по всему коду разбросы строки вида:
 GPIOC->BSRR = 1 << pin; 

Это все так же оборачивается в функции. Поэтому и спорное утверждение об удобстве.
Мой вариант, правда для nrf52840, но суть та же. Настройка пина. При конфигурации происходит сборка по ИЛИ допустимых настроек.

  Gpio<port1, 3> enable_;
  enable_.configurate(output | noPull);
  enable_.set(); // разрешаем питание на драйвер светодиода


вот что порадовало, так это использование регистров «BRR» и «BSRR».

тут разве не в правильности и оптимизации при использовании вопрос стоит?

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

Опять же, взять ARM микроконтроллер, тот же stm32 например. Можно аппаратный I2C использовать и получить «фантастические» отзывы о том как это круто и AVR «пора закопать», а можно написать программный ногодрыг и получится что ARM ничем от AVR не отличается, скорости по шине ведь те же. Утрировано конечно получилось.
BT в целом более устойчив к «грязному» эфиру, так как создает карту «хороших» каналов на которых можно работать без проблем. Не панацея, но более устройчиво по сравнению с Wi-Fi.

Опять же, размеры модулей BT меньше чем Wi-Fi.

Насчет потребления, сейчас с анонсом нового Wi-Fi протокола версии 6, потребление у Wi-Fi может стать гораздо меньше со всеми вытекающими последствиями. Опять же, Nordic прикупили команду разработки Wi-Fi…
имхо, если только как промежуточная остановка для перелетов куда подальше. ну или как «парковка»
ага, было такое дело в моей практике.

делали устройство, загрузчик самописный был с обновлением через WIFI. Заложился на фиксированный размер образа, 90кБ. Как раз оставшееся свободное место в ОЗУ stm32 ушло на этот демпфер. Рабочая микропрограмма получалась порядка 70 кБ, так что выделил как казалось с запасом…
а потом, добавить ещё пару плюшек и… образ внезапно получился 92 кБ с учетом оптимизации. Как итог, писался апгрейд загрузчика, который грузился вместо основной прошивки и переписывал бут. Далее уже новый бут принимал новую прошивку.

определенная часть таких единомышленников явно работает в одной польской компании. Если судить по последним статьям об их детище, конечно же ))
sarcasm = on;
10 == 1010 (в двоичном виде)
sarcasm = off;
По большому счеты правильное суждение, но не совсем правильное объяснение:
Сила ARM — в более мощной периферии и на более навороченной арифметике

ARM — это ядро, периферии там по большому счету нет. Сила ARM в гарвардской архитектуре ядре со всеми вытекающими. Математика это так же отдельные блоки, такие как DSP и FPU (DPU в более навороченных).

периферия это уже к производителю МК, чего они уже там накрутят. Тот же STM далеко не лидер в наличии «интересной» периферии.
эт такими темпами и до мидихлориан не далеко, а там галактическая республика, торговая федерация… эх, да прибудет с нами сила!

p.s. и здоровье тоже
Во-первых плашку перевод надо сделать позаметней, слишком много кто её не замечает при первом прочтении.

Во-вторых, люди то будут читать перевод. Сам перевод критиковать не буду, ибо я, как говорится, в данной теме «не копенгаген». Но указать на наличествующие ошибки я думаю стоит. Хотя бы для тех, кто решит пойти тем же путем что и автор.

edit: посмотрел комментарии под оригиналом. Большая часть восторженная, статья волшебна, автор маг. Но есть и полезные, со справедливой критикой. Например, вот фрагмент ветки:

-> Looks like your example is “How to write your own GPIO library” instead of writing a code in bare metal. i.e. If you need to call a function with a dozen lines of code trying to parse what your I/O function is, it is by definition not bare metal.

-> Well, still, at some point doing JUST “register transfer” gets rather … tricky.


¯\_(ツ)_/¯
Поздравляю, вы только презентовали очередную надстройку над CMSIS. Да, все как и было обещано:
В этом материале я хочу рассказать о том, как писать программы для микроконтроллеров (Microcontroller Unit, MCU) Cortex-M, вроде STM32, используя лишь набор инструментов ARM и документацию, подготовленную STMicroelectronics.


Но, если уж на то пошло. Почему тогда полноценно не брать готовые битовые маски\значения для битовых полей регистров? Диссонанс прям возникает от такого:
uint8_t pin2 = pin * 2;
instance.regs->MODER &= ~(0x3 << pin2);
instance.regs->MODER |= (0x1 << pin2);


Структуру с описанием порта значит из стандарта берем (обращение к полю MODER структуры GPIOx), а маску и битовое значение посчитаем сами. Иначе видимо не получится «низкоуровневое программирование»

Опять же, есть определенный нюанс с порядком настройки GPIO. Он описан не совсем явно (это уже к авторам вопрос), но регистр MODER прописывается в последнюю очередь, уже после всех основных настроек. Пример представлен в секции с описанием настройки альтернативной функции GPIO. Вы же пишите универсальную функцию инициализации? Значит это нужно учитывать. Вот фрагмент reference Manual, раздел GPIO, с указанием (неявно, но подтверждено на практике) порядка инициализации:
Peripheral alternate function:
– Connect the I/O to the desired AFx in one of the GPIOx_AFRL or GPIOx_AFRH
register.
– Select the type, pull-up/pull-down and output speed via the GPIOx_OTYPER,
GPIOx_PUPDR and GPIOx_OSPEEDER registers, respectively.
– Configure the desired I/O as an alternate function in the GPIOx_MODER register.

Более того, если регистр будет настроек на выход, то значение в ODR (лучше через BSRR) должно быть записано заранее. Иначе на линии запросто возникает короткий импульс.

Аналогично выглядит и использование ODR (Output Data Register, регистр выходных данных), с помощью которого осуществляется вывод данных на пин:

Для вывода лучше использовать BSRR. Это опять же рекомендовано в документации. В добавок доступ будет атомарным, код проще, время исполнения меньше. Что-то типа этого (упрощенно, чтобы показать смысл):
port->BSSR = 1 << pin; // для установки 1
port->BSSR = 1 << pin << 16; // для сброса в 0

Это позволит, в том числе, работать и с битовой маской, если нужно изменить сразу несколько пинов одного порта. Назначение регистра ODR ровно такое же, как и IDR — узнать состояние порта. Т.е. его следует использовать только для контроля, что значение действительно выставило в выходном регистре.

Конечно, разрабатывать программы для MCU STM32 можно с помощью существующих фреймворков. Это может быть ST HAL, обычный CMSIS, или даже что-то, более близкое к Arduino. Но… что тут увлекательного?

Использование фреймворка без чтения документации вредно. Все равно придется рано или поздно лезть в потроха для исправления ошибок авторов фреймворка. HAL именно за это и ругают чаще всего. Те ошибки, что я указал вам, были (а может и до сих пор есть) в HAL от ST. Даже в CMSIS от arm попадаются ошибки, от этого никто не застрахован. Не верите, посмотрите их github.

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

Простите, но вы сами видимо не совсем понимаете данную платформу. Заметьте, это всего лишь GPIO, простой как 3 копейки модуль, но и в нем у вас ошибки.
А что говорить про I2C\SPI, где таких мелочей вагон и маленькая тележка?

sarcasm = on;
блин, но вчера же все нормально компилировалось…
sarcasm = off;
при всех его достоинствах LaTeX выдает PDF-файл, в который невозможно вносить исправления


PDF-XChange Viewer даже в бесплатной версии умеет в PDF добавлять пометки, замечания, зачеркивать текст и т.д. При небольшой практике вполне достаточно для внесения небольших правок.
Меня это спасло, когда надо было в дипломе поправить пару мест перед печатью, а оригинал открыть было нечем.

Если конечно объем правки не составляет несколько страниц А4 формата)))
Спасибо, интересная вещь.

Интересно, arm_dsp_library пользует ли данную инструкцию? Функции копирования там есть, но вот оптимизирует ли они свой код этой инструкцией или отдают на откуп компилятору, не ясно до конца.

Information

Rating
Does not participate
Location
Таганрог, Ростовская обл., Россия
Date of birth
Registered
Activity