реклама на сайте
подробности

 
 
> Embedded C++.
Jenya7
сообщение May 22 2016, 06:49
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я хочу выучить С++ под ембедед. Подскажите какие нибудь он лайн курсы или другой материал. Хотелось бы также посмотреть готовые проекты на С++ чтоб прочувствовать все аспекты.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
brag
сообщение Sep 7 2016, 10:51
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Ох уж этот загадочный 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.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Embedded C++.   May 22 2016, 06:49
- - Onkel   Цитата(Jenya7 @ May 22 2016, 09:49) Я хоч...   May 22 2016, 09:11
|- - Jenya7   Цитата(Onkel @ May 22 2016, 15:11) easyel...   May 22 2016, 09:58
- - Slash   Цитата(Jenya7 @ May 22 2016, 10:49) Я хоч...   May 23 2016, 00:01
|- - AlexandrY   Цитата(Slash @ May 23 2016, 03:01) С++ в ...   May 23 2016, 04:26
- - Jenya7   Погуглив я обнаружил что нет нормальных обучалок п...   May 23 2016, 06:44
|- - Сергей Борщ   QUOTE (Jenya7 @ May 23 2016, 09:44) нет н...   May 23 2016, 07:12
|- - k155la3   Цитата(Jenya7 @ May 23 2016, 09:44) Погуг...   May 23 2016, 07:38
|- - AlexandrY   Цитата(k155la3 @ May 23 2016, 10:38) Соот...   May 23 2016, 08:17
|- - CrimsonPig   Цитата(AlexandrY @ May 23 2016, 09:17) Эт...   May 23 2016, 09:09
|- - demiurg_spb   Есть хорошие бесплатные курсы по C++ на https://ww...   May 23 2016, 10:08
|- - Jenya7   Цитата(demiurg_spb @ May 23 2016, 16:08) ...   May 23 2016, 10:26
|- - AlexandrY   Цитата(Jenya7 @ May 23 2016, 13:26) а есл...   May 23 2016, 11:06
|- - Slash   Цитата(AlexandrY @ May 23 2016, 15:06) Ст...   May 23 2016, 11:44
|- - Jenya7   Цитата(Slash @ May 23 2016, 17:44) Если и...   May 23 2016, 11:56
|- - Slash   Цитата(Jenya7 @ May 23 2016, 15:56) Вы ка...   May 23 2016, 12:21
|- - Jenya7   Цитата(Slash @ May 23 2016, 18:21) Учитьс...   May 23 2016, 12:47
- - Jenya7   Я давно пишу на С. Я также пишу на С# так что знак...   May 23 2016, 08:29
|- - AlexandrY   Цитата(Jenya7 @ May 23 2016, 11:29) Я дав...   May 23 2016, 08:56
|- - Jenya7   Цитата(AlexandrY @ May 23 2016, 14:56) Ст...   May 23 2016, 09:01
|- - AlexandrY   Цитата(Jenya7 @ May 23 2016, 12:01) я с в...   May 23 2016, 10:20
||- - CrimsonPig   Цитата(AlexandrY @ May 23 2016, 11:20) Ну...   May 23 2016, 10:39
|- - jorikdima   Цитата(Jenya7 @ May 23 2016, 02:01) котор...   May 23 2016, 17:53
|- - Jenya7   Цитата(jorikdima @ May 23 2016, 23:53) Же...   May 24 2016, 06:13
|- - Эдди   Цитата(Jenya7 @ May 24 2016, 09:13) что т...   May 24 2016, 06:18
|- - AlexandrY   Цитата(Jenya7 @ May 24 2016, 09:13) что т...   May 24 2016, 08:19
|- - Jenya7   Цитата(AlexandrY @ May 24 2016, 14:19) В ...   May 24 2016, 09:23
|- - AlexandrY   Цитата(Jenya7 @ May 24 2016, 12:23) именн...   May 24 2016, 09:43
||- - Jenya7   Цитата(AlexandrY @ May 24 2016, 15:43) Ну...   May 24 2016, 09:53
||- - Сергей Борщ   QUOTE (AlexandrY @ May 24 2016, 12:43) FP...   May 24 2016, 11:28
|- - CrimsonPig   Цитата(Jenya7 @ May 24 2016, 10:23) именн...   May 24 2016, 11:24
|- - Jenya7   Цитата(CrimsonPig @ May 24 2016, 17:24) Э...   May 24 2016, 12:23
- - Эдди   А чего не жабку или пхытон? Не, даже жабоскрипт...   May 24 2016, 05:35
- - Сергей Борщ   Да-да, еще каких-то 20 лет назад продвинутые ассем...   May 24 2016, 07:25
- - arhiv6   Если не для себя, а для заказчика, то да, проще вс...   May 24 2016, 07:34
|- - Сергей Борщ   QUOTE (arhiv6 @ May 24 2016, 10:34) Если ...   May 24 2016, 07:48
- - ViKo   "С с классами" - так сначала назывался С...   May 24 2016, 07:39
- - sigmaN   Нормально С++ в эмбеддед идет! Сам применяю и ...   Sep 7 2016, 17:17
- - brag   ЦитатаИ это только первый, самый очевидный аргумен...   Sep 7 2016, 17:50
- - sigmaN   Но согласитесь, по сложности переноса этого добра ...   Sep 7 2016, 18:51
- - Леонид Иванович   Очевидный плюс перейти на С++ состоит в том, что н...   Sep 7 2016, 18:54
- - brag   Цитата(Леонид Иванович @ Sep 7 2016, 21:5...   Sep 7 2016, 21:37


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th August 2025 - 12:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01423 секунд с 7
ELECTRONIX ©2004-2016