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

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

Сообщение Reflector »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=3385199#p3385199"]Стандартный холивар об ООП :))) Люди в упор не понимают зачем нужен ООП, при этом не писали огромных программ.[/uquote]
В лагере С уже давно застой, ничего нового практически не появляется, сейчас пишут практически как и 20 лет назад, а раз так, то даже книги по С читать незачем и поступление новых знаний о современных подходах в программировании очень ограничено. О С++ у людей также какие-то совершенно не соответствующие действительности представления. Для проверки создаю проект мигания светодиодом на С++, там пин - это шаблонный класс и на плюсах даже стартап. Потом создаю второй проект, делаю то же самое на регистрах, удаляю из стартапа несколько лишних extern "C", еще компилятор ругался на константу 8'000'000, так в C делать нельзя. Компилируем оба проекта, сравниваем бинарники и они одинаковы, что не удивительно, ведь очень похожа и кодовая база обоих компиляторов в gcc. Теперь пишу в сишной версию простой код:

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

const uint32_t Size = 10;
uint8_t buf[Size];
А компилятор говорит, что обломись, в Си const - это не полноценная константа... Ладно, пишем более сложный код на плюсах:

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

constexpr bool isPowerOfTwo(uint32_t val) { return (val != 1) && !(val & (val - 1)); }

const uint32_t Size = 10;
uint8_t buf[Size + !isPowerOfTwo(Size)];
И все прекрасно компилируется, причем это еще простой код, такой массив можно даже проинициализировать строками и потом вызывать функцию принимающую строку которая выполняет поиск в этом массиве и возвращает bool на стадии компиляции, т.е. в окончательном коде не будет ни массива, ни функции. Здесь нет ООП, таким мог бы быть и С, если бы развивался, так что можно спокойно переползать на С++ компиляторы и даже если вы будет продолжать писать в старом стиле, все равно получите доступ к многочисленным улучшениям языка.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Чтобы в совершенстве владеть С++ нужно этим жить. А когда это не основной вид деятельности, то и рассчитывать на это не стоит.
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="Reflector",url="/forum/viewtopic.php?p=3385326#p3385326"]А компилятор говорит, что обломись, в Си const - это не полноценная константа...[/uquote]
а что за компилятор? Это должно работать (ну, почти всегда)) с C99 даже не с константами
Спойлер

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

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

const size_t len=10;

void valtst(size_t arrlen){
	uint32_t arr[arrlen];
	arr[0]=5;
	arr[arrlen-1]=UINT32_MAX;
	printf("0: %u, %zu: %u",arr[0],arrlen-1,arr[arrlen-1]);
}

int main(void) {
	size_t varlen;
	uint32_t arr[len];
	arr[0]=5;
	arr[len-1]=UINT32_MAX;
	printf("0: %u, %zu: %u\n",arr[0],len-1,arr[len-1]);
	scanf("%zu",&varlen);
	valtst(varlen);
	return EXIT_SUCCESS;
}

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

0: 5, 9: 4294967295
7
0: 5, 6: 4294967295
[uquote="Reflector",url="/forum/viewtopic.php?p=3385326#p3385326"]таким мог бы быть и С, если бы развивался[/uquote]так-то он обрабатывается напильником потихоньку, фичи приползают в новые стандарты. В основном обоснования для малого их количества - стремление не усложнять компиляторы С, "кому надо - идите в C++", такое вот.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3385368#p3385368"]Чтобы в совершенстве владеть С++ нужно этим жить. А когда это не основной вид деятельности, то и рассчитывать это не стоит.[/uquote]
Не нужно в совершенстве знать С++, я лишь говорю, что можно продолжать писать как и на С, с самыми минимальными правками, при этом пользоваться С++ компилятором, который этот код менее эффективным не делает, при этом за счет более строгой типизации обнаружит больше потенциальных ошибок. А дальше уже все зависит от желания, в плюсах есть много мелких улучшений помимо появления классов, которые не требуют от человека навыков профессионального программиста. Тут добавил перегрузку функции, там параметры функции по умолчанию, еще где-то написал auto вместо длиннющего типа...

Добавлено after 21 minute 40 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3385380#p3385380"]а что за компилятор? Это должно работать (ну, почти всегда)) с C99 даже не с константами[/uquote]
Тот же gcc 7.2 в режиме C11.
В твоем примере, насколько я понимаю, используется variable-length array из C99, там размер в рантайме считается, соответственно и сам массив рантаймовский. Вынеси массив из функции и получишь ошибку.

[uquote="Reflector",url="/forum/viewtopic.php?p=3385326#p3385326"]так-то он обрабатывается напильником потихоньку, фичи приползают в новые стандарты. В основном обоснования для малого их количества - стремление не усложнять компиляторы С, "кому надо - идите в C++", такое вот.[/uquote]
Тем не менее, нового в последних стандартах С реально мало, С++ уже обошел С в плане эффективности за счет умения выполнять код на стадии компиляции и эти его способности с каждым стандартом только растут.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3385122#p3385122"]С ООП та же история, реальных фактов никаких, зато плох даже не ООП код который просто похож на таковой :)[/uquote]
Вы зачем мне ваши выдумки приписываете?
Ладно, как насчет такого примера, шлем и принимаем строку через USART при помощи DMA(TX соединен с RX)
А какие достоинства и преимущества мы тем самым обретаем, я запамятовал ? Ну, кроме того, что это тоже работает.

Кстати сказать, похожим образом для ардуины встроенные библиотеки написаны. Я забыл, ардуино-стиль для вас это плюс или минус?
Я запускал на F3, но этот код будет работать и на F1, где регистры портов совсем другие, а для RX еще и нужно выбрать другой режим.
А я вот почему-то вспомнил, что иногда таскаю куски кода между STM32 и STM8.
А на регистрах я сам прекрасно писать умею, весь код внутри этих классов на регистрах и написан, так что в этом плане меня ничем удивить невозможно.
Т.е. вам скучно просто стало?
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="Reflector",url="/forum/viewtopic.php?p=3385393#p3385393"]В твоем примере, насколько я понимаю, используется variable-length array из C99, там размер в рантайме считается, соответственно и сам массив рантаймовский.[/uquote]
формально в рантайме, но вообще не обязательно, с -O2 и константами gcc обычно понимает, чего от него хотят.
[uquote="Reflector",url="/forum/viewtopic.php?p=3385393#p3385393"]Вынеси массив из функции и получишь ошибку[/uquote]
потому и "почти всегда")
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3385602#p3385602"]формально в рантайме, но вообще не обязательно, с -O2 и константами gcc обычно понимает, чего от него хотят.[/uquote]
Такие сишные массивы переменной длины gcc и для С++ поддерживает, но даже если оптимизация поможет, время жизни подобного объекта все равно ограничено временем жизни функции, что значительно сужает область его использования.

[uquote="a5021",url="/forum/viewtopic.php?p=3385559#p3385559"]А какие достоинства и преимущества мы тем самым обретаем, я запамятовал ? Ну, кроме того, что это тоже работает.[/uquote]
Преимущества в том, что такой код компактен и значительно более понятен, пишется и модифицируется быстро, работает везде, может быть засунут в другие либы куда просто и эффективно передаются все нужны для его работы параметры, а если бы ты не лишил нас удовольствия сравнить мой код с кодом на регистрах, то преимущества были бы еще более очевидными :)
Кстати сказать, похожим образом для ардуины встроенные библиотеки написаны. Я забыл, ардуино-стиль для вас это плюс или минус?
Ардуино-стиль - это простота использования и унификация, что безусловно является плюсом, но если брать в расчет реализацию, то там все очень плохо, по крайней мере если судить по внутренностям либ которые я видел. И там нет шаблонов, в гибкости ардуино тоже уступает.
А я вот почему-то вспомнил, что иногда таскаю куски кода между STM32 и STM8.
Это очень интересный факт, но регистры портов у F1 от этого не стали более похожими на регистры портов всех остальных серий.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А факт и правда важный. Многие разработчики сидят на разных архитектурах, а туда не то чтобы С++17, но и С++03 то не завезли. Получается, и код не потягаешь, и стиль программирования менять надо.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

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

Сообщение VladislavS »

И на какие архитектуры кроме ARM там С++14 завезли?
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3385779#p3385779"]А факт и правда важный. Многие разработчики сидят на разных архитектурах, а туда не то чтобы С++17, но и С++03 то не завезли. Получается, и код не потягаешь, и стиль программирования менять надо.[/uquote]
Речь шла о том, что класс работающий с пином или портом целиком скрывает разную реализацию для разных архитектур, потому перенос кусов кода из STM32 и STM8 я трактовал как намек на схожесть периферии у этих архитектур. И общего там много, но много и различий даже среди одних лишь STM32.
Если говорить про компиляторы, то пару лет назад я писал тестовые классы для AVR на gсc 5 и там не было никаких существенных отличий от текущей реализации. Хуже всего было с STM8 в IAR, он не понимал using для шаблонов, приходилось делать по-другому и к имени классов дописывать пару символов, из-за чего ухудшилось чисто эстетическое восприятие кода. Какие-то продвинутые техники там не применишь, но все равно даже С++98 по возможностям превосходим С11.
А разработчики разные бывают, кого-то заставляют использовать С и тогда ничего не поделаешь, но много и тех кто волен писать как ему вздумается, но пишет на С, потому что находится под влиянием распространенных заблуждений согласно которым компилятор С++ генерит какой-то дико неоптимизированный код или выучить C++ могут только избранные. Да, если цель в совершенстве овладеть плюсами, то они намного сложнее С, но, как я говорил, можно постепенно добавлять к С некоторые элементы из плюсов, тогда вообще никаких проблем со сложностью языка не будет. Стандартные С++ либы на мк тоже мало кто использует, там и динамическое выделение памяти и исключения, хотя наметилась тенденция добавлять легковесные функции без этого всего, а контейнеры постепенно научатся работать на стадии компиляции, тогда от них будет польза даже в эмбедде.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3385804#p3385804"]И на какие архитектуры кроме ARM там С++14 завезли?[/uquote]
однозначно про ARM написано: https://www.iar.com/support/resources/a ... 1-and-c14/
А здесь вроде как про все сразу https://www.iar.com/iar-embedded-workbe ... standards/
У меня и на АВРки есть последняя версия. Где посмотреть стандарт? :)))
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Попробуйте скомпилировать

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

auto foo()
{
  return [](){};
}
PS: Результат я знаю, потому что там не то чтобы С++14, а С++11 нет.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3385929#p3385929"]PS: Результат я знаю, потому что там не то чтобы С++14, а С++11 нет.[/uquote]
Хорошо, в IAR нет auto и лямбд для многих платформ, при том, что в других средах они могут и быть, вывод то из этого такой? А в С нет перегрузки функций и операторов, аргументов по умолчанию, нормальных констант, пространств имен, естественно классов и шаблонов или просто шаблонных функций без классов, зато нужно лепить typedef к структурам и перечислениям и void к ничего не принимающим функциям, причем это отличия от самого древнего С++, которые я вспомнил сходу. Если отказаться от этих дополнительных фич языка и писать на С, то взамен я практически ничего не получу, разве что такой код можно будет запустить там, где вообще никакого компилятора С++ нет.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Специально сдернул последний IAR for STM8 v3.10.1 -- там только С99. Пример с авто, разумеется, не компилируется. Ну и на кой мне все эти басни про развесистые компиляторы?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3385929#p3385929"]Попробуйте скомпилировать[/uquote]
IAR 7.10.1 for AVR:

Error[Pe086]: invalid storage class for a function C:\Users\HOME\Desktop\test\main.cpp 3
Error[Pe260]: explicit type is missing ("int" assumed) C:\Users\HOME\Desktop\test\main.cpp 3
Error[Pe029]: expected an expression C:\Users\HOME\Desktop\test\main.cpp 5

Добавлено after 12 minutes 46 seconds:
[uquote="a5021",url="/forum/viewtopic.php?p=3386063#p3386063"]Специально сдернул последний IAR for STM8 v3.10.1 -- там только С99. Пример с авто, разумеется, не компилируется. Ну и на кой мне все эти басни про развесистые компиляторы?[/uquote]
Наконец то я вкурил как на сайте смотреть что оно умеет. Кстати для STM8 указано как:
Highly optimizing C and C++ compiler for STM8
Тоже самое почти для всех платформ, пару раз просто С указан. Только для ARM указана 14-й стандарт.

Добавлено after 2 minutes 47 seconds:
Кстати как смотреть - выбираем платформу, выбираем Features, и под вкладкой BUILD TOOLS нажимаем Read more.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3386063#p3386063"]Специально сдернул последний IAR for STM8 v3.10.1 -- там только С99. Пример с авто, разумеется, не компилируется. Ну и на кой мне все эти басни про развесистые компиляторы?[/uquote]
Какие басни? Я же говорил, что С++ для STM8 самый проблемный, там похоже С++98/03, но даже он лучше С99, в котором минимум треть нововведений были позаимствованы из плюсов, наконец разрешили объявлять переменные где угодно, добавили inline и однострочные комментарии. Хотя в сишном коде который попадается на форумах обычно этого нет, даже писать на более современном С людей нужно учить... Даже еще хуже, периодически приходится читать, что если не объявлять переменные в начале функции, то может глючить :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Reflector",url="/forum/viewtopic.php?p=3385966#p3385966"]вывод то из этого такой?[/uquote]
Не стоит удивляться, что 98 из 100 эмбэдберов глядя на ваши "if constexpr" крутят у виска. Я 99-й :)
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3386089#p3386089"]Какие басни? Я же говорил, что С++ для STM8 самый проблемный,[/uquote]
Проблемный -- это ваш подход. Я со старыми версиями IAR-а для STM8 никаких проблем никогда не имел и прежде не слышал, чтобы на него в этом смысле жаловались. Теперь вы придумываете чепуху, нагромождаете ложные утверждения друг на друга в таком объеме, что я вынужден пасовать перед ними, т.к. иначе придется писать умопомрачительное количество возражений. Нафиг-нафиг.

[uquote="VladislavS",url="/forum/viewtopic.php?p=3386097#p3386097"]Не стоит удивляться, что 98 из 100 эмбэдберов глядя на ваши "if constexpr" крутят у виска. Я 99-й :)[/uquote]

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

Сообщение VladislavS »

Откройте любую библиотеку типа SPL, посчитайте количество #ifdef.
Ответить

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