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

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

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3707173#p3707173"]Но в этом случае потеряется универсальность: а вдруг в другой реализации какой-то пин будет сидеть на другом порту?[/uquote]
А тут и приходит на помощь С++, там одиночные пины можно инитить по отдельности, а можно объединить в список и задать режим всем сразу, пины будут отсортированы по портам и все что висит на одном порту будет инититься вместе, но если пины разбросаны по разным портам, оно все равно работает. Например, в либе дисплея у меня передаются пины данных(8 или 16 объединенных в список пинов откуда угодно), плюс 5 управляющих пинов, тоже с любых портов, а внутри вызывается mode():

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

PinList<Pins::CS, Pins::Data, Pins::RS, Pins::WR, Pins::RD>::mode<PinMode::PushPull>();
И если дисплей объявлен следующим образом, т.е. все пины висят на GPIOB:

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

using lcd = Lcd<RM68140, LcdOrient::LandscapeRev, PB7, GpioB<0xFF00>, PB2, PB0, PB1, PB6, 0, 2, 0>;
то получаем:
Спойлер

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

ldr r1, [r3, #0] 
ldr r2, [pc, #444]
ldr r5, [pc, #444]
movw r4, #53232
ands r1, r4 
orrs r2, r1 
str r2, [r3, #0] 

ldr r2, [r3, #8] 
ands r2, r4 
orrs r2, r5 
str r2, [r3, #8] 

ldr r2, [r3, #4] 
bic.w r2, r2, #65280
bic.w r2, r2, #67
str r2, [r3, #4]
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Reflector писал(а):пины будут отсортированы по портам и все что висит на одном порту будет инититься вместе
Ты хочешь сказать, что это сделает препроцессор? Да ну нафиг!
Reflector писал(а):а внутри вызывается mode():
неужто эта жуть разворачивается всего лишь в 2-3 присваивания?
Reflector писал(а):то получаем:
Если даже и так, то код абсолютно нечитаем! Бессмысленно это !!!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3707199#p3707199"]Ты хочешь сказать, что это сделает препроцессор? Да ну нафиг![/uquote]
Не препроцессор, в современных С++ компиляторах при компиляции вызывается интерпретатор С++ исполняющий код, потому в шаблоне может быть 10 страниц кода, а на выходе получится несколько констант, которые можно хоть во флеш положить.
Если даже и так, то код абсолютно нечитаем! Бессмысленно это !!!
Что именно нечитаемо? У тебя на гите есть проект с дисплеем, там целый экран макросов для задания пинов и сопутствующих операций, чего у меня нет и оно не нужно, там управляющие пины привязаны к одному порту, а у меня нет, там задан порт для данных с маской, но при этом 8 бит просто пишутся в ODR затирая старший байт и т.д. :)
Последний раз редактировалось Reflector Ср сен 25, 2019 15:33:13, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Макросы просты и наглядны. Их легко понять. А у тебя простыня какая-то в шаблоне, и фиг поймешь без поллитры, что там куда и для чего!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

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

Сообщение VladislavS »

Это не так. Просто на простых примерах проще всего демонстрировать. Вместо ноги может быть какой-нибудь другой класс - i2c или spi, без проблем. Тут ведь даже простой код без поллитры некоторым непонятен. И это вполне объяснимо. Это всё же другой язык, его надо знать чтобы читать.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Чтобы все было легко и просто, есть сниппеты!
Ну и, конечно, свой код. Из которого очень полезно делать сниппеты. Скажем, написал один раз USB-CDC, оформил как сниппет, потом просто копирую все в новый "проЭкт" и добавляю то, что нужно... Как говорится, месяц потерял, зато потом за полчаса долетел!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

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

Сообщение ARV »

демонстрировать-то можно, только надо учесть, что для такого легкого манипулирования шаблонами с перепдвыподвертом надо не один пуд соли съесть в процессе изучения С++.
очень сильно сомневаюсь, что простому смертному это выгодно: пока кто-то будет шаблоны грызть, я пинодрыг сделаю тупо без шаблонов 100500 раз...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Мурик, при чем тут бесплатная доставка? Например, 500 штук с доставкой до Москвы за $20 предлагают тут. По 4 цента получится.

Добавлено after 2 minutes 42 seconds:
Reflector, Вы почему-то уже второй раз говорите о размере кода, который меня как раз мало волнует. При цене флеша на два порядка меньше, чем SRAM это не важно. Важен расход оперативки, которой C++ всегда поедает больше, чем C при одной и той же квалификации программиста.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3707464#p3707464"]Вы почему-то уже второй раз говорите о размере кода, который меня как раз мало волнует. При цене флеша на два порядка меньше, чем SRAM это не важно. Важен расход оперативки, которой C++ всегда поедает больше, чем C при одной и той же квалификации программиста.[/uquote]
Ок, создаю пустой проект на С++ для F303, он потребляет 25 байт RAM. Добавим что-нибудь:

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

using spi1 = Spi1<PA4, PA5, PA6, PA7>;
using lcd = LcdSpi<ST7735, LcdOrient::Landscape, spi1, PA8, PA10>;

int main()
{
	delayInit();

	lcd::init(SpiBaudRate::Presc_4);
	lcd::clear(Color::Red);
	lcd::drawLine(0, 0, lcd::x2(), lcd::y2(), Color::Green);
}
Итого тут задействованы классы пинов, класс SPI, в который передаются классы пинов, к ним добавляется AF под конкретный мк и т.д., и есть тяжелый класс для работы с разными дисплеями, в который преедается класс SPI с другими пинами, причем LcdSpi - это просто псевдомим для более простой передачи параметров, на самом деле класс работает и с FMC/ногодрыгом и там 3 класса наследуются друг от друга. Итак, инитим этот дисплей, заливаем красным цветом и рисуем линию при выключенной оптимизации(-O0), на сколько же выросло потребление RAM? На 4 байта, добавилась переменная ticks_per_us, т.к. при инициализации дисплея используется пауза и то только потому, что ее значение определяется автоматически в рантайме, была бы это константа, так бы 25 байт и осталось. Какие еще нужны доказательства? :)
Последний раз редактировалось Reflector Чт сен 26, 2019 00:56:35, всего редактировалось 2 раза.
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="ARV",url="/forum/viewtopic.php?p=3707449#p3707449"]надо учесть, что для такого легкого манипулирования шаблонами с перепдвыподвертом надо не один пуд соли съесть в процессе изучения С++[/uquote]ну этсамое, вообще и для мигания диодиком человеку приходится много чего съесть в процессе изучения [подставить список, начиная с "итак, детишки, электрическое напряжение - это..."].
[uquote="ARV",url="/forum/viewtopic.php?p=3707449#p3707449"]очень сильно сомневаюсь, что простому смертному это выгодно[/uquote]тому самому простому смертному, которому мало что выгодно, окромя питания и размножения?)
вы как-то постоянно считаете, что даже среди интересующихся контроллерами и прочей цифрой любителей писать код никто не умеет и не хочет учиться, и каждый первый из них - просто дуб дубом, с трудом осиливший С.
[uquote="ARV",url="/forum/viewtopic.php?p=3707449#p3707449"]пока кто-то будет шаблоны грызть, я пинодрыг сделаю тупо без шаблонов 100500 раз...[/uquote]как только вы захотите кроме примитивных макросов типа "вместо этого слова пиши вот это" залезть поглубже - в макросы с параметрами и раскрытием строк - то там все гораздо гораздее, чем в шаблонах. И отлаживается очень забавно (нет).

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3707464#p3707464"]Важен расход оперативки, которой C++ всегда поедает больше, чем C при одной и той же квалификации программиста.[/uquote]с чего бы?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Reflector",url="/forum/viewtopic.php?p=3707471#p3707471"]Ок, создаю пустой проект на С++ для F303, он потребляет 25 байт RAM.[/uquote]На самом деле и 25 байтам неоткуда взяться. Непустой проект, с инициализацией тактовой, всех ног и Systick. Мигание светодиодом в прерывании.
Изображение
Untitled1.png
(27.55 КБ) 564 скачивания
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Reflector писал(а):Итого тут задействованы классы пинов, класс SPI ...
то, что вы в main написали 3 строчки не делает ваш проект простым - за кадром остались простыни шаблонов и куча подключаемых файлов. то есть при отладке вы будете видеть не три эти строчки, а какие-то загадочные наборы символов из шаблона, разобраться в которых сможет лишь академик программистских наук. ну и мне это зачем? мне ковыряться в сложной иерархии шаблонных классов, которые на самом деле заменены парой ассемблерных команд (и понять, почему - отдельная тема) совсем не улыбается...
arkhnchul писал(а):вообще и для мигания диодиком человеку приходится много чего съесть в процессе изучения
совершенно верно. и поскольку обойтись без этого не получается никак, вопрос на засыпку: зачем учить еще С++, тратить на это время и силы, если достаточная база уже есть? возможно для профессионала это играет роль, а для меня, любителя?
arkhnchul писал(а):вы как-то постоянно считаете, что даже среди интересующихся контроллерами и прочей цифрой любителей писать код никто не умеет и не хочет учиться, и каждый первый из них - просто дуб дубом, с трудом осиливший С
к сожалению, в подавляющем большинстве так и есть. вот я минимум 30 лет учусь программировать, имею за плечами довольно сложные проекты, самостоятельно реализованные, но так и не могу с вами согласиться, что предлагаемое вами мне необходимо. мой уровень так и остался достаточно низким. а ведь даже по примеру здешнего форума тех, кто не достиг даже моего уровня - 90%.
arkhnchul писал(а): то там все гораздо гораздее, чем в шаблонах
не соглашусь. с шаблонами я последнее время имею дело в FPC. да, когда проникся - выглядит красиво и элегантно. но когда что-то не работает и надо разобраться - всё, сливай воду. мало того, что отладчик не может понять, что мне надо показать после всей той работы, что компилятор с препроцессором наделали из шаблона, так еще и разобраться, какой вызов откуда произошел из-за этой иерархии вложенных-унаследованных классов и методов... мама не горюй, короче.
поскольку синтаксис С++ вообще наркоманский, не могу поверить, что описанная проблема там не существует - наверняка масштабы её еще большие...
arkhnchul писал(а):с чего бы?
кажущаяся простота исходников, написанных профессионалами в стиле ООП, с применением последних фишек стандарта, вызывает у любителя непременное желание "добавить в проект еще что-то" - это же так просто! а это приводит к забавным результатам: добавление только одного кривенкого класса (любитель - чего с него взять?) ломает всю идеально построенную оптимизаторами/компиляторами картину, и уже классы так красиво не разворачиваются, и вместо двух команд присваивания появляются циклы с перебором списков... а это требует памяти и т.п.

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

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

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3707507#p3707507"]ну и мне это зачем?[/uquote]Ну незачем, проходи мимо, чего ныть то? Это право и выбор каждого. Кто-то истребители Сухого проектирует, а кто-то в баре сухое истребляет... А синтаксис шаблонов вас пугает просто от незнания, я точно так же китайскую грамоту боюсь. Достаточно пару классов нормальных написать и будете свободно код читать.
Последний раз редактировалось VladislavS Чт сен 26, 2019 07:54:07, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Кстати, да: насчет отладки — в точку!
Насколько я знаю, шланг еще не умеет под МК собирать → придется собирать gcc. А gcc, даже 9.2.0, при сборке крестовых шаблонов такую чушь выдает в сообщениях, что разобраться с этим действительно сможет разве что "кандидат компутерных наук".
Для отладки же макросов достаточно на отдельный файл натравить gcc -E — и увидеть, как эти макросы разворачиваются.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3707525#p3707525"]При сборке крестовых шаблонов такую чушь выдает в сообщениях, что разобраться с этим действительно сможет разве что "кандидат компутерных наук".[/uquote]Ну да, стоит немного подумать. Ну так это даже полезно.

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3707525#p3707525"]Для отладки же макросов достаточно на отдельный файл натравить gcc -E — и увидеть, как эти макросы разворачиваются.[/uquote]Чего? Я то по простоте душевной обычно кнопочку Build в IDE нажимаю. А тут вон оно как для отладки раскорячиться надо....
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

VladislavS, еще один, у которого мыша к руке приросла что ли?
"Нажать кнопочку build в IDE"? Зачем? Чтобы смотреть выхлоп в малюсеньком встроенном терминале? Так куда проще, надежней и наглядней рядом с IDE держать открытый терминал, где и писать make! Вот как это выглядит:
СпойлерИзображение
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

[uquote="Reflector",url="/forum/viewtopic.php?p=3707471#p3707471"]Ок, создаю пустой проект на С++ для F303, он потребляет 25 байт RAM. Добавим что-нибудь:

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

	lcd::drawLine(0, 0, lcd::x2(), lcd::y2(), Color::Green);
На 4 байта[/uquote]
Вы лукавите. Покажите ассемблерный код. Я только в этой строке вижу намного больше 4 байт расхода стека.

Добавлено after 7 minutes 1 second:
[uquote="Reflector",url="/forum/viewtopic.php?p=3707205#p3707205"]при компиляции вызывается интерпретатор С++ исполняющий код, потому в шаблоне может быть 10 страниц кода, а на выходе получится несколько констант[/uquote]
И что Вы потом будете делать при отладке? Результат работы препроцессора хотя бы можно увидеть, а это? Если мне не хватает CPP, я использую Perl. Но тогда все промежуточные результаты я вижу и контролирую.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3707495#p3707495"]На самом деле и 25 байтам неоткуда взяться.[/uquote]
У тебя вроде стартап другой, в стандартном стартапе объявлены 6 extern переменных, а сами они в скрипте линкера определены, видимо потому компилятор их выкинуть не может... Но эти 24+1 байт будут и в проекте на С, так что безусловно С++ тут не при чем. Наверное если бы у мк не было 48КБ RAM, то полез бы разбираться, на AVR точно бы полез :)

[uquote="ARV",url="/forum/viewtopic.php?p=3707507#p3707507"]то, что вы в main написали 3 строчки не делает ваш проект простым - за кадром остались простыни шаблонов и куча подключаемых файлов. то есть при отладке вы будете видеть не три эти строчки, а какие-то загадочные наборы символов из шаблона, разобраться в которых сможет лишь академик программистских наук. ну и мне это зачем? мне ковыряться в сложной иерархии шаблонных классов, которые на самом деле заменены парой ассемблерных команд (и понять, почему - отдельная тема) совсем не улыбается...[/uquote]
Очередные страшилки :) Компиляторы умнеют, в язык добавляются новые возможности, в том числе и призванные избавиться от громоздких и непонятных ошибок при работе с шаблонами, библиотеки переписываются с учетом этих нововведений и т.д.... Последний раз мне попадалась такая действительно размашистая ошибка несколько лет назад на ПК, на мк такого не помню вообще, хотя безусловно если не знать С++, то и с теми ошибками что есть разобраться будет очень сложно. Товарищ при помощи моих либ делает кормушку для животных, причем там есть кнопки, пульт, Esp8266, Sim800, чтоб можно было с дома передавать команды на дачу :) Естественно шаговик, чтоб крутить заслонку, RTC, эмуляции EEPROM во флеше мк, дисплей 176*220, у меня такого не было, но взглянув на документацию переделал файл для одного из своих дисплеев, отправил его товарищу и, не без везения, но заработало с первого раза, он даже менюшку сам пытался писать и даже можно сказать как-то работало, но потом мне надоело смотреть на мучения и написал универсальную :) Так вот у него это все работает при этом даже С он знает на достаточно низком уровне, но либы построенны таким образом, что максимально все проверяют во время компиляции, а если включены ассерты, то и во время выполнения. Например, если вернуться к SPI:

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

using spi1 = Spi1<PA4, PB3, PB5, PA7>;
Using - это тот же typedef, т.е. тут объявляется новый тип, это не реально исполняемый код, но при компиляции там много чего выполняется и проверяется. У ног SPI есть ремап на разные пины и для каждого еще нужно задавать номер альтернативной функции, но тут это делается автоматически и конкретно для этого кода получим ошибку компиляции конкретно говорящую о том, что MISO задан неверно, на PB5 ее сремапить нельзя. Если ошибки нет, значит все ноги из списка допустимых и был добавлен правильный номер AF. Или если попытаться нарисовать часть линии за пределами экрана, добавить данные в заполненный RingBuffer и т.д., то получим сообщение об ошибке в консоль красным цветом. Это все помогает обнаруживать большое количество ошибок, а ошибки компилятора мне товарищ иногда шлет, но чего-то большого связанного с шаблонами пока не было :)

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3707549#p3707549"]Вы лукавите. Покажите ассемблерный код. Я только в этой строке вижу намного больше 4 байт расхода стека.[/uquote]
Чего вдруг компилятор должен показывать статистику по стеку? Он там вообще динамический, да и какая разница сколько на него ушло, если в С уйдет столько же? Один статический методы класса вызывается другие, к ним привязаны только константы, экземпляр класса не создается - это то же самое, что убрать класс и запихнуть функции в namespace, а он просто область видимости ограничивает, так что никаких отличий от просто сишных функций не будет.
И что Вы потом будете делать при отладке? Результат работы препроцессора хотя бы можно увидеть, а это? Если мне не хватает CPP, я использую Perl. Но тогда все промежуточные результаты я вижу и контролирую.
Возьмем класс для работы с портами, т.к. с точки зрения метапрограммирования он самый сложный. Если сделать что-то совсем простое:

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

using pins = PinList<PB10, PB8, PA3>;
то автоматически будет вызвана constexpr функция transformToPins() которая берет все входные параметры, а это могут быть не только пины, но и другие списки и еще парочка других сущностей, и преобразует их только в пины, попутно проверяя нет ли там дубликатов. Результат присваивается constexpr полю класса существующему только во время компиляции, потому брейкоинты ставить бесполезно. Но если параллельно создать такую-же функцию transformToPins2(), убрать constexpr, добавить _noinline_ и присвоить результат обычной переменной, то все замечательно отлаживается:
СпойлерИзображение
На скрине видно, что из входного списка pins один пин уже удалился и добавился в outs, правда видно это по типам списков, сами они пустые, но какая разница, если это позволяет нормально все отлаживать :)
Ответить

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