Pull to refresh
4
0
sam_satan @sam_satan

Пользователь

Send message
Используется ли теория ограничений?
Абстрактный пример не претендующий на реалистичность
Большой заказ на монтаж с большой маржой, сдать надо за месяц, всех мало-мальски умеющих паять перевели в временно в монтажники.

Программисты сидят этот месяц без дела, при этом расчет дохода исходя из нормо-часа программиста не совсем будет верен. Выбор следующий: они или месяц могут делать заказ за любую цену, даже сильно меньшую чем себестоимость, или не работать вообще.
Почему бы не использовать std::optional или boost::optional
он имеет каст к bool. преследует как раз safe bool idiome и нужен как раз для таких случаев

godbolt.org/g/Bz35nQ
Существует placement new и создание constexpr экземпляров.
Второе дает просто прекрасные результаты, код выглядит как будто написан для пк, но сочетание static constexpr для экземпляра внутри какого то скоупа позволяет компилятору произвести аллокацию на этапе компиляции и поместить экземпляр во флеш.
Выглядит это примерно так, и код ниже может не использоватьт оперативную память вообще (я инитил итуглил светодиодом в бесконечном вайле, на gcc-arm-none-eabi, эта логика вырождалось в 50 байт кода во флеше и 0 байт оперативной памяти)

constexpr GPIO led1(portA,pin4); //пин и порт светодиода известны компайл тайм 
led1.init(params); //параметры инициализации тоже
led.up(); //тут идет переход по указателю на регистр BSSR порта и сдвинутый на пин, но т.к. мы знаем параметры compile time, то компилятор может подставить нужный регистр
.

Помимо этого, есть вероятность что в C++ добавят compile time allocator.
Что совсем перевернет методы разработки под мк.
Я разрабатывал измерительное оборудование для железнодорожных систем.
В данный момент разрабатываю измерительные системы для антенных комплексов.
Видео
На данном видео можно увидеть комплекс, в разработке которого я принимал участие.

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

На компиляторах от Keil и Iar все работает прекрасно.

Миландр (привет разным российскими процессорам) тоже поддерживает C++ и шаблоны. Любые армы поддерживают C++ и шаблоны, микроконтроллеры авр поддерживают C++ и шаблоны. Пики и 8051 только остались за бортом, но их никто не использует.

Так что похоже вы сами себе придумали проблему и сами поставили ее мне в укор.
Раз пошло время придуманых ситуаций, я тоже задам вам вопрос.
Что вы будете делать если микроконтроллер не поддерживает ни C++ ни С а только ADA? Или вы ради вашей красоты просто отказываетесь от проектов, где заказчиком жестко задан процессор?

Вы опять же не поверите, но параметризацию устройства можно тоже вынести в отдельный класс и получить великолепную абстракцию, причем человеку который пишет не надо знать что и как там инкапсулированно, настроил phy микросхему на 10 Мбит, ок, на 100 надо? Не будем перелапачивать весь код, а просто добавим реализацию конфигурирования на 100мБит.

Зато мой код — РАБОТАЕТ. А коллеге, любившему темплейты — оказалось проще уволиться, чем отладить свой код.
Вот это характеристика только ваша и коллеги. МОЙ КОД ТОЖЕ РАБОТАЕТ!!!!!!!!!!!..

Это сродни истории
«К нам в бригаду строителей пришел странный какой то, все молотками забивают гвозди, а он пневматический принес, поковырялся там, гвоздей не забил ни одного на компрессор пожаловался и уволился.»

Это же не пневматического молотка проблема, это человека. А вы экстраполировали своего коллегу на все сообщество C++ программистов.
Всегда на утверждения о корреляции асма и производительности скидываю эту статью.
http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikrokontrollerov-na-si.html

Если вы используете раннее связывание, то оверхеда перед прибиванием гвоздями нет совершенно никакого. При этом код типа
typedef Led<PortA,4> led1;
typedef Led<PortA,5> led2;
led1::init();
led2::init();
led1::toggle();
led2::toggle();

приятнее читать и удобнее сопровождать

Ртос это уже другого поля ягоды, при этом в текущем проекте никто не запрещал мне критичный к времени выполнения код обрабатывать в прерываниях с более высоким приоритетом прямо поверх шедулера.
Если следовать вашей логике, то вся параметризация и гибкость есть синтаксический сахар, который увеличивает сложность при верификации. Но как показывает профессиональный опыт моей разработки встраиваемых систем, поддерживать шаблонный код в разы лучше чем прибитый гвоздями.
Можно обернуть всю параметризацию, которая известна compile time (а такой 99%) в шаблоны, тем самым без потери производительности мы получим гибкую абстракцию
Ладно, подытожим. У многих людей это вызывает сложности.
У меня не возникло никаких сложностей, ни на атмеге в свое время ни на стм32 хардварно и софтварно.
Существуют и другие алгоритмы, да, но это единичные случаи.
Я к чему, пока я пишу это сообщение при чтении с винчестера через satа используется crc32, при использовании любого pci устройства используется crc32, сейчас отправлю сообщение и в IP протоколе будет использоваться то же самое crc32. Modbus и еще масса промышленных стандартов поддерживают в виде контрольной суммы циклически избыточный код.

Все что вы описали по LitleEndian и.т.п. это характеристика протокола передачи и не относится к контрольной сумме любого типа. Все остальные параметры применимы опять же к любой контрольной сумме и если не описаны, опускаются, как в вашем варианте CRC:=CRC + byte*44111 не видно xor out.

А в тему тиньки с 1 кб флэша, так можно и 8051 использовать, но зачем если любой CortexM0 стоит и дешевле и может больше
http://www.compel.ru/infosheet/ATMEL/ATtiny13-20SU/
http://www.compel.ru/infosheet/ST/STM32F030K6T6TR/
Сомнителен смысл использования своих алгоритмов расчета контрольной суммы, существует же алгоритм crc и используется везде где только можно.
По скорости исполнения кода у вас с таблицей выйдет тоже самое, что и умножение 8 бит на магическую константу в вашем примере, по эффективности выше в разы.
Хранить 256 байт данных во флэше для crc8 не так уж и тяжко.
Да и наконец в документации проще написать, используется crc16 полином такой то, гораздо меньше вероятность как вы говорите вынести мозг и микроконтроллеру и программисту, чем сказать "мы тут все 2 раза умножаем на 44111 потом складываем и обрезаем до 8 бит"
Как часть mbed.
Сам делаю похожим на описанный в статье способ, но все является статическим массивом указателей в классе InterruptManager
Не согласен с тем, что конкретный проект не нужен. Сделать часы это идеальная для обучения задача.
Опять же, про C++ в embedded ни слова. Constexpr и статический полиморфизм как будто созданы специально для микроконтроллеров. Получаем легко читаемый и переносимый код без оверхеда.
Про переопределение стека фриртосом спасибо, не знал.
По поводу C++ в embedded советую книгу Real time c++
Не понимаю, зачем вы выкидываете всю настройку железа в __low_level_init(). Получается недо ооп. Если поменять ацп с ADC1 на ADC2, нужно и менять и функцию инициализации и сам класс.
Логично инициализировать периферию в конструкторе класса ацп, ведь он и предназначался для связи логики с железом.

При этом отдельно хочется заметить, что динамическое выделение памяти под классы, относящиеся к железу, во всраиваемых системах это моветон. Мало где увидишь плату, где например припаян разъем usb, а через секунду эти же ножки заняты внешней припаянной flash памятью или lcd дисплеем.
Как уже где-то писалось, крайне не хочется во время нажатия на педаль тормоза в автомобиле получить exception о том, что недостаточно памяти для выделения памяти под класс cBrakePushHandler.
Вставлю свои пять копеек.
В настоящее время для разработки под arm и в частности stm32 наиболее распространены 4 ide(не претендую на истину).
Первые две, это IAR и KEIL. Коммерческие ide, специально созданные для создания по встраиваемых систем. Они платны, есть триал версии с ограничением кода прошивки.
Вторые две это eclipse + gcc для arm или собранный на его основе Cocoox. Они бесплатны.
Собственно главное различие в том, что iar и keil работают из коробки, под них есть масса примеров, драйвера для программаторов встроены в дистрибутив и.т.п.
Во вторых двух совершенно другая история, как пример, в eclipse нельзя просто залить код в микроконтроллер, есть кнопка залить и запустить дебаггер, периодически глючит просмотр регистров контроллера.
Теперь представьте себе человека, который только знакомится с микроконтроллерами серии стм32. Reference manual (20мб) на серию stm32f4 это тысяча с лишним страниц описывающих периферию контроллера. Обилие конфигурирующих дефайнов и файлов в проекте, совершенно не понятных студенту, но без которых ничего работать не, расчёт адресов памяти для линкера. И не разобравшись в КАЖДОМ из пунктов досконально, не получится даже поморгать светодиодом.
У вас есть 2 варианта: поставить свободную ide типа eclipse и зарыться в непонятных для новичка вещах, разгребая которые вы потеряете весь энтузиазм.
Или же поставить iar keil, запустить готовый проект коих тысяча и наслаждаться моргающим светодиодом, параллельно разбираясь зачем в проекте подключен тот или иной файл.
ps Сам пишу в Eclipse +gcc на C++ под stm32, но начинал с keil.
Вспомнилась байка, найденная на просторах интернета.

— Помнил я еще с школы, что, если взять за ручку ведро с водой и сильно его раскрутить, то ни капли воды не прольется.

А мы как раз новый чайник купили. Ну я и решил показать детям фокус…

Дальше рассказ детей.
— Папа позвал нас на кухню. Посадил. Налил в чайник воды. Размахнулся и разбил его о потолок!
Разобрался, спасибо.
А в чем его (программатора) преимущество перед jtag?
В keil есть бесплатная версия с ограничением размера кода в 32 кб.
1

Information

Rating
Does not participate
Date of birth
Registered
Activity