Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Вопросы по С/С++ (СИ)

Сообщение jcxz »

[uquote="Trully",url="/forum/viewtopic.php?p=3686288#p3686288"]Спасибо за очень ценный совет. А вот скажите, на ассемблере для STM32 писать можно? :)))))[/uquote]
Можно конечно. Но трудоёмкость будет выше. Лучше на асме писать отдельные функции. Только там, где нужно.

[uquote="Trully",url="/forum/viewtopic.php?p=3686288#p3686288"]...я вообщето серьезно задавал вопрос. Выходит что С++ - фигня и профанация? Или всетаки нет?[/uquote]
С чего это? Последние полтора десятка лет пишу исключительно на нём (плюс ассемблер конечно).

Добавлено after 3 minutes 14 seconds:
[uquote="smalcom",url="/forum/viewtopic.php?p=3686307#p3686307"]Если хочется именно ассемблер для души - попробуй MIPS, Но, это субъективщина.[/uquote]
Категорически не согласен! Ассемблер для DSP c55xx - вот это "для души"! 8)
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="smalcom",url="/forum/viewtopic.php?p=3686358#p3686358"]Посмотрите шаблоны GPIO Чижова. Внутренности - это просто... суть С++. Но вот использование этого всего превращается в красивый, оптимизированный и надёжный код.[/uquote]
Либа Чижова уже устарела, потому так и выглядит. Во-первых, уже давно есть вариативные шаблоны, во-вторых, метапрограммирование сейчас движется в сторону value-based подхода. На примере списка пинов это выглядит так:

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

static void toggle() { toggle_(ports_, pins_); }

template<typename... Ports, typename... Pins>
static void toggle_(TypeList<Ports...> ports, TypeList<Pins...> pins)
{
	if constexpr (!empty(ports))
	{
		static constexpr uint32_t gpio = decltype(head(ports))::type::gpio;
		static constexpr uint32_t pinsMask = getPinsMask<gpio>(pins);
		GpioT<gpio, pinsMask>::toggle();
		toggle_(pop_front(ports), pins);
	}
}

static constexpr auto pins_ = transformToPins(TypeList<Pins...>{});
static constexpr auto ports_ = getPortList(pins_);
По крайне мере это уже похоже на обычное программирование :)
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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

что проще: {разобраться в либе Чисжова или освоить вариативные макросы} или тупо написать руками дрыганье битом? я все понимаю, но не понимаю, зачем простое делать "удобным"? за то время, что я потратил на попытки понять, что наваял Чижов, я бы мог 100500 раз расписать самые хитрые манипуляции группами битов. т.е. все эти шаблоны и лямбды (сцуко, так и не понял, нахрена они нужны и что это вообще за дрянь) не окупаются по мозговым затрам, имхо...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3686391#p3686391"]как по мне, так это выглядит, как кошмар нерожденного.[/uquote]
Тем не менее, этот код ближе к тому, что обычно пишут люди не обремененные нюансами метапрограммирования :) И его можно пошагово отлаживать...
что проще: {разобраться в либе Чисжова или освоить вариативные макросы} или тупо написать руками дрыганье битом? я все понимаю, но не понимаю, зачем простое делать "удобным"? за то время, что я потратил на попытки понять, что наваял Чижов, я бы мог 100500 раз расписать самые хитрые манипуляции группами битов. т.е. все эти шаблоны и лямбды (сцуко, так и не понял, нахрена они нужны и что это вообще за дрянь) не окупаются по мозговым затрам, имхо...
Например, я у себя могу написать такое:

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

Lcd<RM68140, LcdOrient::Landscape, PB7, GpioB<0xFF00>, PB2, PB0, PB1, PB6, 0, 2, 0> lcd;
lcd.init();
А можно так:

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

using LcdData = PinList<PA12, PA11, PB2, PA9, PB3, PC1, PC2, PC3>;
Lcd<S6D1121, LcdOrient::LandscapeRev, PB7, LcdData, PB2, PB0, PB1, PB6, 1, 2, 1>;
lcd.init();
Другой контролер, другие пины данных, другие тайминги и ошибка компиляции, т.к. я специально продублировал PB2... При инициализации все эти 13 пинов объединяются в общий список, чтобы задать им режим сразу для всех, это может быть эффективнее, допустим, если все пины относятся к одном порту. При записи компилятор обнаружит последовательность пинов PA12/PA11/PA9, они хоть и не идут подряд, но все равно данные для них можно забрать за один заход, а если у нас Cortex-M3 и выше, то дополнительно будет обнаружена последовательность PC1/PC2/PC3, тут порядок обратный, потому будет добавлена одна инструкция реверса бит RBIT. И даже когда на стадии компиляции будет получен список регистров и необходимых констант все равно будут выполнены дополнительные проверки, вдруг вместо RMW можно просто писать целиков в регистр, его половинку или четвертинку... Это эффективно практически насколько возможно и все равно одни будут говорить, что вместе с универсализацией часть ресурсов тратится впустую, а другие, что получается слишком сложно :) А потом эти другие идут и пишут скриптовый язык для управления светодиодами и прикручивают к нему пошаговый отладчик, естественно полагая, что их мозговые затраты полностью окупились :)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Вопросы по С/С++ (СИ)

Сообщение ПростоНуб »

[uquote="da-nie",url="/forum/viewtopic.php?p=3686353#p3686353"]А что именно вы используете из stl?[/uquote]
Проблема не в том, что я использую. Проблема в том, что STL, являясь уже давно стандартной библиотекой C++, используется подавляющим большинством других библиотек, которые возникает желание использовать.

TC, опасайтесь советов smalcom. не подозревающего, что многие бибилиотеки С++ имеют собственные сборщики мусора (даже некоторые реализации STL). И не в курсе, что ряд библиотек С++ пользуются собственным управлением памятью, аллоцируя у системы только относительно крупные страницы памяти в свой пул. Иными словами, парадигма C++ библиотек, обычно, в повышении общего быстродействия ценой периодического увеличения времени выполнения одного и того же метода - читайте "увеличением времени реакции".

ARV, о вкусах не спорят, кто-то "кубами" ногодрыгом занимается, а кто-то LD или FBD/SFC предпочитает. А мне удобней ногодрыгом заниматься средствами С препроцессора.
Что касается библиотеки Чижова, то, например, работа с SPI там реализована неудобно - нет асинхронного вывода. На МК часто нет возможности иметь в памяти буфер для того же TFT дисплея. А значит, вместо ожидания окончания передачи очередного байта, логично кодировать следующий байт или байты.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3686452#p3686452"]Что касается библиотеки Чижова, то, например, работа с SPI там реализована неудобно - нет асинхронного вывода. На МК часто нет возможности иметь в памяти буфер для того же TFT дисплея. А значит, вместо ожидания окончания передачи очередного байта, логично кодировать следующий байт или байты.[/uquote]
Это проблема разве что для AVR, на более продвинутых мк можно переключится на 16-ти битную передачу и обычно там есть FIFO, потому асинхронный вывод особо не нужен.
Реклама
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Вопросы по С/С++ (СИ)

Сообщение ПростоНуб »

Reflector, во-первых, скольки битная не была бы передача, но если нет асинхронного вывода - она проблемы не решает. Ведь метод будет ждать окончания передачи, вместо того, чтобы вернуть управление вызывающей программе для вычисления последующих байтов.
Во-вторых, не только для AVR. Тот же STM32F FIFO для SPI не имеет.
В-третьих, для того же STM32F103 асинхронный вывод в SPI у Чижова реализован, хоть и криво, с риском потери принимаемых данных. То бишь, либо асинхронный вывод без чтения, либо синхронный ввод-ввод.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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

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

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3686489#p3686489"]во-первых, скольки битная не была бы передача, но если нет асинхронного вывода - она проблемы не решает. Ведь метод будет ждать окончания передачи, вместо того, чтобы вернуть управление вызывающей программе для вычисления последующих байтов.
Во-вторых, не только для AVR. Тот же STM32F FIFO для SPI не имеет.[/uquote]
На STM32F1, без FIFO, переключаемся в 16-ти битный режим, отправляем первую порцию, данные попадают в сдвиговый регистр, сразу отправляем еще раз, эти данные оседают в буфере TX, итого при максимальной скорости SPI в запасе есть 64 такта, часто больше, за это время вполне можно подготовить новую порцию данных и SPI при этом будет работать в непрерывном режиме. А ведь есть еще DMA... У F0 и F3, кстати, FIFO уже есть.

[uquote="ARV",url="/forum/viewtopic.php?p=3686501#p3686501"]да вы, батенька, оказывается, злой! :) не окупились, если не считать удовольствия от результата. а удовольствие многого стоит[/uquote]
И на каком же основании удовольствие от написания отладчика для скриптового языка должно перевешивать удовольствие от написания удобной и эффективной либы для работы с портами, которая потом будет использоваться во всех проектах?
Reflector писал(а):все новшества в С++ направлены на парадигму "меньше писать программсту", но никак не на "сделать код понятнее". для меня второе важнее.
Если понятный код можно написать на С, значит его можно написать и на C++, более продвинутые возможности языка не обязательно использовать для усложнения кода. В то же время в С++ есть много мелких улучшений, вряд ли использование 5'000'000 вместо 5000000 сделает для кого-то код менее понятным, или, например, кому плохо от того, что можно в хедере написать:

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

inline int abc = 123;
и это не просто проще, а в некоторых случаях даже работает правильнее раздельного объявления + определения в разных файлах.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Вопросы по С/С++ (СИ)

Сообщение ПростоНуб »

Reflector, Вы, похоже не в теме. Как реализовать асинхнонный вывод по SPI я и так знею. Речь о том, что он в библиотеке Чижова для большинства архитектур асинхронный вывод не реализован, а для некоторых архитектур реализован криво, без возможности одновременного чтения.
DMA при выводе графики на TFT дисплей мало помогает. Речь о том, что выделять в памяти буфер под графический дисплей на МК - непозволительная роскошь. Поэтому намного выгодней кодировать точки с их цветами "на лету", одновременно с выводом по SPI. Особенно это важно при анимации на дисплее.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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

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

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3686591#p3686591"]DMA при выводе графики на TFT дисплей мало помогает. Речь о том, что выделять в памяти буфер под графический дисплей на МК - непозволительная роскошь. Поэтому намного выгодней кодировать точки с их цветами "на лету", одновременно с выводом по SPI. Особенно это важно при анимации на дисплее.[/uquote]
У меня так и сделано, весь вывод идет напрямую. На F1 я замеры не делал, но на F0/F3 специально тестил при выводе текста и все упиралось в пропускную способность SPI. Если это будет GUI, то там по сути добавится заливка прямоугольников, рисование линий и, возможно, отрисовка битмапов, это все задачи не сложнее вывода текста и у SPI опять же должны постоянно быть данные для отправки. Заливку можно и при помощи DMA делать, нужно целых 2 байта RAM :) Никакой специальной поддержки асинхронного вывода у меня нет, получил новый цвет, записал в DR, если буфер полон, чуть подождал. Даже не знаю что там у Чижова может быть не так, он что перед записью в DR ждет когда все данные будут отправлены?
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Вопросы по С/С++ (СИ)

Сообщение ПростоНуб »

Reflector, в большинстве архитектур у него в коде ожидание завершения отправки и приема, так как сделана единая функция ReadWrite. Write вызывает ее просто игнорируя считываемые данные.
Заливка же - скорее исключение. Например, если надо, чтобы снежинки или капли дождя падали по всему экрану, или шестерни крутились - от заливки толку мало.

Ну и не сравнивайте STM32 с AVR )
Trully
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Re: Вопросы по С/С++ (СИ)

Сообщение Trully »

На счет ассемблера для STM32 я пошутил :) Хотя я его неплохо знаю и даже понимаю но именно поэтому и не буду на нем программировать микроконтроллер. Кто читал programming manual на Cortex M7 тот представляет объем инструкций и их разновидностей.
Чето дальше у вас пошла заруба чисто между собой по отвлеченной теме - чья пипка короче :)) Я так понял что кое кто из вас предпочитает не погружаться глубоко в премудрости а использовать сторонние либы даже для такой мелочи как SPI :) Ну уж извините что потревожил своими распросами про внутрянку и тонкости С++. Видимо надо проще - достал сторонние либы как в Ардуино и готово.
to be or not to be = -1
Аватара пользователя
smalcom
Встал на лапы
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

Re: Вопросы по С/С++ (СИ)

Сообщение smalcom »

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

освоить вариативные макросы
Кесарю - кесарево. Как только в С "завезут" проверку типов аргументов в макроопределения, пространства имён и типизированные перечисления, то можно будет продолжить разговор. А сейчас это предложение писать программки для начинающих.
или тупо написать руками дрыганье битом
Как и говорил (и в ветке кто-то ещё говорил) мы дискутируем о программировании разного уровня: вы о программках для себя, а некоторым надо писать программы, которые через месяц или год кто-то открывает и не проклинает тебя. Программные модули, которые можно использовать в проектах для разных архитектур МК. И при этом код оптимален. И не надо мудохаться при каждом портировании и переписывать половину проекта.
лямбды (сцуко, так и не понял, нахрена они нужны и что это вообще за дрянь) не окупаются по мозговым затрам, имхо...
Окупается. Всё это окупается как только размер ваших проектов переваливает несколько тысяч строк. А на 10-15 ты радуешься, что когда-то не стал "дрыгать битиками".
Либа Чижова уже устарела, потому так и выглядит.
В этом согласен. Имел в виду, что сам С++ даёт очень мощный инструмент, который для С недоступен. А вариативные шаблоны - классная штука (запоздала конечно лет на сто...). Использую их в подмешиваемых шаблонах, чтобы построить интерфейс периферийного модуля МК. Как по мне, то хорошо на вид получается.
имеют собственные сборщики мусора (даже некоторые реализации STL)
Пихать STL в AVR - надо быть большим оригиналом. Если вы так делаете, то конечно не слушайте моих советов. Меня больше заинтересовало где в мега8 поместится динамическое выделение памяти и сборщик мусора. Хм-м-м-м...

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

avr-g++  -o ... main.o  -mmcu=atmega644pa  
main.cpp:7:18: fatal error: vector: No such file or directory
меня терзают смутные сомненья... х-м-м-м...
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Re: Вопросы по С/С++ (СИ)

Сообщение Billi34 »

Позвольте вторгнуться в вашу беседу. Я начинающий. Уже делал поделки на АТмеге 16, 8, 162, 168. Для 8 код написал сам. для других делали другие, более компетентные.Решил перенести ранее написанный код (не мной) на другой МК и с немного измененым заданием. Компилятор скачал из нета MikroC версии 2.10 (что было бесплатного) поскольку человек сделал мне программу в этом компиляторе и советовал там и работать.До определённого момента все у меня получалось но все уперлось в оператор goto mesto_1. Причем mesto_1: указанное выше по коду компилятор проглотил. Помогите в синтаксисе этого компилятора
Вложения
что не нравится.png
(65.24 КБ) 318 скачиваний
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

А где сама метка находится ? Случайно не вне области видимости оператора goto ?
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Re: Вопросы по С/С++ (СИ)

Сообщение Billi34 »

Сейчас вставлю текст программы

Добавлено after 8 minutes:
Тонкости еще додумаю, надо чтоб по окончании подпрограммы( void dva() ) , в случае наличия 0 на PIND1 более 0.5 сек программа(не знаю как правильно сказать) перепрыгнула на начало , или (else) шагала дальше.

P.S. протеуса нет. Тоже не бесплатен. Торенты малочисленны и не пропускаются антивирусом. Осваивать некогда.Нескончаемая борьба за выживание.
Вложения
- копия.txt
(3.01 КБ) 171 скачивание
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Пределы области видимости метки - фигурные скобки. Как у локальных переменных. А Вы вообще пытаетесь прыгнуть в другую функцию.
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Re: Вопросы по С/С++ (СИ)

Сообщение Billi34 »

Да. Прокатило.Только в пределах текущего void. Спасибо. Где спасибку тыкнуть?
Вложения
sкопия.txt
(1.14 КБ) 140 скачиваний
Ответить

Вернуться в «Разные вопросы по МК»