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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

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

Сообщение ARV »

Eddy_Em писал(а):Там такой дичи, как лямбды, шаблоны и т.п., не было!
а вот соглашусь :)
лямбды, замыкания и т.п. новшества - они какой цели служат?
имхо, если для того, чтобы на 1% упростить написание кода 1% программистов, то явно что-то в консерватории не то...

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

и все это делается, имхо, исключительно ради того, чтобы программист писал каждый новый класс/метод ТОЛЬКО из трех строк, не считая фигурных скобок. такое упрощение путем извращения - это явный перегиб...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение Dimon456 »

VladislavS писал(а):Извини, библиотека не для распространения.
ожидал такого ответа.
Ну да ладно, чет не собирается ваш пример, пишет
Спойлер

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

error: body of constexpr function 'constexpr uint32_t countSetBits(uint32_t)' not a return-statement

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

warning: 'base' function uses 'auto' type specifier without trailing return type [enabled by default]

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

error: expected '(' before 'constexpr'
и тп
встроенный пример с таймером собирается
Спойлер

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

#ifndef TIMER_H_
#define TIMER_H_

#include "cmsis_device.h"

// ----------------------------------------------------------------------------

class Timer
{
public:
  typedef uint32_t ticks_t;
  static constexpr ticks_t FREQUENCY_HZ = 1000u;

private:
  static volatile ticks_t ms_delayCount;

public:
  // Default constructor
  Timer() = default;

  inline void
  start(void)
  {
    // Use SysTick as reference for the delay loops.
    SysTick_Config(SystemCoreClock / FREQUENCY_HZ);
  }

  static void
  sleep(ticks_t ticks);

  inline static void
  tick(void)
  {
    // Decrement to zero the counter used by the delay routine.
    if (ms_delayCount != 0u)
      {
        --ms_delayCount;
      }
  }
};

// ----------------------------------------------------------------------------

#endif // TIMER_H_
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Dimon456, чем собираешь с какими ключами компиляции? Версию языка бы поднять для начала. Для GCC вот так "-std=gnu++1z".

Добавлено after 51 second:
[uquote="ARV",url="/forum/viewtopic.php?p=3906054#p3906054"]и все это делается, имхо, исключительно ради того, чтобы программист писал каждый новый класс/метод ТОЛЬКО из трех строк[/uquote]Делается это всё чтобы и на огрызке, и на всём зоопарке роботов работало одинаково.
simple_port.hpp
(721 байт) 142 скачивания
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3906054#p3906054"]лямбды, замыкания и т.п. новшества - они какой цели служат?[/uquote]
Сейчас у меня в либе портов есть такие функции с лямбдами:

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

static void _inline_ set() { foreach(ports_, [](auto port) _inline_ { GpioT<port.value, getPinsMask<port.value>(pins_)>::set(); }); }
Всего в классе 17 лямбд, раньше было без них, приходилось добавлять лишнюю функцию:

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

static void _inline_ set() { set_(ports_); }

template<typename... Ports>
static void _inline_ set_(TypeList<Ports...> ports)
{
	(GpioT<Ports::gpio, getPinsMask<Ports::gpio>(pins_)>::set(), ...);
}
Здесь во второй функции используется свертка(fold expression) и она применяется гораздо реже лямбд, кто-то может сказать зачем, в таком случае, эти свертки нужны... И раньше действительно было без них:

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

static void _inline_ set() { set_(ports_, pins_); }

template<typename... Ports, typename... Ps>
static void _inline_ set_(TypeList<Ports...> ports, TypeList<Ps...> pins)
{
	if constexpr (!empty(ports))
	{
		static constexpr uint32_t gpio = decltype(head(ports))::type::gpio;
		GpioT<gpio, getPinsMask<gpio>(pins)>::set();
		set_(pop_front(ports), pins);
	}
}
До C++17 не было if constexpr, приходилось делать через шаблоны с добавлением еще одной функции, а до С++11 не было вариантивных шаблонов и чтобы передать список с произвольных числом пинов пришлось бы написать целый класс весьма внушительных размеров, в либе портов Чижова до сих пор для этих целей используется библиотека Loki.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Reflector писал(а):И раньше действительно было без них
единственное, что я увидел в этих примерах, что был прав:
ARV писал(а):все это делается, имхо, исключительно ради того, чтобы программист писал каждый новый класс/метод ТОЛЬКО из трех строк,
Добавлено after 59 seconds:
Reflector писал(а):

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

template<typename... Ports>
static void _inline_ set_(TypeList<Ports...> ports)
{
   (GpioT<Ports::gpio, getPinsMask<Ports::gpio>(pins_)>::set(), ...);
}
считаем строки :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="Reflector",url="/forum/viewtopic.php?p=3906097#p3906097"]До C++17 не было if constexpr[/uquote]
Я больше скажу: до С++99 (примерно) язык был вменяемым. А потом превратился в очередную убогую пародию на жабку…
Как вообще можно читать такую портянку, где переплетены шаблоны, лямбды, constexpr'ы и прочий бред? Это же невозможно в голове удержать! И на больших объемах кода даже IDE тебе не подскажет, во что в итоге та или иная конструкция развернется.
Зато в С все понятно: и навигацию по функциям можно сделать, и макросы развернуть.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Используйте нормальные IDE. Вот на сегодняшнем примере.

Изображение

Изображение

Изображение
ide1.png
(7.87 КБ) 518 скачиваний
ide2.png
(15.78 КБ) 532 скачивания
ide3.png
(13.64 КБ) 548 скачиваний
Добавлено after 11 minutes 49 seconds:
[uquote="Reflector",url="/forum/viewtopic.php?p=3906097#p3906097"]Сейчас у меня в либе портов есть такие функции с лямбдами:

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

static void _inline_ set() { foreach(ports_, [](auto port) _inline_ { GpioT<port.value, getPinsMask<port.value>(pins_)>::set(); }); }
[/uquote]А я ленивый. Но после того как Reflector попинает, эта функция вырождается вообще вот в такую :)

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

static inline void set() { foreach(ports_, [](auto port) { port.set(); } ); }
Где port.set() это что-то типа того что мы сегодня про toggle() проходили.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3906052#p3906052"]Зашел. О, мои глаза!
Какое-то сборище наркоманов!!![/uquote]Сопредседатель этой группы ведущий разработчик в яндексе. Благодаря таким наркоманам у тебя такие высоконагруженные сервисы как карты, такси и пр. работают.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Да здесь IDE не при чем, когда код абсолютно нечитабельный!
Самый главный принцип — KISS. И чем проще код, тем легче его будет поддерживать лет через N-ть.
Скажем, я сейчас запросто могу скомпилировать сишный код 40-летней давности. И я без проблем пойму, что там написано и при необходимости смогу его изменить. А вот в случае с С++ все совершенно не так! И мало того, что нужно выучить текущую версию С++ (в отличие от С, где достаточно почитать K&R, а потом ради интереса полистать, что там нового в С99, но и без этого легко обойтись), так еще и всегда надо следить за обновлениями!

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

[uquote="VladislavS",url="/forum/viewtopic.php?p=3906151#p3906151"]Сопредседатель этой группы ведущий разработчик в яндексе.[/uquote]
То, что в яндексе работают рукожопы, идиоты и наркоманы, для меня не секрет! Эти уродцы до сих пор "яндекс-диск" не могут исправить: версия 0.1.5.1039_p1 не работает, приходится держать предыдущую и надеяться, что они не поломают API. Поддержка обещала исправиться, но, судя по всему, забили на это. Насрать им на клиентов.
И, кстати, яндекс-навигатор уже больше полугода как тупит нещадно. Я езжу по гуглокартам. Они не тупят в отличие от. Правда, google — это вообще корпорация зла, яндекс им по степени подлости и мудачества даже в подметки не годится!
Последний раз редактировалось Eddy_Em Вт окт 13, 2020 15:00:54, всего редактировалось 1 раз.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3906150#p3906150"]вот убейте - это уже переходит грань... делать брейнфак, чтобы вместо двух строк написать одну?![/uquote]Дело не в уменьшении срок, а в передаче функций компилятору. Появились методы, с помощью которых перебрать весь список можно не рекурсией, а свёрткой. Это даже компилятору легче скомпилировать, чем рекурсию. И программист меньше ошибок сделает, если кода меньше.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):в передаче функций компилятору
имхо, все хорошо в меру. мы уже имеем "универсальную" ОС Windows, каждое обновление которой ломает что-то из ранее стабильно работавшего. теперь тот же подход привносится и в язык: вместо того, чтобы реализовать АЛГОРИТМ (пусть и ручками), который понятен и подлежит анализу на предмет ошибок, вы/мы/они перекладывают эту работу на компилятор и стандарт языка. мало было в стандарте фич, которые стали устаревшими и нерекомендуемыми ныне? не мало. поэтому написав вот такую вашу свертку-лямбду-ксяу вы будете непрерывно трястись над своим кодом, чтобы не дай бог в новой инкарнации стандарта это не стало вести себя иначе...

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

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3906150#p3906150"]вот убейте - это уже переходит грань... делать брейнфак, чтобы вместо двух строк написать одну?![/uquote]
Их как бы не всегда две получается. Пример настройки режима для 7-ми пинов из твоей FlexMenu:
Спойлер

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

if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
  && ( &LCD_RS_PORT == &LCD_DATA0_PORT) && ( &LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT)
  && (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) 
  && (LCD_RS_PIN == 4 ) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6 ) )
{
    /* configure all port bits as output (all LCD lines on same port) */
    DDR(LCD_DATA0_PORT) |= 0x7F;
}
else if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
       && (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
{
    /* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */
    DDR(LCD_DATA0_PORT) |= 0x0F;
    DDR(LCD_RS_PORT)    |= _BV(LCD_RS_PIN);
    DDR(LCD_RW_PORT)    |= _BV(LCD_RW_PIN);
    DDR(LCD_E_PORT)     |= _BV(LCD_E_PIN);
}
else
{
    /* configure all port bits as output (LCD data and control lines on different ports */
    DDR(LCD_RS_PORT)    |= _BV(LCD_RS_PIN);
    DDR(LCD_RW_PORT)    |= _BV(LCD_RW_PIN);
    DDR(LCD_E_PORT)     |= _BV(LCD_E_PIN);
    DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
    DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
    DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
    DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
}
Даже какие-то попытки оптимизации присутствуют, но если из 7-ми пинов 6-ть находятся на одном порту, кроме одного пина данных, то все семь будут иниться отдельно. Для остальных функций получается похожая картина, а в начале еще нужно несколько десятков строк с определением пинов и вспомогательными макросами добавить.
А могла быть одна строка с определением класса, включая все пины, плюс одна строка инициализации всех пинов сразу, перебирающая любые возможные варианты:

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

PinList<Data, RS, RW, E>::template mode<PinMode::PushPull>();
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3906162#p3906162"]поэтому написав вот такую вашу свертку-лямбду-ксяу вы будете непрерывно трястись над своим кодом, чтобы не дай бог в новой инкарнации стандарта это не стало вести себя иначе...[/uquote]Это одна из основных задач комитета по стандартизации, чтобы нововведения не поломали старый код. Поверь, если есть хоть малейшая вероятность "сломать", то нововведение не будет принято с вероятностью 99%. За частую, именно это является и основным тормозом в развитии языка.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Reflector писал(а):Их как бы не всегда две получается.
согласен. но вопрос в том, как две или не две строки воспринимаются: если алгоритм виден, можно понять любому, а если алгоритм скрыт в библиотеке ли, в стандарте ли, в шаблоне ли и т.п. - тобоооольшой вопрос, сможет ли любой профи разобраться. данная дискуссия тому подтверждение: несколько явных профессионалов не могут друг друга понять, чего там говорить о самоучках, вроде меня?! foreach где-то в недрах тоже является простым for, но вот запись с foreach многих вводит в ступор, в отличие от for
Reflector писал(а):из твоей FlexMenu
нет, это из библиотеки Питера Флури (или как он произносится) поддержки ЖКИ
Reflector писал(а):А могла быть одна строка с определением класса
да, могла бы... но если развернуть эту строку - вряд ли получится более понятно, чем в библиотечке Питера...

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

нет ли у вас статистики, которой можно доверять: сколько в мире всего строк кода написано на С++ разных стандартов? имхо, мне кажется, если вначале "развития" между версиями стандарта были написаны миллиарды строк, то между последними и миллиона не наберется.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение Dimon456 »

VladislavS писал(а):чем собираешь с какими ключами компиляции? Версию языка бы поднять для начала. Для GCC вот так "-std=gnu++1z".
походу дела проблема с версией
Спойлер

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

gcc version 4.8.4 20140725 (release) [ARM/embedded-4_8-branch revision 213147]
Изображение
Что синим выделено на том и пытаюсь проект собирать.
Пробовал выставить -std=gnu++1z - он даже собирать не пытается, какую-то ошибку сразу вываливает.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3906180#p3906180"]но если развернуть эту строку - вряд ли получится более понятно, чем в библиотечке Питера...[/uquote]Зачем его разворачивать? Это же не макрос! Это функция! Она берёт на вход параметры (пусть даже непривычные для вас) и выполняет над ними действия. Удачное название позволяет не ошибиться в том что функция выполняет. Тот же foreach - "для всех что-то сделать". Выбираешь для "кого" и "что сделать" - вуаля! Для понимания кода даже не надо знать, что это вариативный шаблон.
СпойлерЯ как-то приводил уже этот код от Reflector. Всё просто, к каждому параметру из списка Ts применить функцию f(). Просто же? Да ещё и в constexpr контексте.

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

  template <typename F, typename...Ts>
  constexpr void foreach(TypeList<Ts...>, F f) 
  { 
     (f(Ts{}), ...); 
  }
Осталось только передать на вход список параметров "для кого" и лямбду "что сделать" в качестве функции.
Последний раз редактировалось VladislavS Вт окт 13, 2020 16:15:04, всего редактировалось 2 раза.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):Зачем его разворачивать?
а зачем Reflector развернул функцию lcd_init()? если не разворачивать, то все лаконично-понятно, аж слеза накатывает :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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