Перейти к содержанию
    

Как ПРАВИЛЬНО программировать на С++

Мне кажется, всётаки, что сравнение переходов ASM->C и C->C++ некоректно. Так как первый решает главную задачу - убирает зависимость программиста от процессора (не от переферии). Эта задача глобальна для эмбеддера. И эта задача решается как академически так и практически. Соответственно повышается переносимость, возможность заимствований. Вроде бы переход C->C++ академически решает те же задачи. Но, на мой взгляд дальнейшие шаги в данной области целесообразны лишь при однотипных задачах.

Например, если программист непрерывно работает с графикой, то лучше потратить кучу времени написать и вылизать соответствующие классы работы с графикой. Но если он сегодня работает с ШД, а завтра с CAN, а послезавтра с графикой, то возникают нюансы.

Собственно эти нюансы просты. Написал я свои классы на тему конечных автоматов - потратил время. Вылизал - потратил время. А далее написал 10 проектов никакого отношения к этому не имеющещих. Через 2 года у меня появилась тема где, казалось бы можно применить наработки по конечным автоматам. И что будет? Я потрачу минимум неделю чтобы всё вспомнить и проникнуться высоким уровнем моих наработок, ещё неделю чтобы соотнести то решение с новым проектом. Естественно выяснится, что в чистом виде это чуть-чуть не подходит. И надо добавить пару новых свойств и чуть подправить реализацию. Причём лучше это сделать так, чтобы новый класс работал бы и со старым приложением. Надо честно признаться (хотя бы себе), что создавать новый класс, производный от старого, учитывая что старый писали тоже вы и, учитывая, что вы просто не учли вот этот вот нюанс, что вылез в новом проекте, вы не станете. Далее вам опять придётся проникнуться всеми нюансами разработки вашего класса, опять потребуется время для написания и отладки, чтобы через год-два вам мифически было бы проще всё это использовать.

Конечно, можно сказать что это произойдёт в случае низкого уровня программиста. А я вам возражу, что в случае низкого уровня программиста этот класс придётся переписать заново, а не чуть-чуть подправить.

 

По-моему, С++ это всётаки удел крупных контор с большим коллективом программистов, с чётким разделением задач, с проектами близкой направленности, с хорошей документированностью наработок и т.д и т.п. Пытаться одному программисту "охватить необъятное" (читай ... изучить и использовать все новейшие течения в области программирования) будет провальным. Из-за физической невозможности.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В своей практике стараюсь сделать примеры применения своего "творчества", чтобы легче передавалось по наследству и самому быстрее въезжать, что наваял лет пять тому назад. Времени и терпения писать документацию по своим наработкам в 99% случаев не хвататет, поэтому примеры применения с коментариями выручают. Какой язык программирования при таком подходе уже не имеет значения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В чем же она заключается, наивность-то?

 

:bb-offtopic:

А Вы давно покупали книги по электронике/программированию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в чем плюс то голого сишного подхода? Никто не спорит, что все, что пишется на С++, можно сделать и на Си.

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

Вопрос - какими средствами и какой надежностью.
Сисадмин говорит, что предыдущая инкарнация нашего сервера под FreeBSD имела аптайм 3.5 года и была обновлена из-за переезда на новое железо.

 

Применительно к встраиваемым системам - посчитайте сколько процентов занимают данные и сколько алгоритмы. Нужно ли затевать ради этого мизера пляски с ООП? Вот в прикладных задачах С++ безусловно имеет преимущество благодаря возможностям инкапсуляции, наследования, да и просто более жесткой типизации.

 

Ну и классика сравнения этих языков для встраиваемых систем: "есть два пути: можно грамотно использовать все возможности C либо ограниченный набор возможностей C++" - кто сказал это не помню, но сказано верно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:bb-offtopic:

А Вы давно покупали книги по электронике/программированию?

Если я вижу стоющую книгу, я её покупаю не задумываясь, на конторские деньги либо на свои.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

offtop

 

А вы никогда не слышали как Торвальдс критикует микроядра? :) :bb-offtopic:

 

 

Авторитет Торвальдса все-таки сильно завышен. Нет, разумеется он молодец - написать свою до конца работоспособную ОС-ку еще в студенческие годы(когда вечно не хватает времени) и "раздать ее людям"... Но... Если задуматься - студенческую ОС без прикладного софта напарить можно разве что тем людям которые профинансировали "сапфировые носители" для украинской центральной библиотеки. Да и писать UNIX, пусть и самобытный, по книжке это не одно и то же, что придумать UNIX. Чувствуете разницу?

 

В те далекие годы столменовский GNU и "опенсоус" набирали силу, появился GCC - который на данный момент, что бы там не говорили, является одним из лучших компиляторов. А что произошло бы если "опенсорщики" подхватив самые конструктивные идеи общими стараниями создали бы еще и ОС без изъянов? Не создали... И поныне... И именно благодаря Линусу и его Linux'у. Если какое-то из социальных потрясений не остановить - его нужно возглавить? Так? Кто и когда решил сделать ставку на архитектурную быдло-поделку - а первые версии ядра ну ничегошеньки из ряда вон выходящего не демонстрировали - навсегда останется под покровом тайны. Но факт фактом. И здесь понемногу начинает закатываться звезда Столмена - эдакого эксцентричного мечтателя и восходит Торвальдса - жизнерадостного практика со здоровым видом. Хм :rolleyes: , есть над чем задуматься... Даже в каком-то документальном фильме видел сценку - Столмена награждают премией Линукса - на что он сам в ответ язвит "Ха, это все равно что Хан Соло награждал бы премией Альянс Повстанцев" (прочтите эту фразу несколько раз... и подумайте)...

 

Я когда-то Вам, sigmaN, не ответил(не было времени на развернутый ответ) что-же быдлокодерского в Линуксе. В самом коде - качественно ничего. Но в архитектуре - это "в лоб" написаный UNIX переживший несколько конструктивных потрясений. Ну каГбЭ бульварный роман написанный на безупречном русском ;) .

 

Кстати темные силы мировой закулисы не столь коварны(там точно нет русских или украинцев - иначе голову Столмена нашли бы под Белой Церковью, в лесу, делов то :) ) сколь дальновидны. Ни для кого не секрет, что дикие народности типО иранцев, украинцев, русских и китайцев беззастенчиво используют свободное ПО (которое писАли люди со всего мира) в том числе и в военной технике. Не повод ли задуматься - а стОит ли при этом "раздавать" самое лучшее ;) ...

 

P.S.: да, я сторонник теории заговоров и не стыжусь этого :tongue: ...

 

P.P.S.: "диким народностям" стоит задуматься, что не все "свободное ПО" одинаково полезно :biggrin: , и верные инвестиции сеодня(инвестиции интеллекта в том числе) завтра могут обернуться качественным(ключевым) преимуществом в целой отрасли. Это на просто на каждом углу кричать "о, свободное ПО... а-а-а-а...у-у-у-у... э-э-э-э... Покупайте наше свободное ПО" :biggrin: :rolleyes: ...

 

P.P.P.S.: готов поспорить, что та же история и с т.н. "нейронными сетями" - как по мне, то это "каша из топора". Жаль, что это уж совсем-совсем оффтоп...

 

end_offtop

linux_0.01.tar.gz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блни, а зря оффтоп прикрыли.

Вот щас про Торвальдса потроллить бы, а))))

 

Сисадмин говорит, что предыдущая инкарнация нашего сервера под FreeBSD имела аптайм 3.5 года и была обновлена из-за переезда на новое железо.

Прям 3.5года без единого ребута??? Я в восторге!

 

Лично я абсолютно согласен с Торвальдсом, что такие вещи как ядро ОС на С++ лучше не писать.И аргументирует он своё мнение.

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

А ещё Торвальдс правильно сказал как-то что-то типа: компиляторы, языки - всё это инструменты в наших руках и если мы будем идти на поводу у своих инструментов или не делаем чего-то, потому что нам не позволяют наши инструменты, то как-бы пора бы может быть нам сменить профессию или поменять инструменты. (как-то так, за достоверность не ручаюсь)

Но, конечно, тема вообще холливарная пошла....завязывать надо..

 

P.S. Без оффтопа жить тяжело. Чё, мож и вправду на шараге зарегиться...... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Один мой знакомый говорит что типа забивать гвозди можно и ноутбуком... Конечно, он на много круче, чем обычный молоток, но... улавливаете мысль, нам то гвоздь забивать надо и в деле забивания гвоздя - молоток зэ бэст.
Сравнение некорректно. Ноутбук изначально не предназначен для забивания гвоздей. Есть такие специальные пневматические молотки, для которых гвозди выпускаются в кассетах. Вот это больше похоже - можно с чувством, не спеша, накачивая мышцу забивать ручным молотком, а можно нажав кнопку загнать пневматическим. Плата - стоимость инструмента (читай - необходимость изучать С++) и несколько более высокая стоимость гвоздей в кассете по сравнению с гвоздями россыпью в ящике (читай - некоторые накладные расходы типа кода вызова конструкторов). Но если покупать гвозди не по одинаковому количеству, а, скажем, закупить количество гввоздей, которое можно забить за час одним и вторым инструментом, то выясняется, что это количество гвоздей в кассетах уже подходит под понятие "мелкий опт" и по мелкооптовым ценам гвоздь даже с дополнительной кассетой стоит дешевле, чем гвоздь без кассеты по розничным. Вот такое сравнение мне кажется более похожим на C/C++.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прям 3.5года без единого ребута??? Я в восторге!

Поскольку он периодически хвастался растущим аптаймом, то на 3 году я решил поинтересоваться "а не зря ли мы его кормим" (имелся в виду сисадмин). Действительно, uptime был за тысячу с лишним дней, все порты были аккуратно обновлены и даже пересобраны некоторые системные библиотеки и демоны. Но ядро оставалось прежним и перезагрузок не требовалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа/Товарищи/Эмбеддеры/Радио коты (нужное подчеркнуть), я таки худо-бедно да дописал ранее обещенную статью про организацию ввода-вывода для МК семейства AVR на Си++.

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

Конструктивные комментарии/замечания/пожелания приветствуются.

CppGpioForAvr.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа/Товарищи/Эмбеддеры/Радио коты (нужное подчеркнуть), я таки худо-бедно да дописал ранее обещенную статью про организацию ввода-вывода для МК семейства AVR на Си++.

Отличная статья!

И намного нагляднее, чем 6 страниц руками махать.

Рекомендую разместить в разделе статей.

Обсуждение здесь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конструктивные комментарии/замечания/пожелания приветствуются.
Опенофис показал множество опечаток. Периферия пишется через "е" - это сразу бросилось в глаза. Продолжаю читать.

 

#define PortaBits (*((Bits*)&PORTA))

пропущен volatile

 

    static void Set()
    {
        *(uint8_t*)(PORT + __SFR_OFFSET) |= (1 << PIN);
    }

Снова пропущен volatile

 

    typedef TPin<Porta, 0> Pa0;

....
    Pa0.SetDirWrite(); // <- разве тут не должно быть Pa0::SetDirWrite() ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void LCDwrite4(uint8_t value)
{
    LDP &= ~(1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4); //clear data bus
    
    if(cmd & (1 << 0))
        LDP |= LCD_D4;
    if(cmd & (1 << 1))
        LDP |= LCD_D5;
    if(cmd & (1 << 2))
        LDP |= LCD_D6;
    if(cmd & (1 << 3))
        LDP |= LCD_D7;
}

 

В аргументе фукции value на cmd замените.

А вообще-то отличная статья,спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...