- Эмбеддеры плохо знают Си :> -->2010-01-13
-
- Ещё уточнение: получается, можно мешать без проблем при передаче
линковщику объектники в одном проекте С и С++, если смогу среде
разработки объяснить, как из компилировать? - Dingo(06.10.2022 06:56)
- Если объектники C и C++, то следует линковать g++; если хочется ld,
то надо внимательно разбираться со стандартными библиотеками и
библиотеками поддержки и вручную их передавать линкеру ld VVB(136 знак., 06.10.2022 07:59)
- Спасибо, существенный момент. - Dingo(06.10.2022 09:09)
- Объектники на то и объектники, что можно слинковать любые,
независимо от языка из которого они вышли. Там главный камень
преткновения - имена функций и принцип передачи аргументов. - =AlexD=(06.10.2022 07:15)
- Не только это. В разных версиях объектников и в разных объектниках
есть нюансы. Например, как называется функция деления (при
отсутствии аппаратного деления)? Объектники C и C++ разных версий
могут не слинковаться. - VVB(06.10.2022 07:56)
- Со стандартными библиотеками нужно отдельно разбираться. - =AlexD=(06.10.2022 07:57)
- Речь идёт не о библиотеках. VVB(147 знак., 06.10.2022 08:02)
- Со стандартными библиотеками нужно отдельно разбираться. - =AlexD=(06.10.2022 07:57)
- Не только это. В разных версиях объектников и в разных объектниках
есть нюансы. Например, как называется функция деления (при
отсутствии аппаратного деления)? Объектники C и C++ разных версий
могут не слинковаться. - VVB(06.10.2022 07:56)
- Если соблюсти соглашение о вызове функций, то какие проблемы? На
С++ такие функции помечаются extern "C". Вас же не смущают
объектники на asm? - VladislavS.(06.10.2022 07:11)
- Не смущают, понял идею. Но были сомнения. - Dingo(06.10.2022 07:21)
- Если объектники C и C++, то следует линковать g++; если хочется ld,
то надо внимательно разбираться со стандартными библиотеками и
библиотеками поддержки и вручную их передавать линкеру ld VVB(136 знак., 06.10.2022 07:59)
- Тоже спрошу. Как оформляются обработчики прерываний? Поймал себя
недавно на том, что "и попробовал бы Цэ++, но не знаю, как делается
...". Это одна из базовых вещей. - Dingo(03.10.2022 06:53)
- Реализация очень сильно зависит от архитектуры и возможностей контроллера прерываний. VVB(3555 знак., 06.10.2022 10:26)
- Просто вызываю из прерывания любую функцию любого класса. Зачем ещё
что-то выдумывать? - Ale3000(06.10.2022 08:34)
- Так об этом и вопрос - как оформить(привязать) вызов любой функции
из прерывания. Пока, как я понял, делается массово в стиле С, но
никто не мешает пробовать и по другому. - symbions(06.10.2022 09:32)
- Очень просто оформляется: Ale3000(213 знак., 06.10.2022 11:01)
- Для того чтобы вызвать прерывание нужен адрес. Как его сказать контроллеру (в таблицу прерываний или напрямую в контроллер прерываний) зависит от архитектуры железки. А вот где взять этот адрес уже от языка зависит. И если адрес С-ной функции взять труда не составляет, то указетель на метод класса/объекта в С++ это нетривиальная, зависящая от реализации компилятором сущность. Поэтому, оборачиваем С-функцией и не парим себе мозги. - VladislavS.(06.10.2022 10:57)
- Так об этом и вопрос - как оформить(привязать) вызов любой функции
из прерывания. Пока, как я понял, делается массово в стиле С, но
никто не мешает пробовать и по другому. - symbions(06.10.2022 09:32)
- Если бы разработчики С++ захотели, они бы, вероятно, легко сделали
это. Tyмблep(1006 знак., 03.10.2022 13:08)
- Ага, разработчики тех же кортексов сделали вход в прерывание за 12
тактов как раз для того чтобы мы с this успевали промудохаться. :) - VladislavS.(03.10.2022 13:23)
- Это бесконечный старый спор. Tyмблep(248 знак., 03.10.2022 14:07)
- Ну так и решать пикосекундные задачи тоже - VladislavS.(03.10.2022 14:20)
- Да, если понадобиться, тогда ASM. Tyмблep(244 знак., 03.10.2022 14:24)
- В мелких контроллерах, типа кортексов или AVR таблица векторов
прерываний это константные данный этапа компиляции. То есть,
компилятор должен знать адрес на момент линковки. Всякие
динамически создаваемые объекты плохо тут ложатся. Получается, либо
установка векторов в рантайме с переносом таблицы векторов в RAM
(если такая возможность есть). Либо прослойка просто через таблицу
в RAM (если возможности перенести таблицу нет). В обоих случаях
накладные расходы. VladislavS.(144 знак., 03.10.2022 14:35)
- Это проблема поддержки со стороны разработчиков компилятора. Tyмблep(3046 знак., 03.10.2022 16:28)
- Вот, функции для работы с потоками Виндус - обратите внимание на lpParameter : Tyмблep(545 знак., 03.10.2022 16:42)
- По идее constexpr bind( F&& f,
Args&&... args ); у которого определены все аргументы
должен давать тип void(*)(void) и его наверное можно запихнуть в
таблицу векторов, но нужно изучать, проверять и потом бояцца, как
бэ в очередной версии компилятора не поломалось. - =AlexD=(03.10.2022 15:09)
- Мне думается, в constexpr какой-нибудь каст точно не пройдёт. - VladislavS.(03.10.2022 16:07)
- Это проблема поддержки со стороны разработчиков компилятора. Tyмблep(3046 знак., 03.10.2022 16:28)
- В мелких контроллерах, типа кортексов или AVR таблица векторов
прерываний это константные данный этапа компиляции. То есть,
компилятор должен знать адрес на момент линковки. Всякие
динамически создаваемые объекты плохо тут ложатся. Получается, либо
установка векторов в рантайме с переносом таблицы векторов в RAM
(если такая возможность есть). Либо прослойка просто через таблицу
в RAM (если возможности перенести таблицу нет). В обоих случаях
накладные расходы. VladislavS.(144 знак., 03.10.2022 14:35)
- Да, если понадобиться, тогда ASM. Tyмблep(244 знак., 03.10.2022 14:24)
- Ну так и решать пикосекундные задачи тоже - VladislavS.(03.10.2022 14:20)
- Это бесконечный старый спор. Tyмблep(248 знак., 03.10.2022 14:07)
- Ага, разработчики тех же кортексов сделали вход в прерывание за 12
тактов как раз для того чтобы мы с this успевали промудохаться. :) - VladislavS.(03.10.2022 13:23)
- никак. Nikolay801_(733 знак., 03.10.2022 10:51)
- Не-не-не, что-то не то. Вот в plain C есть обработчик, функция void my_isr(void); - что в этом случае у плюсов? Класс? Функция? Может ли extern "C" void my_isr(void) {} внутри себя вызывать методы классов? Если буфер реализован
классом, как из обработчика положить в него данные? Как проверить
состояние пина, если порт-пин описан сущностями Ц++, через те же
темплейты, например? - Dingo(03.10.2022 09:57)
- По аналогии у плюсов Tyмблep(30 знак., 03.10.2022 13:11)
- А что остановит использовать темплейт? Вот пример. Тут PE8 это
шаблонный тип и LED это шаблонный тип. Или ниже пример с USB - куда
уж шаблонней? VladislavS.(306 знак., 03.10.2022 10:19 - 10:30, картинка)
- Спасибо. Я помню ваш пример с Key (
но уже вряд ли найдунашел!-> ). Dingo(1 знак., 03.10.2022 10:50, ссылка)
- Спасибо. Я помню ваш пример с Key (
- Кстати, в жизни всё гораздо проще. Обработчк прерывания - обычная
функция, в которой делается ровно то что она должна делать. Надо
флаг в регистре сбросить - сбрасываем флаг с помощью CMSIS. Надо
светодиодом мигнуть - дёргаем метод класса светодиода. Без всяких
комплексов. - VladislavS.(03.10.2022 09:15)
- Очень легкомысленное заявление. Во всей ветке обсуждения я не
увидел ни слова про реентерабельность функций для прерываний. Costic(700 знак., 03.10.2022 16:45)
- Потому что реентерабельность это совсем из другой оперы. Какая
разница называете вы функции методами, а данные членами или нет?
Какая разница будут shared данные глобальными или членами класса?
Ничего же не меняется от этого. Членов хоть от несанкционированного
доступа защитить можно. - VladislavS.(03.10.2022 16:58)
- Опера всё та же. Когда в классе функции-члены вызываются из разных
мест и могут прерываться, то важно чтобы они были реентерабельными. - Costic(03.10.2022 18:55)
- А когда функции не члены, не важно что ли? Зачем на этом акцент сделан? - VladislavS.(03.10.2022 19:32)
- Опера всё та же. Когда в классе функции-члены вызываются из разных
мест и могут прерываться, то важно чтобы они были реентерабельными. - Costic(03.10.2022 18:55)
- Потому что реентерабельность это совсем из другой оперы. Какая
разница называете вы функции методами, а данные членами или нет?
Какая разница будут shared данные глобальными или членами класса?
Ничего же не меняется от этого. Членов хоть от несанкционированного
доступа защитить можно. - VladislavS.(03.10.2022 16:58)
- ... надо символ в очередь внутри класса положить - кладём - =AlexD=(03.10.2022 09:37)
- А format c: /q можно? :) - VladislavS.(03.10.2022 09:46)
- "Можно. Но потом. Весь накопитель в труху". Пардон, не удержался. - Dingo(03.10.2022 09:58)
- А format c: /q можно? :) - VladislavS.(03.10.2022 09:46)
- Очень легкомысленное заявление. Во всей ветке обсуждения я не
увидел ни слова про реентерабельность функций для прерываний. Costic(700 знак., 03.10.2022 16:45)
- Самое простое - обычные функции в плюсах никто не запрещал. Чуть
посложнее методы классов делать обработчиками, но и это возможно, с
опытом придёт. - VladislavS.(03.10.2022 07:07)
- Любопытно, вот есть класс UART, в нем обработчик прерывания void
i();. В программе создаем два объекта UART u1, u2; Как привязать
u1.i() и u2.i() к разным физическим прерываниям, не используя
Сишных прокладок? - AlexBi(03.10.2022 08:22)
- Никак. Т.к. ядро процессора/контроллера не умеет одновременно указатель на объект (this) и адрес/смещение функции вычислить. - Costic(03.10.2022 16:50)
- Как вариант. Переносите таблицу прерываний в ОЗУ. В конструктор класса UART передаёте его номер и создаёте объекты UART u1(1), u2(2); Конструктор класса UART устанавливает свой обработчкик в таблицу векторов прерываний при создании объекта. Можно и другие варианты придумать, была бы необходимость. Но прокладка - самое простое. Мир от её использования не перевернётся. - VladislavS.(03.10.2022 10:06)
- Так элементарно. Обработчик прерывания - обычная Си'шная функция
extern "C" { void Uart1Int(void) { u1.i(); } void Uart2Int(void) {
u2.i(); } } - =AlexD=(03.10.2022 08:28)
- Это и есть сишные прокладки, нет? КМК, значительная часть проблем
плюсов в том, что плюсовая публика излишне идеологизирована: "Нет
сишным прокладкам! Мы тут плюсы или где?" - SciFi(03.10.2022 08:35)
- Это ваши тараканы какие-то. Почему вы боитесь "прокладок"? Они даже
накладных расходов не несут. Смотрите примеры: VladislavS.(1068 знак., 03.10.2022 08:54)
- static не годится, т.к. для u1 и u2 он будет одинаковый. Сишные
прокладки не удобны, т.к. u1 может быть внутри другого объекта, а
тот внутри еще чего-то, либо вообще создаваться динамически. Вся
красота теряется. - AlexBi(03.10.2022 09:12)
- Бесконечное вложение классов дуг в друга - это не "красиво" - =AlexD=(03.10.2022 09:38)
- Не класса в класс, а объекта в объект или объекта в класс. - VladislavS.(03.10.2022 09:43)
- Чуть ниже пример с USB. Там обработчик статик, но вызвает методы разных объектов в зависимости от того какой из портов обрабатывает. - VladislavS.(03.10.2022 09:32)
- Задачи бывают разные. Где-то static подойдёт, где-то метод динамически созданного объекта (в эмбедде? правда, правда?). - VladislavS.(03.10.2022 09:17)
- Бесконечное вложение классов дуг в друга - это не "красиво" - =AlexD=(03.10.2022 09:38)
- Это прекрасно. Только непонятно, зачем вообще нужен класс, когда
там всего две функции. Лишняя сущность же. - SciFi(03.10.2022 08:56)
- Или вот пример обработчиков с шаблонным классом. В контроллере два
USB, класс один, объектов два, обработчиков прерываний два. VladislavS.(1 знак., 03.10.2022 09:33, картинка)
- А я бы привёл другой пример. Да, с лишним сгенерённым кодом, но
может быть он понятнее "бедуинам"? Costic(541 знак., 03.10.2022 17:09, ссылка)
- Зачем же в микроконтроллере объекты динамически создавать? VladislavS.(1 знак., 03.10.2022 17:37, ссылка)
- В моём примере демонстрировались виртуальные функции. Подправил так: Costic(1 знак., 03.10.2022 18:49, ссылка)
- Зачем же в микроконтроллере объекты динамически создавать? VladislavS.(1 знак., 03.10.2022 17:37, ссылка)
- вот, похоже на ответ. То есть из plain C можно обращаться уже к C++
выходит? - Dingo(03.10.2022 10:09)
- Без некоторого рукоблудства нет. В С++ есть механизм перегрузки
функций. Чтобы компилятор различал разные кандидаты на перегрузку
при компиляции к именам функций добавляются префиксы, зависящие от
аргументов. В объектных файлах эти имена могут быть очень
причудливыми. Например, SysTick_Handler() превратится в
_Z15SysTick_Handlerv. Если функции с аргументами, то имя сильно
разрастается. Функцию с таким именем из С-кода не вызвать. Для того
чтобы отключить этот механизм VladislavS.(160 знак., 03.10.2022 10:28 - 10:41)
- Это позволяет из ASM, и любого другого языка вызвать С++ функцию,
если он поддерживает Си'шное соглашение о вызовах. - =AlexD=(03.10.2022 10:31)
- В общем случае именно так. - VladislavS.(03.10.2022 10:33)
- Это позволяет из ASM, и любого другого языка вызвать С++ функцию,
если он поддерживает Си'шное соглашение о вызовах. - =AlexD=(03.10.2022 10:31)
- Это С++, просто указание компилятору, что вот к этому конкретному имени функции применяется asm трансляция имён в стиле Си, а не С++. - =AlexD=(03.10.2022 10:24)
- Без некоторого рукоблудства нет. В С++ есть механизм перегрузки
функций. Чтобы компилятор различал разные кандидаты на перегрузку
при компиляции к именам функций добавляются префиксы, зависящие от
аргументов. В объектных файлах эти имена могут быть очень
причудливыми. Например, SysTick_Handler() превратится в
_Z15SysTick_Handlerv. Если функции с аргументами, то имя сильно
разрастается. Функцию с таким именем из С-кода не вызвать. Для того
чтобы отключить этот механизм VladislavS.(160 знак., 03.10.2022 10:28 - 10:41)
- Кто-нибудь рискнёт сказать, что тут прокладки и это "недостаточно
С++"? Для реализации подобного на С две почти одинаковые функции
придётся писать? Только не надо про макросы... - VladislavS.(03.10.2022 09:52)
- Почему же не надо про макросы? Шаблоны это грубо замена макросам.
Предложенный пример спокойно реализуется через склейку. Только вся
натянутость шаблонных решений (плевать шаблоны плюсов или макросы)
не помогает навигации/отладке. Не буду говорить плохо о плюсах, а
хорошо не могу - у меня на них идиосинкразия. НО пример,
КМК,подобран именно идеологический и выбран вариант получения
экземпляров метода в зависимости от параметра с прицелом на
не-рантайм. В Сях не-рантайм - это Vit(263 знак., 03.10.2022 11:33)
- Макросы не имеют области видимости. Вот в виндузовых хедерах
какой-то альтернативно одарённый перец догадался определить макросы
min и max ловеркейсом, и привет - вы пишете void set_limits(int
min, int max), и препроцессор вам вместо параметров функции
подставляет самизнаетечто. С шаблонами такого не происходит. - йцyкeн(03.10.2022 13:19)
- Криворукость и возможности:) - это всегда расширяет кругозор:))) Я,
например, отношусь к шаблонам как к костылям, которые лишь
позволили говорить, что "можно без макросов". Для меня они ещё
более отдаляют С++ от удобоваримости Vit(1 знак., 03.10.2022 13:55, картинка)
- Просто вы не умеете их готовить. Для меня китайский - сущая
тарабарщина, а 1.5 млрд китайцев на нём говорят и не парятся. - VladislavS.(03.10.2022 14:49)
- Так и не собираюсь. Хотя иногда приходится копаться в. Считаю плюсы
рудиментарным звеном:) между Си и Си-Шарпом - Vit(03.10.2022 16:06)
- C# в микроконтроллер? Оригинально. Ж) - VladislavS.(03.10.2022 16:45)
- Так и не собираюсь. Хотя иногда приходится копаться в. Считаю плюсы
рудиментарным звеном:) между Си и Си-Шарпом - Vit(03.10.2022 16:06)
- Просто вы не умеете их готовить. Для меня китайский - сущая
тарабарщина, а 1.5 млрд китайцев на нём говорят и не парятся. - VladislavS.(03.10.2022 14:49)
- Криворукость и возможности:) - это всегда расширяет кругозор:))) Я,
например, отношусь к шаблонам как к костылям, которые лишь
позволили говорить, что "можно без макросов". Для меня они ещё
более отдаляют С++ от удобоваримости Vit(1 знак., 03.10.2022 13:55, картинка)
- Само собой, пример подобран. Какой смысл показывать примеры, где не будет разницы? В целом вы правильно понимаете суть происходящего, но сильно недооцениваете силу шаблонов и constexpr. - VladislavS.(03.10.2022 11:48)
- Макросы не имеют области видимости. Вот в виндузовых хедерах
какой-то альтернативно одарённый перец догадался определить макросы
min и max ловеркейсом, и привет - вы пишете void set_limits(int
min, int max), и препроцессор вам вместо параметров функции
подставляет самизнаетечто. С шаблонами такого не происходит. - йцyкeн(03.10.2022 13:19)
- На С писать придется примерно так же, как на С++, те же две
функции, или одну, напичканную if-ами. Или я чего-то не понимаю ... AlexBi(1 знак., 03.10.2022 10:29, картинка)
- if будет выполняться в рантайме при каждом вызове прерывания. От if
constexpr останется только USB_FS_OBJECT.Enumerate_Reset() в
прерывании USB_FS, и USB_HS_OBJECT.Enumerate_Reset() в прерывании
USB_HS на этапе компиляции. Никаких if в рантайме не будет. - VladislavS.(03.10.2022 10:42)
- От обычного if, применённого к константе, в коде тоже ничего не
остаётся. йцyкeн(1 знак., 03.10.2022 13:55, ссылка)
- А ещё c простым if обе ветки условия должны корректно компилироваться. С if constexpr они должны быть всего лишь синтаксически правильно составлены. Накидал пример: Под if константа. VladislavS.(8 знак., 03.10.2022 16:11, ссылка)
- Зависит от оптимизации и от того находится ли код в другой единице
трансляции. VladislavS.(8 знак., 03.10.2022 14:23, ссылка)
- Ну разумеется. Вы сделали x не параметром шаблона, а параметром
функции. Теперь это не константа. - йцyкeн(03.10.2022 14:32)
- Как же не константа? Включите -O1 и "о чудо" случится. Самая
настоящая константа. VladislavS.(214 знак., 03.10.2022 14:45)
- Нет. Для функции plusminus x не является константой, поэтому в
ассемблерном тексте проверка условия сохранилась в виде инструкции
cmove. А вот в местах вызова фактические параметры являются
константами, и там оптимизатор заменил вызовы plusminus
результатами этих вызовов. - йцyкeн(03.10.2022 14:47)
- Вот мы и вышли на разный уровень - либо это константа по стандарту языка, либо оптимизатор так решил. Поэтому, где рассчитываем иметь константу пишем if constexpr, чтобы муха не проскочила. Не всегда так просто определить "на глаз" константность данных, пусть этим компилятор занимается. - VladislavS.(03.10.2022 14:53)
- Нет. Для функции plusminus x не является константой, поэтому в
ассемблерном тексте проверка условия сохранилась в виде инструкции
cmove. А вот в местах вызова фактические параметры являются
константами, и там оптимизатор заменил вызовы plusminus
результатами этих вызовов. - йцyкeн(03.10.2022 14:47)
- Как же не константа? Включите -O1 и "о чудо" случится. Самая
настоящая константа. VladislavS.(214 знак., 03.10.2022 14:45)
- Ну разумеется. Вы сделали x не параметром шаблона, а параметром
функции. Теперь это не константа. - йцyкeн(03.10.2022 14:32)
- Чем это будет отличаться от вызова
Enumerate_Reset(&USB_FS_OBJECT) и
Enumerate_Reset(&USB_HS_OBJECT) в соответствующих обработчиках
прерываний, если все писать в С-стиле? - AlexBi(03.10.2022 10:46)
- Тем что метод Enumerate_Reset должен уметь с этим
&USB_FS_OBJECT что-то делать. Это дополнительный код. А выбор
между вызовом Enumerate_Reset(&USB_FS_OBJECT) или
Enumerate_Reset(&USB_HS_OBJECT) в рантайме или макросом? - VladislavS.(03.10.2022 10:54)
- Разве внутри USB_FS_OBJECT.Enumerate_Reset() не делается что-то с
USB_FS_OBJECT? Или смущает что вместо x придется писать
arg->x, или вместо foo() придется писать arg->foo(arg)? AlexBi(237 знак., 03.10.2022 11:13, картинка)
- C++ программиста вообще ничего не смущает, а уж объём текста и
подавно :) А вот во что это в кончном счёте скомпилируется очень
даже. Во-первых, передать аргумент в Enumerate_Reset не бесплатно.
Во-вторых внутри придётся много проверок аргумента делать, чтобы
выбирать с каким из двух USB-портов оперировать. В-третьих,
Enumerate_Reset static inline и его вызова вообще не будет. Что-то
оптимизатор вытянет, но далеко не всё. Код будет медленней, а это
прерывание. Ну и VladislavS.(45 знак., 03.10.2022 11:29)
- Если так переживать за скорость, что учитывать количество
передаваемых аргументов, то в С++ придется делать изрядное
количество static, т.к. любой вызов не static метода неявно требует
передачи одного параметра, а в программах очень часто встречается
единственный объект класса. Не уверен, что оптимизатор способен
обнаружить это самостоятельно и сделать код как для static, хотя
формально препятствий нет. AlexBi(261 знак., 03.10.2022 11:43)
- inline IRQHandler улыбнуло. А куда его можно встроить? Впрочем,
inline это такое слово-паразит в С. Пиши не пиши - ничего не
изменится. В С++ у него хоть другие применения есть. - VladislavS.(03.10.2022 12:27)
- Встраивать я предполагал туда AlexBi(244 знак., 03.10.2022 12:39, картинка)
- Мне кажется, польза inline незаслуженно преувеличена. Он не нужен.
Сэкономить пару тактов? Это бывает нужно два раза в год, и inline
там будет нужен в последнюю очередь. Следовательно, если погромиздъ
применяет inline чаще, чем 2 раза в год, он демонстрирует
неадекватную оценку реальных требований к софту. - SciFi(03.10.2022 12:45)
- На мелких контроллерах типа ПИК это экономия стека, который весьма
мелкий. Но программу при этом удобнее писать в виде отдельных
функций, вызывающих друг друга. Приходится следить за глубиной
вложенности. AlexBi(115 знак., 03.10.2022 12:49)
- Так большинство аргументов обычно и разбивается об скалу "и это всё
ради пары тактов?". А пара тактов тут, пара тактов там, тем более
что это всё делает компилятор и уже набегает разница. - VladislavS.(03.10.2022 12:59)
- Всё так. Только на самом деле не набегает :-) - SciFi(03.10.2022 13:02)
- Есть опыт или с потолка? - VladislavS.(03.10.2022 13:09)
- Опыт есть. И да, "набегает" - это с потолка :-) - SciFi(03.10.2022 13:37)
- Получается моё кун-фу сильнее твоего :) VladislavS.(48 знак., 03.10.2022 13:55, youtube)
- Опыт есть. И да, "набегает" - это с потолка :-) - SciFi(03.10.2022 13:37)
- Есть опыт или с потолка? - VladislavS.(03.10.2022 13:09)
- Всё так. Только на самом деле не набегает :-) - SciFi(03.10.2022 13:02)
- Так большинство аргументов обычно и разбивается об скалу "и это всё
ради пары тактов?". А пара тактов тут, пара тактов там, тем более
что это всё делает компилятор и уже набегает разница. - VladislavS.(03.10.2022 12:59)
- На мелких контроллерах типа ПИК это экономия стека, который весьма
мелкий. Но программу при этом удобнее писать в виде отдельных
функций, вызывающих друг друга. Приходится следить за глубиной
вложенности. AlexBi(115 знак., 03.10.2022 12:49)
- Мне кажется, польза inline незаслуженно преувеличена. Он не нужен.
Сэкономить пару тактов? Это бывает нужно два раза в год, и inline
там будет нужен в последнюю очередь. Следовательно, если погромиздъ
применяет inline чаще, чем 2 раза в год, он демонстрирует
неадекватную оценку реальных требований к софту. - SciFi(03.10.2022 12:45)
- Встраивать я предполагал туда AlexBi(244 знак., 03.10.2022 12:39, картинка)
- В случае с С++ есть возможность писать код методов в заголовочном
файле. Тогда весь код будет в одной единице трансляции и
возможности оптимизации сильно выше. Статик или не статик тогда на
оптимизацию не сильно влияет. Пример на эту тему: VladislavS.(248 знак., 03.10.2022 12:18, картинка)
- Даже если весь код под рукой, компилятор отказывается инлайнить
единственный вызов функции. Правда это все С-компиляторы, с
которыми я имел дело, как у С++ не знаю. - AlexBi(03.10.2022 12:44)
- Да дадно, а если попросить? :) VladislavS.(1 знак., 03.10.2022 13:08, картинка)
- Даже если весь код под рукой, компилятор отказывается инлайнить
единственный вызов функции. Правда это все С-компиляторы, с
которыми я имел дело, как у С++ не знаю. - AlexBi(03.10.2022 12:44)
- Мне тоже кажется жутко неудобным, что нельзя весь класс объявить статическим, не по области видимости, а по методам. - =AlexD=(03.10.2022 11:49)
- inline IRQHandler улыбнуло. А куда его можно встроить? Впрочем,
inline это такое слово-паразит в С. Пиши не пиши - ничего не
изменится. В С++ у него хоть другие применения есть. - VladislavS.(03.10.2022 12:27)
- Если так переживать за скорость, что учитывать количество
передаваемых аргументов, то в С++ придется делать изрядное
количество static, т.к. любой вызов не static метода неявно требует
передачи одного параметра, а в программах очень часто встречается
единственный объект класса. Не уверен, что оптимизатор способен
обнаружить это самостоятельно и сделать код как для static, хотя
формально препятствий нет. AlexBi(261 знак., 03.10.2022 11:43)
- C++ программиста вообще ничего не смущает, а уж объём текста и
подавно :) А вот во что это в кончном счёте скомпилируется очень
даже. Во-первых, передать аргумент в Enumerate_Reset не бесплатно.
Во-вторых внутри придётся много проверок аргумента делать, чтобы
выбирать с каким из двух USB-портов оперировать. В-третьих,
Enumerate_Reset static inline и его вызова вообще не будет. Что-то
оптимизатор вытянет, но далеко не всё. Код будет медленней, а это
прерывание. Ну и VladislavS.(45 знак., 03.10.2022 11:29)
- Разве внутри USB_FS_OBJECT.Enumerate_Reset() не делается что-то с
USB_FS_OBJECT? Или смущает что вместо x придется писать
arg->x, или вместо foo() придется писать arg->foo(arg)? AlexBi(237 знак., 03.10.2022 11:13, картинка)
- Тем что метод Enumerate_Reset должен уметь с этим
&USB_FS_OBJECT что-то делать. Это дополнительный код. А выбор
между вызовом Enumerate_Reset(&USB_FS_OBJECT) или
Enumerate_Reset(&USB_HS_OBJECT) в рантайме или макросом? - VladislavS.(03.10.2022 10:54)
- От обычного if, применённого к константе, в коде тоже ничего не
остаётся. йцyкeн(1 знак., 03.10.2022 13:55, ссылка)
- if будет выполняться в рантайме при каждом вызове прерывания. От if
constexpr останется только USB_FS_OBJECT.Enumerate_Reset() в
прерывании USB_FS, и USB_HS_OBJECT.Enumerate_Reset() в прерывании
USB_HS на этапе компиляции. Никаких if в рантайме не будет. - VladislavS.(03.10.2022 10:42)
- Почему же не надо про макросы? Шаблоны это грубо замена макросам.
Предложенный пример спокойно реализуется через склейку. Только вся
натянутость шаблонных решений (плевать шаблоны плюсов или макросы)
не помогает навигации/отладке. Не буду говорить плохо о плюсах, а
хорошо не могу - у меня на них идиосинкразия. НО пример,
КМК,подобран именно идеологический и выбран вариант получения
экземпляров метода в зависимости от параметра с прицелом на
не-рантайм. В Сях не-рантайм - это Vit(263 знак., 03.10.2022 11:33)
- А я бы привёл другой пример. Да, с лишним сгенерённым кодом, но
может быть он понятнее "бедуинам"? Costic(541 знак., 03.10.2022 17:09, ссылка)
- Чтобы не писать в каждой функции аргументом указатель на структуру с данными. Экономия пальцекликов ;-) Но вообще то прикольно, когда интеллектуальный помощник редактора сам вываливает тебе список методов после точки. Можно не морщить моск и не заглядывать в хедер. Удобненько. - =AlexD=(03.10.2022 09:03)
- Что значит две функции? Это же пример. Класс может быть сколь угодно сложным. Один из методов - обработчик прерываний. Вот вам класс с тремя навороченными методами, один из которых обработчик прерываний. VladislavS.(155 знак., 03.10.2022 09:00)
- Или вот пример обработчиков с шаблонным классом. В контроллере два
USB, класс один, объектов два, обработчиков прерываний два. VladislavS.(1 знак., 03.10.2022 09:33, картинка)
- static не годится, т.к. для u1 и u2 он будет одинаковый. Сишные
прокладки не удобны, т.к. u1 может быть внутри другого объекта, а
тот внутри еще чего-то, либо вообще создаваться динамически. Вся
красота теряется. - AlexBi(03.10.2022 09:12)
- Плюсы в отличии от Си не универсальны, увы. Это совершенно очевидно любому, кто с ними хоть немного поработал. И отсутствие стандарта (хотя бы _дефакто) на именование функций в ASM выхлопе - одна из проблем. Можно извернуться, забиндить метод с аргументом и как-то прописать указатель в таблицу векторов, но это по сути будет ровно то-же самое, что я написал, только через жопу. - =AlexD=(03.10.2022 08:45)
- Это ваши тараканы какие-то. Почему вы боитесь "прокладок"? Они даже
накладных расходов не несут. Смотрите примеры: VladislavS.(1068 знак., 03.10.2022 08:54)
- Это и есть сишные прокладки, нет? КМК, значительная часть проблем
плюсов в том, что плюсовая публика излишне идеологизирована: "Нет
сишным прокладкам! Мы тут плюсы или где?" - SciFi(03.10.2022 08:35)
- Любопытно, вот есть класс UART, в нем обработчик прерывания void
i();. В программе создаем два объекта UART u1, u2; Как привязать
u1.i() и u2.i() к разным физическим прерываниям, не используя
Сишных прокладок? - AlexBi(03.10.2022 08:22)
- Спрошу здесь. Каким умным словом называется, когда вставляешь
объект одного класса в другой класс? - IBAH(30.09.2022 14:20)
- В книжке Дж. Янга по Visual C++ это называется встроенный класс - il-2(01.10.2022 06:53)
- "Ну, Красная Шапочка, выбирай, либо, дружественное слияние, либо, недружественное поглощение..." - mse homjak(30.09.2022 21:03)
- Из зала подсказывают: инкапсуляция - Nikolay_Po(30.09.2022 19:32)
- Не совсем. Инкапсуляция это объединение в класс данных и методов
работы с ними с контролем доступа. Тут же просто данные(объкт). Мне
больше версия Крок нравится. - VladislavS.(30.09.2022 20:05)
- Это называется "композиция классов". Честно. - Cкpипaч(30.09.2022 20:07)
- композиция == позиция ком, экспозиция == позиция экс, суперпозиция... короче коитус более общее название IBAH(1 знак., 30.09.2022 20:44, ссылка)
- Это называется "композиция классов". Честно. - Cкpипaч(30.09.2022 20:07)
- Не совсем. Инкапсуляция это объединение в класс данных и методов
работы с ними с контролем доступа. Тут же просто данные(объкт). Мне
больше версия Крок нравится. - VladislavS.(30.09.2022 20:05)
- Коитус? - Kpoк(30.09.2022 18:21)
- ... от создателей "папы и мамы"™ - SciFi(30.09.2022 19:35)
- Этапять! :)) - MBedder(30.09.2022 19:28)
- Объект становится членом класса. - VladislavS.(30.09.2022 15:03)
- Бессмертное:"- Вы тоже член сопротивления? - Нет, не член, я его мозг!"(С) - mse homjak(30.09.2022 19:09)
- Еще вопрос. В этом случае, в какой последовательности вызовутся
конструкторы? - IBAH(30.09.2022 14:23)
- Сразу не понял вопрос. Первыми будут вызваны конструкторы членов
класса, затем конструктор объединяющего класса. Этот код выведет
АB. VladislavS.(148 знак., 30.09.2022 15:18)
- а если так funk(){static B b; }. Конструктор вызовется при первом
вхождении в блок? - IBAH(30.09.2022 15:43)
- При первом вызове funk. VladislavS.(18 знак., 30.09.2022 15:55, ссылка)
- Спасибо. А вот если объект объявлен внешним к main(). Когда
вызовется конструктор? ведь перед маин идет код "создания среды"... - IBAH(30.09.2022 15:41)
- Внешний к main это глобальный. Зависит от того как старатп написал. Обычно сразу после инициализации сегментов данных перед вызовом main. VladislavS.(19 знак., 30.09.2022 16:07, ссылка)
- чуть не в тему, но влезу. пока писали на сях, то обсуждали вопросы
целевой задачи - как настроить порт, оверсемплинг АЦП, как
настроить куб чтобы он USB хост сделал, ну и прочие чисто целевые
для решаемых задач проблемы. Mahagam(209 знак., 30.09.2022 15:51)
- На самом деле работа добавляется только в начале. Как только вы
обрастаете библиотекой классов скорость разработки сильно
вырастает. - VladislavS.(30.09.2022 16:05)
- да как только обрастаешь любой библиотекой - скорость работы
возрастает. но на форумах плюсовики нихрена не обсуждают целевые
задачи, а только и обсуждают лямбды, монады, виртуальные функции и
прочую чисто языковую ересь. - Mahagam(30.09.2022 16:10)
- А кому интересны МОИ целевые задачи? А вот языковые фишки у всех
одинаковые. А так как назвать их простыми для понимания нельзя, вот
и обсуждают. - VladislavS.(30.09.2022 16:15)
- здесь вот как раз и обсуждали целевые задачи. потому что языковых
проблем было совсем немного. - Mahagam(30.09.2022 16:18)
- А как обсуждение целевых задач связано с языком? В каком регистре
какой бит установить вообще языконезависимый вопрос. Как вы
понимаете С или С++ разработчик обсуждает целевой вопрос? - VladislavS.(30.09.2022 16:23)
- ещё раз. тут практически не наблюдалось тем с языковыми вопросами.
при этом форум - весьма живой. что при этом обсуждают - можете сами
полистать и посмотреть. а тематические форумы, где собираются
преимущественно пищущие на плюсах, на 90% засраны чисто языковыми
вопросами. - Mahagam(30.09.2022 16:29)
- Не замечал. Возможно, бывает, кто-то выкладывает примеры кода по
целевому вопросу на плюсах, вызывая тем самым непонимание у
собеседников, тогда может начаться срач. - VladislavS.(30.09.2022 16:35)
- Это из серии "Смотри как я могу!" - IBAH(30.09.2022 16:47)
- Бывает и выпендрёжь, конечно, но не обязательно. Ну просто есть
кого-то рабочик код на плюсах, не переписывать же его для форума
специально. - VladislavS.(30.09.2022 16:49)
- Проблема с терминологией. Где заканчивается "Си с классами" и
начинаются плюсы? Имхо, подходы в плюсах(в Си с классами ) в
некотором роде конечно удобнее, но все прекрасно реализуется на
теплом-ламповом Си. А все эти метапрограммирования в топку. Что и
иллюстрирует картинка ТС . - IBAH(30.09.2022 16:55)
- Вы просто не умеете его готовить. Я бы мог бесконечно показывать
примеры, но это непробиваемо. Сразу авторитетно докажут, что у них
для этого есть конфигуратор/скрипт/утилита и это тру вэй.
Проходили. - VladislavS.(30.09.2022 17:01)
- Пишите статью и ссылку сюда. "Ябпочитал" - Dingo(30.09.2022 17:22)
- Статья, в отличии от пятничного трёпа, требует времени. На просто
почитать есть пример кода, который ни одним макросом не напишете. VladislavS.(98 знак., 30.09.2022 17:37, ссылка)
- Вот так хорошая книга о С++ для эмбедерства и никак не напишется :/ - symbions(30.09.2022 23:35)
- С++ для эмбеддерства это всё равно что чернила для пятого класса.
Если вы понимаете как работает язык, то без всяких умных книжек не
будете в контроллерах применять контейнеры с эллокаторами, rtti,
исключения и виртуальные методы, а пустите в ход шаблоны, constexpr
и метапрограммирование. - VladislavS.(01.10.2022 01:05)
- Т.е. это "С с классами", ну и для извращенцев еще шаблоны и только-то? - POV(01.10.2022 01:08)
- Цэ++ для ымбеддерства — это Цэ. Готово, написано! - SciFi(30.09.2022 23:37)
- А можете на Цэ, к примеру, таблицу синусов во флэш сформировать? - VladislavS.(01.10.2022 01:41)
- Он ещё и кофе не умеет готовить. И это прекрасно! SciFi(65 знак., 01.10.2022 09:54)
- О чём я и говорил. Конфигураторы/скрипты/утилиты наше всё. Вернее
ваше. - VladislavS.(01.10.2022 10:03)
- А если программу на С компилировать как С++, получив при этом все
плюсы оптимизатора, это будет уже С++? - AlexBi(01.10.2022 14:33)
- Какие плюсы оптимизатора ожидаете на том же коде? Почему результат
должен стать другим? - VladislavS.(01.10.2022 14:36)
- const будет практически constexpr, плюс LTO - AlexBi(01.10.2022 14:48)
- LTO и на С коде работает. А const и constexpr это из разной оперы.
В тех местах где вместо constexpr можно написать const разницы в
результате не будет никакой. Единственную пользу, которую можно
поиметь от компилирования С-кода компилятором С++, это более
строгий контроль типов. Ну и синтаксические плюшки кое-где. - VladislavS.(01.10.2022 15:28)
- const применительно к функции не дает того эффекта как constexpr, и
оптимизация в итоге получается не такой эффективной. Правда я не
уверен что компилятор С++ будет рассматривать const как constexpr.
Хотя, const еще влияет на размещение (ОЗУ-ПЗУ), для контроллеров
это существенно. А как constexpr влияет? - AlexBi(01.10.2022 22:15)
- constexpr применительно к функции не гарантирует её вычисление в
компайлтайме. Только для переменной. Вот смотрите несколько
интересных примеров: VladislavS.(1362 знак., 01.10.2022 23:29, картинка, картинка)
- Ещё про const и размещение в памяти: VladislavS.(127 знак., 02.10.2022 00:44)
- constexpr применительно к функции не гарантирует её вычисление в
компайлтайме. Только для переменной. Вот смотрите несколько
интересных примеров: VladislavS.(1362 знак., 01.10.2022 23:29, картинка, картинка)
- const применительно к функции не дает того эффекта как constexpr, и
оптимизация в итоге получается не такой эффективной. Правда я не
уверен что компилятор С++ будет рассматривать const как constexpr.
Хотя, const еще влияет на размещение (ОЗУ-ПЗУ), для контроллеров
это существенно. А как constexpr влияет? - AlexBi(01.10.2022 22:15)
- LTO и на С коде работает. А const и constexpr это из разной оперы.
В тех местах где вместо constexpr можно написать const разницы в
результате не будет никакой. Единственную пользу, которую можно
поиметь от компилирования С-кода компилятором С++, это более
строгий контроль типов. Ну и синтаксические плюшки кое-где. - VladislavS.(01.10.2022 15:28)
- const будет практически constexpr, плюс LTO - AlexBi(01.10.2022 14:48)
- Какие плюсы оптимизатора ожидаете на том же коде? Почему результат
должен стать другим? - VladislavS.(01.10.2022 14:36)
- Unix way! - SciFi(01.10.2022 10:29)
- +100. Также как вредны пустые абстракции, вредны и попытки писать
все-все в одном семантическом поле. - Cкpипaч(01.10.2022 12:04)
- Глупость несусветная. Вот в примере с таблицей синусов, если вам
нужно другое количество точек в таблице или другая точность/тип
данных, какие будут ваши действия? - VladislavS.(01.10.2022 14:10)
- таблица синусов - частный пример таблиц, заливаемых во флеш. их
особенность - достаточно простая вычисляемость. а что если таблица
зависит от внешних данных? а что если формулу расчёта хрен напишешь
в десяток строк? Mahagam(397 знак., 01.10.2022 15:16)
- Чувствуете разницу между сложной вычислительной задачей по
подготовке данных и написанием внешней программы на каждый чих? - VladislavS.(01.10.2022 15:35)
- и часто вы чихаете? ну, в смысле - часто вы там таблицы через
constexpr заполняете? не надо частный и достаточно редкий случай
приводить аки невероятное превосходство "а вы так не умеете". - Mahagam(01.10.2022 16:08)
- Не "вы так не умеете", а "возможности языка не позволяют". Как говорится, почувствуйте разницу. И да, формирование наборов константных данных достаточно распространённая задача: вышеупомянутая таблица синусов, таблицы перекодировки самые разные, табличная конвертация цветовых пространств, масштабирование и поворот шрифтов, USB дескриптопы и т.д. - VladislavS.(01.10.2022 21:59)
- Во-первых, чих далеко не каждый. Во-вторых, для ымбеддера безусловно полезно уметь встраивать в процесс сборки внешние скрипты, просто чтобы быть готовым ко всему. Так что этот аргумент скорее за скрипты. - SciFi(01.10.2022 15:37)
- и часто вы чихаете? ну, в смысле - часто вы там таблицы через
constexpr заполняете? не надо частный и достаточно редкий случай
приводить аки невероятное превосходство "а вы так не умеете". - Mahagam(01.10.2022 16:08)
- Чувствуете разницу между сложной вычислительной задачей по
подготовке данных и написанием внешней программы на каждый чих? - VladislavS.(01.10.2022 15:35)
- Мои действия будут дословно такие же - переписать программу
генерации таблицы. И код, который с таблицей работает. - Cкpипaч(01.10.2022 15:08)
- То есть, надо держать под рукой ещё одну среду разработки? - VladislavS.(01.10.2022 15:37)
- В последнее время скриптами резал bmp с буквами на шрифты, собирал
прошивку из кусков с добавлением серийника и мак, обфурцировал и
зажимал html. Сомневаюсь, что тут мне помогли бы constexp. Зато на
хабре постоянно споры как на плюсах проще светляком помигать с
текстом проги на пару страниц. Может в мегапроектах это и
оправданно, но в небольших проектах это простыни малочитаемого
текста. - Andreas(01.10.2022 14:41)
- Выполнять сложные разовые задачи типа "резать bmp" с помощью
сложного кода нерационально, хотя и возможно. Какие трудности из
одного большого массива сделать несколько маленьких в constexpr?
Никаких. А вот потом эти буквы повернуть/масштабировать/и т.д. в
constexpr милое дело. Сложный код имеет смысл писать для часто
выполняемых задач. Дрыганье ногами/мигание светиком есть в 99%
проектов. Как в больших, так и в малых. Почему бы не сделать его
удобным и эффективным? Почему вас VladislavS.(472 знак., 01.10.2022 15:27)
- На голых сях это проще и нагляднее выходит. Gpio_set, gpio_reset, gpio_enable - просто пишется, просто используется, просто портируется на другое семейство. Возможно в чуть более сложные действиях, типа мигания, можно сделать удобнее абстракцию от железа, но на том же хабре почему-то это выливается тоже в многостраничный мрак. - Andreas(01.10.2022 16:13)
- Спагетти-данные как изысканная приправа к спагетти-коду :) - Cкpипaч(01.10.2022 15:34)
- Я опять должен был не заметить? - VladislavS.(01.10.2022 15:39)
- Выполнять сложные разовые задачи типа "резать bmp" с помощью
сложного кода нерационально, хотя и возможно. Какие трудности из
одного большого массива сделать несколько маленьких в constexpr?
Никаких. А вот потом эти буквы повернуть/масштабировать/и т.д. в
constexpr милое дело. Сложный код имеет смысл писать для часто
выполняемых задач. Дрыганье ногами/мигание светиком есть в 99%
проектов. Как в больших, так и в малых. Почему бы не сделать его
удобным и эффективным? Почему вас VladislavS.(472 знак., 01.10.2022 15:27)
- Не волнуйтесь, справимся. Кстати, вы заметили, как подход
оппонентов вы назвали глупостью, а в сторону вашего подхода никаких
комков грязи не летело? - SciFi(01.10.2022 14:17)
- Ну как же, не заметил? Заметил. Вредными назвали. Причём
безапелляционно. Действительно, зачем какие-то доводы или примеры
приводить? Вбросим и авторитетом затопчем. Так не работает. - VladislavS.(01.10.2022 14:39)
- У меня к плюсам одна главная претензия: они огромно-монструозны, к
тому же продолжают расти не по дням, а по часам. Скоро в тему
плюсов смогут входить только те, кто готовы посвятить этой теме
бОльшую часть жизни. Ну или просто шибко заточенные под такую
деятельность. Это непрактично. Ну а про преимущества Unix way
можете просто погуглить, если интересно. - SciFi(01.10.2022 14:44)
- Это преувеличение. Прям таки больших и сложных расширений языка
было всего несколько. Раз в 3 года заглянуть "что там новенького"
не сложно. И каждое нововведение не просто с потолка сваливается, а
то что необходимо для работы и достаточно легко принимается. - VladislavS.(01.10.2022 16:06)
- "Всего несколько раз"? И это лишь "больших и сложных"? Вы блестяще подтвердили мой тезис :-) - SciFi(01.10.2022 16:10)
- Это преувеличение. Прям таки больших и сложных расширений языка
было всего несколько. Раз в 3 года заглянуть "что там новенького"
не сложно. И каждое нововведение не просто с потолка сваливается, а
то что необходимо для работы и достаточно легко принимается. - VladislavS.(01.10.2022 16:06)
- У меня к плюсам одна главная претензия: они огромно-монструозны, к
тому же продолжают расти не по дням, а по часам. Скоро в тему
плюсов смогут входить только те, кто готовы посвятить этой теме
бОльшую часть жизни. Ну или просто шибко заточенные под такую
деятельность. Это непрактично. Ну а про преимущества Unix way
можете просто погуглить, если интересно. - SciFi(01.10.2022 14:44)
- Ну как же, не заметил? Заметил. Вредными назвали. Причём
безапелляционно. Действительно, зачем какие-то доводы или примеры
приводить? Вбросим и авторитетом затопчем. Так не работает. - VladislavS.(01.10.2022 14:39)
- таблица синусов - частный пример таблиц, заливаемых во флеш. их
особенность - достаточно простая вычисляемость. а что если таблица
зависит от внешних данных? а что если формулу расчёта хрен напишешь
в десяток строк? Mahagam(397 знак., 01.10.2022 15:16)
- Глупость несусветная. Вот в примере с таблицей синусов, если вам
нужно другое количество точек в таблице или другая точность/тип
данных, какие будут ваши действия? - VladislavS.(01.10.2022 14:10)
- +100. Также как вредны пустые абстракции, вредны и попытки писать
все-все в одном семантическом поле. - Cкpипaч(01.10.2022 12:04)
- А если программу на С компилировать как С++, получив при этом все
плюсы оптимизатора, это будет уже С++? - AlexBi(01.10.2022 14:33)
- О чём я и говорил. Конфигураторы/скрипты/утилиты наше всё. Вернее
ваше. - VladislavS.(01.10.2022 10:03)
- Вот с таких применений и можно начать. А я могу выступить
подопытных кроликом, который умеет в железки и в С, но о С++ только
по верхушкам. - Dingo(01.10.2022 03:53)
- Ну так всё
украденонаписано. Кто за православный выступает? VladislavS.(18 знак., 01.10.2022 06:33, ссылка)- Он это на этапе компиляции делает? от какой версии С++ нужен? - Dingo(01.10.2022 07:47)
- Конечно на этапе компиляции - массивы sin_table объявлены constexpr. С++17 хватит. - VladislavS.(01.10.2022 08:10)
- Он это на этапе компиляции делает? от какой версии С++ нужен? - Dingo(01.10.2022 07:47)
- Ну так всё
- Он ещё и кофе не умеет готовить. И это прекрасно! SciFi(65 знак., 01.10.2022 09:54)
- ;) symbions(16 знак., 01.10.2022 00:33)
- А можете на Цэ, к примеру, таблицу синусов во флэш сформировать? - VladislavS.(01.10.2022 01:41)
- С++ для эмбеддерства это всё равно что чернила для пятого класса.
Если вы понимаете как работает язык, то без всяких умных книжек не
будете в контроллерах применять контейнеры с эллокаторами, rtti,
исключения и виртуальные методы, а пустите в ход шаблоны, constexpr
и метапрограммирование. - VladislavS.(01.10.2022 01:05)
- Вот так хорошая книга о С++ для эмбедерства и никак не напишется :/ - symbions(30.09.2022 23:35)
- Статья, в отличии от пятничного трёпа, требует времени. На просто
почитать есть пример кода, который ни одним макросом не напишете. VladislavS.(98 знак., 30.09.2022 17:37, ссылка)
- Упадочный стиль! Декаданс! Характерными чертами декадентства обычно
считаются отход от общественности и отвращение к повседневной жизни
(taedium vitae), что проявляется в искусстве отрывом от реальности, поэтикой искусства для искусства, эстетизмом, модой на демонизм , преобладанием формы над содержанием, стремлением к внешним эффектам, стилизации и так далее. IBAH(1 знак., 30.09.2022 17:22, ссылка)
- ЧТД. Затопчут автритетом. - VladislavS.(30.09.2022 17:25)
- Пишите статью и ссылку сюда. "Ябпочитал" - Dingo(30.09.2022 17:22)
- Вы просто не умеете его готовить. Я бы мог бесконечно показывать
примеры, но это непробиваемо. Сразу авторитетно докажут, что у них
для этого есть конфигуратор/скрипт/утилита и это тру вэй.
Проходили. - VladislavS.(30.09.2022 17:01)
- Проблема с терминологией. Где заканчивается "Си с классами" и
начинаются плюсы? Имхо, подходы в плюсах(в Си с классами ) в
некотором роде конечно удобнее, но все прекрасно реализуется на
теплом-ламповом Си. А все эти метапрограммирования в топку. Что и
иллюстрирует картинка ТС . - IBAH(30.09.2022 16:55)
- Бывает и выпендрёжь, конечно, но не обязательно. Ну просто есть
кого-то рабочик код на плюсах, не переписывать же его для форума
специально. - VladislavS.(30.09.2022 16:49)
- Это из серии "Смотри как я могу!" - IBAH(30.09.2022 16:47)
- Не замечал. Возможно, бывает, кто-то выкладывает примеры кода по
целевому вопросу на плюсах, вызывая тем самым непонимание у
собеседников, тогда может начаться срач. - VladislavS.(30.09.2022 16:35)
- ещё раз. тут практически не наблюдалось тем с языковыми вопросами.
при этом форум - весьма живой. что при этом обсуждают - можете сами
полистать и посмотреть. а тематические форумы, где собираются
преимущественно пищущие на плюсах, на 90% засраны чисто языковыми
вопросами. - Mahagam(30.09.2022 16:29)
- А как обсуждение целевых задач связано с языком? В каком регистре
какой бит установить вообще языконезависимый вопрос. Как вы
понимаете С или С++ разработчик обсуждает целевой вопрос? - VladislavS.(30.09.2022 16:23)
- здесь вот как раз и обсуждали целевые задачи. потому что языковых
проблем было совсем немного. - Mahagam(30.09.2022 16:18)
- А кому интересны МОИ целевые задачи? А вот языковые фишки у всех
одинаковые. А так как назвать их простыми для понимания нельзя, вот
и обсуждают. - VladislavS.(30.09.2022 16:15)
- Никто бы и не возражал, если бы качественная плюсовая либа шла от
производителя. Но она Си'шная. - =AlexD=(30.09.2022 16:07)
- Прям таки качественная и от производителя? - VladislavS.(30.09.2022 16:09)
- Ну да, некачественная и Си уже есть, ей все и пользуются. Если
добавлять сложности в изучении языка, это должно чем-то
компенсироваться, и не самописанием доморощенных либ точно. - =AlexD=(30.09.2022 16:11)
- По опыту общения с эбеддерами владеющими плюсами на уровне "выше
среднего", они и железо знают лучше и библиотеки более качественные
делают. - VladislavS.(30.09.2022 16:20)
- Не сомневаюсь. Я сам такой :-). Но решают не спецы, решает "корпоративный стандарт". - =AlexD=(30.09.2022 16:24)
- По опыту общения с эбеддерами владеющими плюсами на уровне "выше
среднего", они и железо знают лучше и библиотеки более качественные
делают. - VladislavS.(30.09.2022 16:20)
- Ну да, некачественная и Си уже есть, ей все и пользуются. Если
добавлять сложности в изучении языка, это должно чем-то
компенсироваться, и не самописанием доморощенных либ точно. - =AlexD=(30.09.2022 16:11)
- Прям таки качественная и от производителя? - VladislavS.(30.09.2022 16:09)
- да как только обрастаешь любой библиотекой - скорость работы
возрастает. но на форумах плюсовики нихрена не обсуждают целевые
задачи, а только и обсуждают лямбды, монады, виртуальные функции и
прочую чисто языковую ересь. - Mahagam(30.09.2022 16:10)
- На самом деле работа добавляется только в начале. Как только вы
обрастаете библиотекой классов скорость разработки сильно
вырастает. - VladislavS.(30.09.2022 16:05)
- а если так funk(){static B b; }. Конструктор вызовется при первом
вхождении в блок? - IBAH(30.09.2022 15:43)
- Композиция. Сверху вниз и слева направо. - Cкpипaч(30.09.2022 14:25)
- Непонятно только когда пора новый слой выделять - Dingo(30.09.2022 17:24)
- Перечитайте еще раз "фейковое" интервью со Столлманом. Делайте это
регулярно и помните - проектировать ПО нужно "сверху вниз". - Cкpипaч(30.09.2022 17:30)
- Не ответ. И даже не пояснение. Полагаю, вы так и задумывали. - Dingo(30.09.2022 17:32)
- "Слои" определяются только и исключительно прикладной задачей.
Каждый "переход" это как начать говорить на другом языке - в этом
должен быть железобетонный резон. Большинство программистов
страдаютнаслаждаюстся созданием "пустых абстракций" - нафиг не нужных промежуточных языков, якобы для упрощения. Cкpипaч(128 знак., 30.09.2022 17:37)- Теперь - да. - Dingo(30.09.2022 17:42)
- "Слои" определяются только и исключительно прикладной задачей.
Каждый "переход" это как начать говорить на другом языке - в этом
должен быть железобетонный резон. Большинство программистов
- Не ответ. И даже не пояснение. Полагаю, вы так и задумывали. - Dingo(30.09.2022 17:32)
- Перечитайте еще раз "фейковое" интервью со Столлманом. Делайте это
регулярно и помните - проектировать ПО нужно "сверху вниз". - Cкpипaч(30.09.2022 17:30)
- Слово то какое мудреное... - IBAH(30.09.2022 15:45)
- Ну-то по-проще чем инкапсуляция :) - Cкpипaч(30.09.2022 17:45)
- Непонятно только когда пора новый слой выделять - Dingo(30.09.2022 17:24)
- Сразу не понял вопрос. Первыми будут вызваны конструкторы членов
класса, затем конструктор объединяющего класса. Этот код выведет
АB. VladislavS.(148 знак., 30.09.2022 15:18)
- Если бы я бросил пить... Не гулял с друзьями... Не танцевал, не тратил столько времени на женщин... Был бы усидчив... Я бы писал, читал, рассчитывал, изучал, чертил, брал на дом работу, искал темы, подмечал острым глазом, изобретал, выступал в журналах, сидел ночами. Что-то открыл бы. От долгого сидения. Защитил бы докторскую, получил бы премию... И уже тогда гулял бы с друзьями, и танцевал, и тратил много времени на женщин. Что я сейчас и делаю без этих хлопот! - IBAH(30.09.2022 14:10)
- C июля плотно занимаюсь исправлением чужого кода на С++. С
удивлением вчера обнаружил, что вот это стало мне прекрасным :) symbions(40 знак., 30.09.2022 08:15, youtube)
- А мне не стало. Tyмблep(246 знак., 30.09.2022 15:00)
- Значит Вам надо увеличить дозу С++ :) - symbions(30.09.2022 23:37)
- Это невозможно. Tyмблep(109 знак., 02.10.2022 02:39)
- насколько? Mahagam(1 знак., 30.09.2022 23:42, картинка)
- Класс! - Codavr(03.10.2022 10:32)
- Значит Вам надо увеличить дозу С++ :) - symbions(30.09.2022 23:37)
- ДО 11 го было прекрасно. Дальше начался синтаксический сахар,
кардинально ухудшающий чтение и понимание чужого кода. - POV(30.09.2022 10:41)
- Начиная с С+17 самый смак для эмбеддеров начался. - VladislavS.(30.09.2022 12:20)
- Эмбеддеры, это не только "линукс эмбеддед". В 90% задача даже с толстым процом плюсы не требуются. А по моему мнению даже и вредны... POV(41 знак., 30.09.2022 16:12)
- Тут кто-то (кажется Клен) говорил,чтоб эмбеддер учили С++ и пример
приводил. Вот когда я разгребал чужо код как его вспоминал, как
хотелось бы, чтобы кто-то переписал в стиле, что Клен показал Но
сам не умею, ещё по крайней мере :) - symbions(30.09.2022 13:50)
- Ну, я тоже приводил. Обозвали наркоманом :) - VladislavS.(30.09.2022 14:03)
- Наверное правильно - первая доза бесплатно, а с третьей привыкание
:) У меня как раз третья :) - symbions(30.09.2022 23:40)
- Тогда вам должен класс TypeList понравиться. Дюже забористый. VladislavS.(2 знак., 01.10.2022 08:27, ссылка)
- Мне пока и этого хватает :) symbions(1 знак., 01.10.2022 09:31, ссылка)
- Ну тут то вообще всё просто - лямбда используется как аргумент
constexpr конструктора. - VladislavS.(01.10.2022 09:50)
- Самое жуткое, что я Вас понял. Но понимать - не значить владеть. Впрочем - дело практики - symbions(01.10.2022 10:47)
- Ну тут то вообще всё просто - лямбда используется как аргумент
constexpr конструктора. - VladislavS.(01.10.2022 09:50)
- Мне пока и этого хватает :) symbions(1 знак., 01.10.2022 09:31, ссылка)
- Тогда вам должен класс TypeList понравиться. Дюже забористый. VladislavS.(2 знак., 01.10.2022 08:27, ссылка)
- Наверное правильно - первая доза бесплатно, а с третьей привыкание
:) У меня как раз третья :) - symbions(30.09.2022 23:40)
- Ну, я тоже приводил. Обозвали наркоманом :) - VladislavS.(30.09.2022 14:03)
- Начиная с С+17 самый смак для эмбеддеров начался. - VladislavS.(30.09.2022 12:20)
- А мне не стало. Tyмблep(246 знак., 30.09.2022 15:00)
- Вроде не пятница VladislavS.(1 знак., 29.09.2022 12:05, картинка)
- Аж захотелось достать из пыльной коробочки ATTiny11 и наваять
блинков на плюсах:) Vit(1 знак., 29.09.2022 22:03, картинка)
- Класс "регистр", экземпляры прописаны в "Memory map"(наверное, давно не открывал), функцыи класса прописаны в "Instruction set" мануала. Походу, я большую часть карьеры был ЦПП погромистом! - mse homjak(29.09.2022 22:25)
- плюсы без стека выживут? три уровня не в счёт - m16(29.09.2022 22:14)
- Во-первых, плюсы выживут вообще без контроллера, так как умеют в
компайлтайме выполнять код. Во-вторых, на плюсах можно методы
писать в описании класса и получать код из одних заголовочных
файлов, что облегчает встраивание кода и экономию стека. Так что,
как ни крути, одни плюсы. - VladislavS.(30.09.2022 06:27)
- Вместо работы с задачей изучаем инструмент. - Dingo(30.09.2022 17:30)
- Почему вместо? - VladislavS.(30.09.2022 17:44)
- потому что у ATTiny11 аппаратный трёхуровневый стек - m16(30.09.2022 18:16)
- Стек то тут причём? - VladislavS.(30.09.2022 18:29)
- В руководстве Атмел по тини15 (может 12 - не помню) явно
указывалось, что стек 3 уровневый и с этим связана сложность
написания программ на С. Я так думаю, это было связанос тем, что не
всякий компилятор сможет правильно передать параметры функции при
вызове - они же обычно через стек передаются - а тут надо в стек
только адрес возврата ложить. - symbions(30.09.2022 23:44)
- Параметры, если их не много, через регистры передаются. Результат
возвращается тоже. На стеке всякие локальные переменные создаются.
Ну так это хоть с плюсАми, хоть с минусАми так. Там где на С можно
утоптаться на С++ и подавно. - VladislavS.(01.10.2022 00:48)
- То, что для подобных ATtiny компилятора C++ в природе нет не
смущает никак? - AlexG(01.10.2022 03:22)
- Не знаю кто такие подобные, а для AVR есть GCC и IAR. Последний
что-то типа С++14 поддерживает, а вот GCC С++20 легко. - VladislavS.(01.10.2022 06:53)
- По последним данным "The compiler supports all C++17 features. The
C++ library supports C++14 with no C++17 additions. (Latest version
only)." ЫЫyкпy(436 знак., 01.10.2022 08:43)
- Для ARM IAR поддердивает С++17 полностью. С версии 9.30.1 и в библиотеках. - VladislavS.(01.10.2022 09:13)
- Подобные ATtiny11, это с аппаратным стеком и без ОЗУ. Компилятор Си
для них один - ImageCraft. IAR и GCC использовать можно только
совершенно нештатными способами, поддержки этих МК нет. - AlexG(01.10.2022 07:19)
- Да, вы правы, напрямую С++ для этих контроллеров не использовать. Собственно, как и С. Так что, тут ни вашим, ни нашим. - VladislavS.(01.10.2022 08:20)
- По последним данным "The compiler supports all C++17 features. The
C++ library supports C++14 with no C++17 additions. (Latest version
only)." ЫЫyкпy(436 знак., 01.10.2022 08:43)
- Не знаю кто такие подобные, а для AVR есть GCC и IAR. Последний
что-то типа С++14 поддерживает, а вот GCC С++20 легко. - VladislavS.(01.10.2022 06:53)
- То, что для подобных ATtiny компилятора C++ в природе нет не
смущает никак? - AlexG(01.10.2022 03:22)
- Параметры, если их не много, через регистры передаются. Результат
возвращается тоже. На стеке всякие локальные переменные создаются.
Ну так это хоть с плюсАми, хоть с минусАми так. Там где на С можно
утоптаться на С++ и подавно. - VladislavS.(01.10.2022 00:48)
- В руководстве Атмел по тини15 (может 12 - не помню) явно
указывалось, что стек 3 уровневый и с этим связана сложность
написания программ на С. Я так думаю, это было связанос тем, что не
всякий компилятор сможет правильно передать параметры функции при
вызове - они же обычно через стек передаются - а тут надо в стек
только адрес возврата ложить. - symbions(30.09.2022 23:44)
- Стек то тут причём? - VladislavS.(30.09.2022 18:29)
- потому что у ATTiny11 аппаратный трёхуровневый стек - m16(30.09.2022 18:16)
- Почему вместо? - VladislavS.(30.09.2022 17:44)
- Вместо работы с задачей изучаем инструмент. - Dingo(30.09.2022 17:30)
- По сравнению с MC14500B в тиньке ресурсов просто завались:). Стек
на GPIO замутим:) - Vit(29.09.2022 22:24)
- ))) - m16(29.09.2022 22:36)
- Во-первых, плюсы выживут вообще без контроллера, так как умеют в
компайлтайме выполнять код. Во-вторых, на плюсах можно методы
писать в описании класса и получать код из одних заголовочных
файлов, что облегчает встраивание кода и экономию стека. Так что,
как ни крути, одни плюсы. - VladislavS.(30.09.2022 06:27)
- Или так --> Solo(1 знак., 29.09.2022 13:51, картинка)
- было бы что набрасывать Mahagam(1 знак., 29.09.2022 16:18, картинка)
- Аж захотелось достать из пыльной коробочки ATTiny11 и наваять
блинков на плюсах:) Vit(1 знак., 29.09.2022 22:03, картинка)
- Ещё уточнение: получается, можно мешать без проблем при передаче
линковщику объектники в одном проекте С и С++, если смогу среде
разработки объяснить, как из компилировать? - Dingo(06.10.2022 06:56)