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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Embedded C++.
AlexandrY
сообщение May 24 2016, 08:19
Сообщение #31


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



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


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

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


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


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

Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 24 2016, 09:23
Сообщение #32


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

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



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

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

именно в авиационном и именно микроконтролеры. мне нечего сочинять. я сам делал проект и потом сдавал.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение May 24 2016, 09:43
Сообщение #33


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



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


Ну так значит проект был не авиационный либо где-то рядом с авиацией.
FPGA только недавно в автомобилях разрешили применять.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 24 2016, 09:53
Сообщение #34


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

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



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

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

Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение May 24 2016, 11:24
Сообщение #35


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



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


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

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 24 2016, 11:28
Сообщение #36


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (AlexandrY @ May 24 2016, 12:43) *
FPGA только недавно в автомобилях разрешили применять.
Отстают ваши европы. Я еще в 2003 на МАКСе российскую бортовую электронику на FPGA видел.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 24 2016, 12:23
Сообщение #37


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

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



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

я разве задавал вопросы по VHDL на форуме? что то не припомню.
Go to the top of the page
 
+Quote Post
brag
сообщение Sep 7 2016, 10:51
Сообщение #38


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

Группа: Свой
Сообщений: 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
sigmaN
сообщение Sep 7 2016, 17:17
Сообщение #39


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Нормально С++ в эмбеддед идет! Сам применяю и доволен.

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

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

Но таки да, учить язык придется!


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
brag
сообщение Sep 7 2016, 17:50
Сообщение #40


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

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



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

И наименее важный. Вот когда идет динамика - указатели на функции, таблицы указателей на функции, кода появляются тонны макросов #define, когда то и видишь указатели void* которые на самом деле ссылаются на сложные структуры данных различных типов - вот тогда срочно надо переходить на плюсы - поручать делать грязную работу компилятору. Код станет гораздо проще, короче, понятнее, быстрее и безопаснее.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 7 2016, 18:51
Сообщение #41


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Sep 7 2016, 18:54
Сообщение #42


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



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


--------------------
Go to the top of the page
 
+Quote Post
brag
сообщение Sep 7 2016, 21:37
Сообщение #43


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

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



Цитата(Леонид Иванович @ 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 раз(при чем времени нужно не больше, чем на одну сишную реализацию, а то и меньше) и используется повторно без изменений в куче других проектов.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 06:42
Рейтинг@Mail.ru


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