STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3906185#p3906185"]походу дела проблема с версией[/uquote]Конечно. Мой пример С++17 хочет. Обновите компилятор.
https://developer.arm.com/tools-and-sof ... /downloads

Добавлено after 1 minute 17 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3906195#p3906195"]
VladislavS писал(а):Зачем его разворачивать?
а зачем Reflector развернул функцию lcd_init()? если не разворачивать, то все лаконично-понятно, аж слеза накатывает :)[/uquote]Затем, что вы внутренности этой функции ручками начирикали, а Reflector вместо неё одну строку написал. Вот и получается, что ему всё равно что внутри, а вам пришлось разворачивать.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):Вот и получается, что ему всё равно что внутри, а вам пришлось разворачивать
наоборот: чтобы доказать простоту его кода, ему пришлось разворачивать "мою" функцию. без этого мой вариант выглядит куда лаконичнее :)

зато нет проблемы
VladislavS писал(а):С++17 хочет
так же "мой" вариант понятен даже начинающим. и крайне маловероятно, что спустя 20 лет и 100500 версий стандарта он перестанет собираться.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3906152#p3906152"]Скажем, я сейчас запросто могу скомпилировать сишный код 40-летней давности. И я без проблем пойму, что там написано и при необходимости смогу его изменить. А вот в случае с С++ все совершенно не так! И мало того, что нужно выучить текущую версию С++ (в отличие от С, где достаточно почитать K&R, а потом ради интереса полистать, что там нового в С99, но и без этого легко обойтись), так еще и всегда надо следить за обновлениями![/uquote]Что за глупости? Точно так же можно любой код скомпилировать. На крайний случай есть ключ компилятора, выбирающий поддерживаемый стандарт.

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3906152#p3906152"]Ну нафиг оно нужно? 20 лет назад я выучил С и пишу на нем по сей день. И мне нет нужды читать дебильные стандарты каждые несколько лет, чтобы знать, что там какие-то мудаки нового наворотили![/uquote]Разве этим можно гордиться? Настоящий разработчик всю свою жизнь что-то новое изучает. 20 лет назад AVR-ки были модны, не сидеть же на них до пенсии.

Добавлено after 15 minutes 12 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3906223#p3906223"]наоборот: чтобы доказать простоту его кода, ему пришлось разворачивать "мою" функцию. без этого мой вариант выглядит куда лаконичнее :)[/uquote]Легко поставить вас в равные условия

Код: Выделить всё

void SuperInit() 
{
  // Охрененно_сложный_супер_шаблон<>()
}
И хоть обрыдайся.

[uquote="ARV",url="/forum/viewtopic.php?p=3906223#p3906223"]зато нет проблемы
VladislavS писал(а):С++17 хочет
[/uquote]А в чём проблема? Как минимум, три мэинстримовых компилятора для ARM поддерживают C++17. Хочешь в Keil, хочешь в IAR, хочешь на чём угодно GCC-ном собирай.

[uquote="ARV",url="/forum/viewtopic.php?p=3906223#p3906223"]так же "мой" вариант понятен даже начинающим.[/uquote]Вы код на конкурс начинающих Си-чтецов пишете или чтобы он работал в контроллере?

[uquote="ARV",url="/forum/viewtopic.php?p=3906223#p3906223"]и крайне маловероятно, что спустя 20 лет и 100500 версий стандарта он перестанет собираться.[/uquote]То же самое скажу про код, написанный по стандарту С++17. Нет той силы, которая запретит собрать его через 20 лет.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS писал(а):Конечно. Мой пример С++17 хочет. Обновите компилятор.
Обновил, подменил папочки.
Поставил в настройках -std=gnu++1z
Теперь собирает, но с такими предупреждениями
Спойлер

Код: Выделить всё

../system/include/cmsis/cmsis_gcc.h: In function 'uint32_t __get_PSP()':
../system/include/cmsis/cmsis_gcc.h:150:21: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]

Код: Выделить всё

../system/include/cmsis/cmsis_gcc.h: In function 'uint32_t __get_MSP()':
../system/include/cmsis/cmsis_gcc.h:175:21: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]

Код: Выделить всё

../src/main.cpp:143:9: warning: typedef 'using TestPort = class TSimplePort<1073809408>' locally defined but not used [-Wunused-local-typedefs]
еще раз, куда я это

Код: Выделить всё

using TestPort = TSimplePort<uint32_t(GPIOA_BASE)>;
должен поместить? В основную функцию main или как?
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Dimon456, Файлы CMSIS тоже бы обновить. using TestPort = ... поместить в любом месте, где вы typedef обычно пишете. Это по сути то же самое определение типа. Вызов функции toggle() там где он нужен, хоть в main.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3906180#p3906180"]согласен. но вопрос в том, как две или не две строки воспринимаются: если алгоритм виден, можно понять любому, а если алгоритм скрыт в библиотеке ли, в стандарте ли, в шаблоне ли и т.п. - тобоооольшой вопрос, сможет ли любой профи разобраться.[/uquote]
Библиотека наоборот должна скрывать детали реализации, наружу торчит только интерфейс из которого должно быть понятно как ей пользоваться, а не как оно там внутри все реализовано. Профи, если нужно, залезет внутрь и разберется, иначе он не профи :)
ARV писал(а):для меня, в конечном итоге, важно не добиться супероптимального результата по коду, а добиться легкости в написании с предельно сохраняемой понятностью написанного. и вот с понятностью С++-ый вариант пока меня страшит...
Столько людей на форумах годами пишут, что С++ не понятный, а что они ради его понимания сделали? Ардуинщики с околонулевыми знаниями пишут на C++, пусть и без шаблонов, а более опытные программисты страшаться. Видимо все дело в неспособности отринуть свой предыдущий опыт программирования, насколько бы порочным он ни был :)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Dimon456 писал(а):Обновил, подменил папочки.Поставил в настройках -std=gnu++1z
Теперь собирает, но с такими предупреждениями
Нормально все собирается.

Код: Выделить всё

int main(void)
{
    using TestPort = TSimplePort<uint32_t(GPIOA_BASE)>;
    TestPort::toggle();

    while(1)
    {
    }
}

Код: Выделить всё

(43)      using TestPort = TSimplePort<uint32_t(GPIOA_BASE)>;
(44)      TestPort::toggle();
080001E8	ldr	r2, [pc, #8]	; (0x80001f4 <main()+12>)
080001EA	ldr	r3, [r2, #12]
080001EC	mvns	r3, r3
080001EE	str	r3, [r2, #12]

Код: Выделить всё

bin\Release\cpp.map|1|Program size (bytes):     612|
||Data size    (bytes):       8|
||BSS size     (bytes):      28|
||             ----------------|
||Total size   (bytes):     648   (R/W Memory: 36)|
|||
||=== Сборка закончена: 0 errors, 0 warnings (0 minutes, 0 seconds) ===|
Вложения
cpp.zip
(143.94 КБ) 210 скачиваний
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS писал(а):Вызов функции toggle() там где он нужен, хоть в main.
Исходя из листинга

Код: Выделить всё

using TestPort = TSimplePort<uint32_t(GPIOA_BASE)>;
using TestPort2 = TSimplePort<uint32_t(GPIOA_BASE), (1<<2)>;
using TestPort3 = TSimplePort<uint32_t(GPIOA_BASE), (1<<2)|(1<<1) >;

  TestPort::toggle();
  TestPort2::toggle();
  TestPort3::toggle();
вроде как три раза обратился к функции toggle, потратив на это 14 16 и 12 байт, в отладчике трудно это проследить, не видно откуда он в функцию toggle попадает.

Ну ладно, хорошо, давайте светодиодом поморгаем, развивайте дальше мысль.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Ну попробуйте аналогично toggle добавить методы set, clear, write. Потом сравним.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3906226#p3906226"]Точно так же можно любой код скомпилировать. На крайний случай есть ключ компилятора, выбирающий поддерживаемый стандарт.[/uquote]
Зато человеку, изучавшему 20 лет назад С++, невозможно будет понять современные портянки на псевдокрестах! А вот с С все нормально!!!
Настоящий разработчик всю свою жизнь что-то новое изучает. 20 лет назад AVR-ки были модны, не сидеть же на них до пенсии.
Я и изучаю: сейчас вот с пусироботовскими драйверами ШД вожусь. Написал для них управлялку, теперь надо веб-морду на libonion делать (сама библиотека сыровата, пришлось повозиться с нормальной аутентификацией и безопасной работой с веб-сокетами). Ну и параллельно вожусь с будущими роботелескопами. Там вообще еще конь не валялся: пока наблюдаем одну поляну всю ночь, хватает баш-скрипта, но писать еще очень много кода, авось, года через три дойду до планировщика. Думаю идею у Кубанека из его RTS2 спереть, но реализацию придется писать с нуля (у Кубанека на С++ написано - не годится так).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Reflector писал(а):Библиотека наоборот должна скрывать детали реализации, наружу торчит только интерфейс из которого должно быть понятно как ей пользоваться, а не как оно там внутри все реализовано.
с точки зрения непрофессионала, никакой разницы между вашим классом-шаблоном или вызовом библиотечной функции нет. что понятнее - то и лучше.
Reflector писал(а):Видимо все дело в неспособности отринуть свой предыдущий опыт программирования, насколько бы порочным он ни был
ну, как бы дело не в неспособности, а в отсутствии мотивации, я уже объяснял это не раз. когда мне потребовались шаблоны в Pascal-е, я достаточно быстро с ними разобрался. во всяком случае в необходимом для моих целей объеме. а вот С++ я даже с базовым синтаксисом не хочу начинать разбираться - слишком все запутанно и неоднозначно, а держать в голове лишнюю информацию - нет мотивации.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

ARV, просто охота сравнить, какие затраты на вызов функции, если ее и так представить и эдак.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Dimon456 писал(а):просто охота сравнить
это уже сравнивали не один раз: с этими хитрыми классами-шаблонами в среднем получается заметно оптимальнее, чем напишет ручками неуч вроде меня, и лишь совсем чуток хуже, чем профессионал сделает на ассемблере. т.е. овчинка выделки стоит с точки зрения быстродействия и объема кода, но это если выделка вообще не требуется (в смысле - уже есть знание С++ на уровне гуру средней руки).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3906363#p3906363"]ARV, просто охота сравнить, какие затраты на вызов функции, если ее и так представить и эдак.[/uquote]Когда делаешь шаблонами в том стиле как я показал, то с большой вероятностью вызова функций вовсе не будет. Всё просчитается, оптимизируется и заинлайнится. Это если на скорость оптимизировать. При оптимизации на размер бутут вызовы функций, но такова плата за размер. В любом случае, когда делаешь шаблонами, то намного больше кода находится в одной единице трансляции и самих единиц трансляции меньше получается. Отсюда и степень оптимизации выше, чем при классическом проекте. А если учесть, что эмбэддинг это в основном работа с volatile сущностями, то компилятор связан по рукам и ногам и программисту приходится ему помогать, если хочешь получить хороший результат.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

VladislavS покажи мне как на C++ с помощью таймеров и DMA аппаратно управлять светодиодной лентой на WS2812B, устанавливать яркость, цвет.

Настройка порта там три строки, остальное алгоритмы.

Код: Выделить всё

	RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
	GPIOB->MODER |= GPIO_MODER_MODER4_1;
	GPIOB->AFR[1] |= GPIO_AFRH_AFSEL4_1;
А потом когда закончишь на STM32 писать либу, портани ее на AVR, PIC, Raspberry, arduino и еще какие-нибудь, и залей на гитхаб. И чтобы везде работало. :tea:
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А кофе тебе с утра в постель не принести?

Конкретно для WS2812B у меня ничего нет, не приходилось делать, другая тематика работы. А что там такого, чего нельзя на плюсах красиво написать? Включить PWM режим на таймере и натравить на него DMA - вызов двух методов двух классов.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

О, WS2812, где там Reflector, когда родит код что бы мир перевернулся?

stm32f030f4p6 WS2812 таймер + DMA ШИМ, обошелся одним буфером DMA в 24 байта, начинает работать от частоты 16МГц.
К сожалению я не программист, и мой код видимо не правильный, хотелось бы увидеть как специалисты это сделают.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вот объясните мне, чего он всё в DMA да таймеры тычет? Те же таймеры - непаханное поле для С++. В разных контроллерах их разное количество, в разных таймерах разное количество каналов и возможности этих каналов разные.
Вот, например, класс знает что в этом контроллера на TIM1 6 каналов, а на TIM2 всего 4 и прямо в IDE мне это подскажет.
Изображение

Изображение

А внутри сделает все возможные проверки и не даст установить режимы/биты отсутствующие в конкретном таймере. Я не смогу даже попытаться включить прерывание, которого нет в конкретном таймере.
Изображение
СпойлерИзображение
tim1.png
(26.57 КБ) 346 скачиваний
tim2.png
(26.46 КБ) 355 скачиваний
Tim3.png
(62.85 КБ) 77 скачиваний
tim4.png
(17.05 КБ) 343 скачивания
И т.д. и т.п.

Добавлено after 54 minutes 29 seconds:
Вот ещё пример, учтена разрядность счётчика таймера. И это всё на этапе компиляции, а не когда что-то не так работать будет.
Изображение
tim5.png
(14.74 КБ) 445 скачиваний
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Oxford",url="/forum/viewtopic.php?p=3906509#p3906509"]Настройка порта там три строки, остальное алгоритмы.[/uquote]
Давай я лучше покажу как у меня тактирование для H750 настраивается. Там три 3-х канальных PLL, на вход подается частота с HSE/CSI/HSI, для последнего еще делители могут быть. И умножитель там сдвоенный, один принимает частоты в диапазоне 1..2 MHz, а на выходе будут 150..420 MHz, у второго на входе 2..16 MHz, а на выходе от 192 до ~1400, если разгонять. Выбрать какой из них использовать с учетом того, что на трех каналах могут быть разные частоты не так и просто. А каналов нужно много, даже SPI1/2/3 нельзя затактировать от APB, только PLL или HSE/CSI/HSI, то там частоты обычно небольшие. LTDC - только PLL, SDMMC - только PLL и т.д.... Другими словами тут все значительно сложнее, чем было, например, на F4, где обычно хватало одного канала одного PLL. В итоге был написан ряд шаблонных классов:

Код: Выделить всё

using pll1 = Pll1<960, 2, 20>;      // P: 480, Q: 48
using pll2 = Pll2<200, 1, 4>;       // P: 200, Q: 50
using pll3 = Pll3<160, 0, 0, 4>;    // R: 40
Plls<PllSrc::Hse, pll1, pll2, pll3>::init();
Rcc::switchToPll<pll1, AhbPresc::_2>();
Эти 5 строк делают все, включают нужные генераторы, настраивают все PLL с проверкой входных параметров, задают латентность флеша и также настраивается Voltage Regulator, чтобы питания хватало для заданной частоты. За сколько занятий сможешь научить новичка настраивать это все правильно? :)

А WS2812B у меня давно работают, тому же Dimon456 было все разжевано, иначе у него до сих пор работало бы с SPI и без DMA. Причем идея использовать SPI ведь тоже не его, а позаимствована из кода ARV, зато просить у меня в личке помощи и потом называть мои советы тупыми, это он может :)
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Пожалуйста, можно подробнее, где почитать про реализацию управления ВС2812 через Таймер и ШИМ? Если это уже где-то было описано Вами.

Добавлено after 1 minute 14 seconds:
Ну, то, что Dimon456у объясняли.
Станислав
Ответить

Вернуться в «ARM»