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

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

Сообщение VladislavS »

Вот так?

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

if(((GPIO_TypeDef*)GpioID)->ODR & PM) ((GPIO_TypeDef*)GpioID)->BRR = PM; else ((GPIO_TypeDef*)GpioID)->BSRR = PM;
Работать будет, но...
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Сообщение VladislavS »

Принципиально что (GPIO_TypeDef*) через параметр шаблона не протащить в constexpr контексте. А если кастовать туда-сюда, то через функцию надёжней всего.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3905910#p3905910"]Почему каждый считает, что должен с лёгкостью читать неизвесьный ему язык программирования?[/uquote]
Я лет 20 назад учил С++ по классическому учебнику Бьерна Страуструпа. Там такой дичи, как лямбды, шаблоны и т.п., не было!

Я считаю, что этому Г не место в нормальном языке программирования. Пусть в жабе делают, что хотят, но не в С++ же!
[uquote="Reflector",url="/forum/viewtopic.php?p=3905989#p3905989"]А с макросами не то же самое?[/uquote]
Абсолютно не то же самое! С макросами все прозрачно и понятно.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Eddy_Em, тебе сюда -> Национальная рабочая группа по стандартизации С++ (РГ21 С++ Россия). Там наверняка внимательно выслушают твои веские аргументы. :)))
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3906040#p3906040"]Абсолютно не то же самое! С макросами все прозрачно и понятно.[/uquote]
ну так себе заявление )
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 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 байт) 152 скачивания
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 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 КБ) 540 скачиваний
ide2.png
(15.78 КБ) 552 скачивания
ide3.png
(13.64 КБ) 568 скачиваний
Добавлено 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

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

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