Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Embedded C++.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Я хочу выучить С++ под ембедед. Подскажите какие нибудь он лайн курсы или другой материал. Хотелось бы также посмотреть готовые проекты на С++ чтоб прочувствовать все аспекты.
Onkel
Цитата(Jenya7 @ May 22 2016, 09:49) *
Я хочу выучить С++ под ембедед. Подскажите какие нибудь он лайн курсы или другой материал. Хотелось бы также посмотреть готовые проекты на С++ чтоб прочувствовать все аспекты.

easyelectronics
Jenya7
Цитата(Onkel @ May 22 2016, 15:11) *
easyelectronics

спасибо. там действительно хорошие статьи по С++. плохо что в разброс.
Slash
Цитата(Jenya7 @ May 22 2016, 10:49) *
Я хочу выучить С++ под ембедед. Подскажите какие нибудь он лайн курсы или другой материал. Хотелось бы также посмотреть готовые проекты на С++ чтоб прочувствовать все аспекты.

С++ в embedded обычный, поэтому изучайте по любой книге. Специфика embedded в ограниченности ресурсов, поэтому нужно отчетливо понимать "сколько стоит" та или иная языковая конструкция.
К примеру, RTTI - тяжелая вещь, ее не применяют в первую очередь (хотя можно, если хочется).
https://vk.com/wall-112797241_4
https://vk.com/wall-112797241_104?w=away-112797241_104
https://vk.com/wall-112797241_147
AlexandrY
Цитата(Slash @ May 23 2016, 03:01) *
С++ в embedded обычный, поэтому изучайте по любой книге. Специфика embedded в ограниченности ресурсов, поэтому нужно отчетливо понимать "сколько стоит" та или иная языковая конструкция.
К примеру, RTTI - тяжелая вещь, ее не применяют в первую очередь (хотя можно, если хочется).
https://vk.com/wall-112797241_4
https://vk.com/wall-112797241_104?w=away-112797241_104
https://vk.com/wall-112797241_147


Надо же!
И сколько же стоит?

Столько ссылок и все ни о чем.
Это не embedded.

Jenya7
Погуглив я обнаружил что нет нормальных обучалок по С++ именно под микроконтролеры. Так чтоб объяснили с азов и именно под микроконтролеры. Скачал пару проектов сижу разбираюсь на примерах. Не факт что эти примеры являются образцом.
Сергей Борщ
QUOTE (Jenya7 @ May 23 2016, 09:44) *
нет нормальных обучалок по С++ именно под микроконтролеры.
И чернил для второго класса тоже не выпускают...
k155la3
Цитата(Jenya7 @ May 23 2016, 09:44) *
Погуглив я обнаружил что нет нормальных обучалок по С++ именно под микроконтролеры. Так чтоб объяснили с азов и именно под микроконтролеры. Скачал пару проектов сижу разбираюсь на примерах. Не факт что эти примеры являются образцом.


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

Особенность контроллеров - мало ресурсов (оперативная память, память программ).
Соотв-но, основное отличие программирования с OOP под PC от embeded - ХОРОШО-ОПТИМАЛЬНО
продуманная-спроектированная структура данных и методов их обработки.





Цитата(Jenya7 @ May 22 2016, 09:49) *
Я хочу выучить С++ под ембедед. Подскажите какие нибудь он лайн курсы или другой материал. Хотелось бы также посмотреть готовые проекты на С++ чтоб прочувствовать все аспекты.


PS
Чтобы прочуствовать.
Возьмите простую задачу отрисовки простых граф. объектов, и действий с ними (движение, вращение, модификация формы)
И попробуйте реализоваь эту задачу на С и на C++

AlexandrY

Цитата(k155la3 @ May 23 2016, 10:38) *
Соотв-но, основное отличие программирования с OOP под PC от embeded - ХОРОШО-ОПТИМАЛЬНО
продуманная-спроектированная структура данных и методов их обработки.


Это наивное заблуждение.
Люди обычно не сидят и не продумывают.
А кодят. А потом переписывают. Это рефакторинг, он самое главное. Только так и можно что-то написать.
Поэтому С++ здесь идёт стороной, и потому никто практичных примеров для embedded на C++ показать и не может.


Цитата(k155la3 @ May 23 2016, 10:38) *
Возьмите простую задачу отрисовки простых граф. объектов, и действий с ними (движение, вращение, модификация формы)
И попробуйте реализоваь эту задачу на С и на C++


Ну так и почувствуйте. Возьмите uC/GUI написанную на чистейшем C и переведите ее на C++.
Или операционку вроде FreeRTOS и покажите что там даст C++.
biggrin.gif

Ничего не даст абсолютно кроме тормозов.
Jenya7
Я давно пишу на С. Я также пишу на С# так что знаком с ООП. Мне нужен конкретный,толковый туториал по которому можно начать писать под ембедед. Именно со спецификой ембедед. И такого я еще не нашел к сожалению.
AlexandrY
Цитата(Jenya7 @ May 23 2016, 11:29) *
Я давно пишу на С. Я также пишу на С# так что знаком с ООП. Мне нужен конкретный,толковый туториал по которому можно начать писать под ембедед. Именно со спецификой ембедед. И такого я еще не нашел к сожалению.


Ставьте компилятор IAR и там в хелпе найдете кое-что. Еще есть статьи у IAR как правильно применять embedded С++.
Но пожалейте свое время, пользы от C++ в embedded ноль.
Лучше уж портируйте .NET micro framework и продолжайте писать на C# для микроконтроллеров.
Jenya7
Цитата(AlexandrY @ May 23 2016, 14:56) *
Ставьте компилятор IAR и там в хелпе найдете кое-что. Еще есть статьи у IAR как правильно применять embedded С++.
Но пожалейте свое время, пользы от C++ в embedded ноль.
Лучше уж портируйте .NET micro framework и продолжайте писать на C# для микроконтроллеров.

я с вами согласен на 120%. но это не мои требования. есть пару проектов которые по дикому желанию заказчика должны быть написаны на С++. что я могу поделать.
CrimsonPig
Цитата(AlexandrY @ May 23 2016, 09:17) *
Это наивное заблуждение.
Люди обычно не сидят и не продумывают.
А кодят. А потом переписывают. Это рефакторинг, он самое главное. Только так и можно что-то написать.
Поэтому С++ здесь идёт стороной, и потому никто практичных примеров для embedded на C++ показать и не может.
Ну так и почувствуйте. Возьмите uC/GUI написанную на чистейшем C и переведите ее на C++.
Или операционку вроде FreeRTOS и покажите что там даст C++.
Ничего не даст абсолютно кроме тормозов.


Я таки извиняюсь, Ваше Великолепие.... Можно я вставлю свои 2 пенса ? Это ничего, что самая распространенная на планете Земля операционка (на свое время) Symbian OS была полностью написана на С++, включая драйвера и realtime kernel (EKA2) ? Да, С++ в ядре и драйверах был искуственно ограничен, в юзере более-менее нормален...
Решение спорное, но тем не менее так было.
Насчет симбиановского гуя: как правило, каждая компания, лицензировавшая ОС писала свой гуй с сопутствующими глюками и тормозами..
demiurg_spb
Есть хорошие бесплатные курсы по C++ на https://www.coursera.org/
Лично проходил. Понравилось, что обучают последним версиям языка и очень много дают шаблонного программирования и использования stl.
Курс назывался C++ для Си программистов.
AlexandrY
Цитата(Jenya7 @ May 23 2016, 12:01) *
я с вами согласен на 120%. но это не мои требования. есть пару проектов которые по дикому желанию заказчика должны быть написаны на С++. что я могу поделать.


Ну так переименуйте файлы .c в .cpp и делов-то.
Вон даже Mentor в своей операционке Nucleus Plus так делать не стесняется.
И в Symbian так наверняка было сделано.

Jenya7
Цитата(demiurg_spb @ May 23 2016, 16:08) *
Есть хорошие бесплатные курсы по C++ на https://www.coursera.org/
Лично проходил. Понравилось, что обучают последним версиям языка и очень много дают шаблонного программирования и использования stl.
Курс назывался C++ для Си программистов.

спасибо. посмотрю.

Цитата(AlexandrY @ May 23 2016, 16:20) *
Ну так переименуйте файлы .c в .cpp и делов-то.
Вон даже Mentor в своей операционке Nucleus Plus так делать не стесняется.
И в Symbian так наверняка было сделано.

а если проверят? а там ни класов ни строковых типов. sm.gif
CrimsonPig
Цитата(AlexandrY @ May 23 2016, 11:20) *
Ну так переименуйте файлы .c в .cpp и делов-то.
Вон даже Mentor в своей операционке Nucleus Plus так делать не стесняется.
И в Symbian так наверняка было сделано.


Кстати, могут возникнуть некоторые забавные глюки от такого переименования.. Может потребоваться тонкая доводка исходников молотком и напильником sm.gif
Ну, например, если в С-файле была использована переменная с именем, которое является зарезервированным в С++, ("new", например).
Опять же, name mangling появится, что-то там было про разное отношение к one definition rule.

AlexandrY
Цитата(Jenya7 @ May 23 2016, 13:26) *
а если проверят? а там ни класов ни строковых типов. sm.gif


Строковые типы? В embedded? На Cortex-M4 с сотней килобайт RAM-а на борту? Это очень самоуверенно я вам скажу.

Хотя если речь про Raspberry PI, то все нормально.
Но это чудо теперь и на C# программируется.
Я прямо сейчас для него на C# пишу сервер IoT.

Slash
Цитата(AlexandrY @ May 23 2016, 15:06) *
Строковые типы? В embedded? На Cortex-M4 с сотней килобайт RAM-а на борту? Это очень самоуверенно я вам скажу.

Если имеется ввиду std::string, то да, лучше не использовать. Но со строками как-то работать надо, поэтому колхозим свой велосипед:
Код
#pragma once

#include <cstring>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

namespace mylib{
    
template <size_t S>
struct String
{
    String()
    {
        clear();
    }
    
    String(const char * str)
    {
        clear();
        copy(str);
    }
    
    size_t size() const
    {
        return S;
    }
    
    // количество символов в буфере, исключая терминирующий \0
    size_t occupied() const
    {
        return std::char_traits<char>::length(buf);
    }
    
    void clear()
    {
        std::fill(buf, buf + S, 0);
    }
    
    bool contains(const char * str) const
    {
        return std::strstr(buf, str) != NULL;
    }
    
    String<S> & operator=(const char * str)
    {
        copy(str);
        return *this;
    }
        
    char buf[S];
    
private:
    // копируем по указателю str символов не более (размер нашей строки - 1).
    // если копируемая строка меньше (размер нашей строки - 1), остаток добивается \0
    void copy(const char * str)
    {
        size_t size = std::min(S - 1, std::char_traits<char>::length(str));
        std::char_traits<char>::copy(buf, str, size);
    }    
};

}

Класс добивается своими методами по потребностям. Можно полностью содрать интерфейс с std::string.
Если встречу хорошо написанный класс строки, с удовольствием выкину свою поделку sm.gif
Jenya7
Цитата(Slash @ May 23 2016, 17:44) *
Если имеется ввиду std::string, то да, лучше не использовать. Но со строками как-то работать надо, поэтому колхозим свой велосипед:
Класс добивается своими методами по потребностям. Можно полностью содрать интерфейс с std::string.
Если встречу хорошо написанный класс строки, с удовольствием выкину свою поделку sm.gif

Вы как понимающий знаете что и где колхозить. а что делать начинающему?
Slash
Цитата(Jenya7 @ May 23 2016, 15:56) *
Вы как понимающий знаете что и где колхозить. а что делать начинающему?

Учиться.
Нужны материалы?
Просто С++ - любые 3 хорошие книги (читать в фоне).
Со спецификой embedded - мне очень понравилась эта книга https://vk.com/wall-112797241_4

Быстрый старт.
1. Начните использовать ссылки.
2. Начните использовать С++ приведения типов reinterpret_cast, static_cast, const_cast. Запретите себе приведение типов в стиле C.
3. Используйте namespace.
4. Используйте перегрузку функций (если надо конечно).
3. Пробуйте проектировать простые классы. Напишите класс светодиода, пусть плохенький (для начала). Это уже объектно-ориентированный анализ и проектирование, есть отдельные книги.
Спрашивайте здесь, как написать класс под ту или иную задачу.
Jenya7
Цитата(Slash @ May 23 2016, 18:21) *
Учиться.
Нужны материалы?
Просто С++ - любые 3 хорошие книги (читать в фоне).
Со спецификой embedded - мне очень понравилась эта книга https://vk.com/wall-112797241_4

Быстрый старт.
1. Начните использовать ссылки.
2. Начните использовать С++ приведения типов reinterpret_cast, static_cast, const_cast. Запретите себе приведение типов в стиле C.
3. Используйте namespace.
4. Используйте перегрузку функций (если надо конечно).
3. Пробуйте проектировать простые классы. Напишите класс светодиода, пусть плохенький (для начала). Это уже объектно-ориентированный анализ и проектирование, есть отдельные книги.
Спрашивайте здесь, как написать класс под ту или иную задачу.

спасибо.
jorikdima
Цитата(Jenya7 @ May 23 2016, 02:01) *
которые по дикому желанию заказчика должны быть написаны на С++. что я могу поделать.

Жесть. Заказчик требует определенный язык пр-ия... и может отругать за то, что не он использован. smile3046.gif
Эдди
А чего не жабку или пхытон? Не, даже жабоскрипт! Если уж и быть извращенцем, так по полной!
Jenya7
Цитата(jorikdima @ May 23 2016, 23:53) *
Жесть. Заказчик требует определенный язык пр-ия... и может отругать за то, что не он использован. smile3046.gif

что тут удивительного? в военных проектах (да и не только в военных. любой серьезный заказчик.) обычно определяют и язык програмирования и RTOS и среду тестирования и еще много чего. например был авиационный проект там вообще запретили микроконтроллеры. все писали на FPGA.
Эдди
Цитата(Jenya7 @ May 24 2016, 09:13) *
что тут удивительного?

C++ и embedded — это промежуточный шаг к ардуйне! Хотя, ацефалия нонче в моде.
Сергей Борщ
Да-да, еще каких-то 20 лет назад продвинутые ассемблерщики так же ругали Си. Некоторые до сих пор ругают. Не знаете плюсов, не умеете их применять в контроллерах - промолчите, не позорьтесь, не мешайте развиваться другим.
arhiv6
Если не для себя, а для заказчика, то да, проще всего сделать как советовал AlexandrY - переименовать c в cpp и переработать код, добавив классы. Вроде такой стиль программирования так и называют - "си с классами". Если другие фишки C++ при этом не использовать, то в производительности/ресурсах вроде не потеряете, а некоторые удобства (например, инкапсуляция) добавятся.
ViKo
"С с классами" - так сначала назывался С++. Стоит только переименовать с в срр, как сразу в голову полезут идеи, как этими ++ попользоваться. Сначала немного, дальше больше.
Сергей Борщ
QUOTE (arhiv6 @ May 24 2016, 10:34) *
Если другие фишки C++ при этом не использовать, то в производительности/ресурсах вроде не потеряете
Существует множество других возможностей плюсов, которые не тянут за собой ни грамма производительности/ресурсов, а исходник (и, как следствие, его написание/сопровождение) упрощают. Но для этого надо хоть немного напрячься в изучении языка, а это горазно сложнее, чем размахивать флагом "плюсы - это раздутый код и тормоза". Но мы то знаем, что за этими заявлениями кроется опыт "настоящих программистов", пишущих на Паскале на любом языке.
AlexandrY
Цитата(Jenya7 @ May 24 2016, 09:13) *
что тут удивительного? в военных проектах (да и не только в военных. любой серьезный заказчик.) обычно определяют и язык програмирования и RTOS и среду тестирования и еще много чего. например был авиационный проект там вообще запретили микроконтроллеры. все писали на FPGA.


В авиационном проекте запретили микроконтроллеры?

Это вы сочиняете. Там наверно запретили все таки FPGA. Перечитайте первоисточник.


Цитата(Сергей Борщ @ May 24 2016, 10:48) *
Существует множество других возможностей плюсов, которые не тянут за собой ни грамма производительности/ресурсов, а исходник (и, как следствие, его написание/сопровождение) упрощают. Но для этого надо хоть немного напрячься в изучении языка, а это горазно сложнее, чем размахивать флагом "плюсы - это раздутый код и тормоза". Но мы то знаем, что за этими заявлениями кроется опыт "настоящих программистов", пишущих на Паскале на любом языке.


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

Jenya7
Цитата(AlexandrY @ May 24 2016, 14:19) *
В авиационном проекте запретили микроконтроллеры?

Это вы сочиняете. Там наверно запретили все таки FPGA. Перечитайте первоисточник.

именно в авиационном и именно микроконтролеры. мне нечего сочинять. я сам делал проект и потом сдавал.
AlexandrY
Цитата(Jenya7 @ May 24 2016, 12:23) *
именно в авиационном и именно микроконтролеры. мне нечего сочинять. я сам делал проект и потом сдавал.


Ну так значит проект был не авиационный либо где-то рядом с авиацией.
FPGA только недавно в автомобилях разрешили применять.
Jenya7
Цитата(AlexandrY @ May 24 2016, 15:43) *
Ну так значит проект был не авиационный либо где-то рядом с авиацией.
FPGA только недавно в автомобилях разрешили применять.

может был не авиационный. значит зря я по боингу неделю лазил.

CrimsonPig
Цитата(Jenya7 @ May 24 2016, 10:23) *
именно в авиационном и именно микроконтролеры. мне нечего сочинять. я сам делал проект и потом сдавал.


Это тот проект, на котором вы 3-4 месяца форум мучали по поводу своего кхм, кода (пытаясь экономить такты процессора и допуская грубейшие ляпы в простых конструкциях)? sm.gif
Тогда я рад за оборонку, авионику и прочее..

Сергей Борщ
QUOTE (AlexandrY @ May 24 2016, 12:43) *
FPGA только недавно в автомобилях разрешили применять.
Отстают ваши европы. Я еще в 2003 на МАКСе российскую бортовую электронику на FPGA видел.
Jenya7
Цитата(CrimsonPig @ May 24 2016, 17:24) *
Это тот проект, на котором вы 3-4 месяца форум мучали по поводу своего кхм, кода (пытаясь экономить такты процессора и допуская грубейшие ляпы в простых конструкциях)? sm.gif
Тогда я рад за оборонку, авионику и прочее..

я разве задавал вопросы по VHDL на форуме? что то не припомню.
brag
Цитата
Ох уж этот загадочный C++.
Настоящие программисты наделают себе классов с шаблонами для моргания светодиодом, шевеления пинами, соединения строк и с гордостью нам эту лабуду демонстрируют.

От части согласен, от части нет. Если программировать ради программирования, тогда да. А если стоит конкретная задача, если работаешь постоянно с чем-то новым и видишь, что вроде-чтото подобное делал, но не совсем, тогда на помощь приходит C++ (а возможно и Rust).
Кроме того в C++, а тем более Rust компилятор постоянно проверяет программиста гораздо более строго, чем сишный(С практически ничего не проверяет).

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

Класс-контейнер, хранящий один исполняемый обьект любого размера и типа, но в рамка заданных критериев, то есть сигнатуру исполняемой функции.
Код
template<class T> class delegate;

template<class TRet, class... TArgs>
class delegate<TRet(TArgs...)>;


Очередь исполняемых обьектов:
Код
template<class T, int Size_w>class VdelegateFIFO_T;

Эта очередь принимает любой исполняемый обьект любого размера. Сама очередь фиксированного размера Size_w, определенного достаточным заранее.

Стоит задача - на шине PSI висит 10 устройств, нет, давайте хватит 5ти. Каждое из них совершенно разное. И использует шину совершенно непредсказуемо.
Это AЦП, DataFlash, Акселерометр, гироскоп и термометр.
АЦП выдает 1000 выборок в секунду. Гироскоп и аксель по 100. Термометр - одна выборка в секунду. Dataflаsh вообще редко используется, в основном когда юзер что-то в менюшке нажимает.
Как это все быстро и просто реализовать на C?
Как на C++ - да очень просто - используя нашу очередь(и производные от нее классы), однажды один раз написанную за несколько дней.
Для работы с SPI мы будем использовать DMA, но это не важно.

В драйвере SPI должна быть функция запуска DMA следующего вида:
Код
class Spi{
public:
    void startDmaTransfer(const uint32_t* source, uint32_t* destination, int length, // с этим все ясно
        const delegate<void()>& on_transferCompleted // а это наш любимый C++
    );
};

Использовать это очень просто:
Код
class Accelerometer{
public:
   void start_reading_sample(const delegate<void(uint16_t)>& callback){
    // заплоняем буфер данными для запроса конкретной микросхемы
    buffer[x] = y;
.....
    // садимся на шину
    set_chip_select(); // CS
    // запускаем передачу DMA
    spi.startDmaTransfer(buffer, buffer2, 8, [this, callback](){
        // все, передача закончилась, слазим с шины убирая CS
        clear_chip_select();
        // сигнализируем того, кто нас вызвал о том, что данные прочитаны
        callback(buffer[0] | (buffer[1]<<8));
    });
   }
....

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

Это все классно, но что делать, если шина занята? Кто-то будет использовать какие-то мютексы, локи, busy флаги итд. Но мы сделаем все гораздо проще - на помощь приходит наша очередь исполняемых обьектов.
Нам понадобится очередь SPI-задач. создаем:
Код
class SpiTaskQueue : public VdelegateFIFO_T<void(SpiTaskQueue* queue), 48>{ ... }
SpiTaskQueue spi_task_queue(....);

Эта очередь также может быть приоритетная - сначала будут выполнятся более приоритетные задачи(например акселерометр, гироскоп и АЦП, а потом менее приоритетные, например термометр, а в конце уже dataflash.

Вот функция, которая считывает данные с акселерометра, в порядке его очереди и приоритета. У юзера вообще не болит голова что там с шиной да и вообще со всем остальным.
Код
bool Accelerometer::read_sample(const delegate<void(uint16_t)>& on_read_completed){
    // добавляем задачу в очеред spi
    bool r = spi_task_queue->enqueueTask([this, on_read_completed](){
        // собственно сама задача. Этот код будет выполнен как только шина освободится, или сразу, если она уже свбодная
        // запускаем чтение сэмпла
        start_reading_sample([this, on_read_completed](uint16_t sample){
            // А этот код будет выполнен, когда закончится чтение сэмпла из акселерометра
            // сигнализируем очередь, что наша задача завершена и можно запускать любую другую
            spi_task_queue->signal_taskCompleted();
            // а теперь сигнализируем пользователя нашей функции, что данные прочитаны и передаем их ему
            on_read_completed(sample);
        });
    }, ACCELEROMETER_TASK_PRIORITY); // очередь у нас приоритетная
    if(!r){
         printf("Accelerometer::read_sample error: SPI task queue full!\n");
    }
    return r;
}

Ну вот и все, задача решена. Все просто, понятно и довольно безопасно и без гонок. Точно так же реализовываем работу с остальными устройствами: АЦП,датафлеш,гироскоп и термометр.

Такое же можно и на C реализовать, но в C нет шаблонов, придется передавать кучу дополнительных параметров, например sizeof(AccelerometerReadSampleTask), нужно делать кучу структур(под каждый таск свою), кучу функций-колбеков и нигде не провтыкаться - компилятор в C делает гораздо меньше проверок, чем C++.
Мало того - сишная реализация может оказаться менее быстрой, чем c++. В С вы будете описывать call-back-и явно, да еще и передавать дополнительные аргументы. В c++ большинство сделано на шаблонах, компилятор сам сгенерит оптимальный код и большинство функций будет встроено в недра самой очереди.
Я все больше присматриваюсь к языку Rust - он еще более строгий, чем c++, там даже все переменные по умолчанию const и много чего еще интересного.
В C++ у меня давно выработалась привычка писать не SomeClass* ptr, а const SomeClass* const ptr. Или не int x, a const int x.
sigmaN
Нормально С++ в эмбеддед идет! Сам применяю и доволен.

Вы посмотрите на любой сишный проект. В том или ином виде мы всегда видим там некий struct с данными и кучу функций в качестве первого парметра принимающих указатель на этот struct.
Это как минимум первый аргумент в пользу того, чтобы перейти на С++ в формате "Си с классами". Потому как при вызове метода компилятор как раз неявно передает this в метод в качестве аргумента(прозрачно для программиста).

И это только первый, самый очевидный аргумент из списка.

Но таки да, учить язык придется!
brag
Цитата
И это только первый, самый очевидный аргумент из списка.

И наименее важный. Вот когда идет динамика - указатели на функции, таблицы указателей на функции, кода появляются тонны макросов #define, когда то и видишь указатели void* которые на самом деле ссылаются на сложные структуры данных различных типов - вот тогда срочно надо переходить на плюсы - поручать делать грязную работу компилятору. Код станет гораздо проще, короче, понятнее, быстрее и безопаснее.
sigmaN
Но согласитесь, по сложности переноса этого добра на С++ это уже далеко не самый простой сценарий ) Более того, как правило перетащить это безобразие на плюсы методом "в лоб" и не получится. Придется и язык подучить и дизайн передизайнить, чтоб ООП задействовать. И тогда получится красиво и хорошо. Если повезет )))
Леонид Иванович
Очевидный плюс перейти на С++ состоит в том, что не надо будет больше скрывать исходники. Они являются самокриптующимися, никто из конкурентов с ними ничего сделать не сможет.
brag
Цитата(Леонид Иванович @ Sep 7 2016, 21:54) *
Очевидный плюс перейти на С++ состоит в том, что не надо будет больше скрывать исходники. Они являются самокриптующимися, никто из конкурентов с ними ничего сделать не сможет.

Тогда надо на Rust переходить - его уж точно конкуренты не поймут, при чем там все вкусности c++ есть - шаблоны, перегрузка, динамический/статический полиморфизм, лямбды итд. Мало того, он еще и менее императивный и более экспрессивный sm.gif

Цитата
Придется и язык подучить и дизайн передизайнить, чтоб ООП задействовать. И тогда получится красиво и хорошо. Если повезет )))

Чтобы получилось хорошо - надо будет учиться пару лет. Многие думают, что C++ - синтаксический сахар над C, типa мол писали Class_method(obj), a стали писать obj->method() . Но это далеко не так. C++ мощный и сложный язык.
Это все равно, что назвать C синтаксическим сахаром для ассемблера. Действительно, какая разница - написать mov r0, r1 на асме или r0 = r1; на C sm.gif?

Хотя на самом деле.. вот кусок типичного C++ кода, при чем это довольно безобидный, а бывают реально страшные sm.gif
CODE

template<class T, class TCbk, SST::TPriority cbk_priority, int Size>
class UmFifo_spsc_consecutive_reader:
public UmFifo_spsc<T,UmFifo_spsc_consecutive_reader<T,TCbk,cbk_priority,Size>,Size>
{
public:
UmFifo_spsc_consecutive_reader(const TCbk& cbk):
cbk(cbk)
{}

// call this when your cbk is completed
// You can exit your callback and call this function later
void signal_dataAccepted(){
if(this->popConsecutiveData(current_len)){
// there are more data - restart
onReadyRead();
}
}


// really private, don't lock here
public:
bool postReadyRead(){
return SST::postMessage(cbk_priority, [this](){
onReadyRead();
});
}

private:
void onReadyRead(){
const T* p = this->getConsecutiveData_ptr();
current_len = this->getConsecutiveData_len();
cbk(this, p, current_len);
}

private:
TCbk cbk;
int current_len;
};

Такой код на C невозможен в принципе. Нет, ну можно что-то похожее реализовать на #define но это будет горбатый сложный и непонятный монстр, на разработку которого уйдет куча времени, а потом через пару месяцев сами не поймете что понаписывали. Проще не париться, а каждый раз(в каждом отдельном проекте или месте использования) реализовывать по новой, изменяя параметры.
А на С++ делается 1 раз(при чем времени нужно не больше, чем на одну сишную реализацию, а то и меньше) и используется повторно без изменений в куче других проектов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.