Используется ли теория ограничений?
Абстрактный пример не претендующий на реалистичность
Большой заказ на монтаж с большой маржой, сдать надо за месяц, всех мало-мальски умеющих паять перевели в временно в монтажники.
Программисты сидят этот месяц без дела, при этом расчет дохода исходя из нормо-часа программиста не совсем будет верен. Выбор следующий: они или месяц могут делать заказ за любую цену, даже сильно меньшую чем себестоимость, или не работать вообще.
Почему бы не использовать std::optional или boost::optional
он имеет каст к bool. преследует как раз safe bool idiome и нужен как раз для таких случаев
Существует 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.
Что совсем перевернет методы разработки под мк.
Я разрабатывал измерительное оборудование для железнодорожных систем.
В данный момент разрабатываю измерительные системы для антенных комплексов. Видео
На данном видео можно увидеть комплекс, в разработке которого я принимал участие.
Дальнейшую дискуссию с вами продолжать не могу, в силу отстуствия конструктивной составляющей. Похоже шаблоны и С++ для вас есть вселенское зло, которое надо искоренять всеми силами
На компиляторах от Keil и Iar все работает прекрасно.
Миландр (привет разным российскими процессорам) тоже поддерживает C++ и шаблоны. Любые армы поддерживают C++ и шаблоны, микроконтроллеры авр поддерживают C++ и шаблоны. Пики и 8051 только остались за бортом, но их никто не использует.
Так что похоже вы сами себе придумали проблему и сами поставили ее мне в укор.
Раз пошло время придуманых ситуаций, я тоже задам вам вопрос.
Что вы будете делать если микроконтроллер не поддерживает ни C++ ни С а только ADA? Или вы ради вашей красоты просто отказываетесь от проектов, где заказчиком жестко задан процессор?
Вы опять же не поверите, но параметризацию устройства можно тоже вынести в отдельный класс и получить великолепную абстракцию, причем человеку который пишет не надо знать что и как там инкапсулированно, настроил phy микросхему на 10 Мбит, ок, на 100 надо? Не будем перелапачивать весь код, а просто добавим реализацию конфигурирования на 100мБит.
Зато мой код — РАБОТАЕТ. А коллеге, любившему темплейты — оказалось проще уволиться, чем отладить свой код.
Вот это характеристика только ваша и коллеги. МОЙ КОД ТОЖЕ РАБОТАЕТ!!!!!!!!!!!..
Это сродни истории
«К нам в бригаду строителей пришел странный какой то, все молотками забивают гвозди, а он пневматический принес, поковырялся там, гвоздей не забил ни одного на компрессор пожаловался и уволился.»
Это же не пневматического молотка проблема, это человека. А вы экстраполировали своего коллегу на все сообщество C++ программистов.
Ртос это уже другого поля ягоды, при этом в текущем проекте никто не запрещал мне критичный к времени выполнения код обрабатывать в прерываниях с более высоким приоритетом прямо поверх шедулера.
Если следовать вашей логике, то вся параметризация и гибкость есть синтаксический сахар, который увеличивает сложность при верификации. Но как показывает профессиональный опыт моей разработки встраиваемых систем, поддерживать шаблонный код в разы лучше чем прибитый гвоздями.
Можно обернуть всю параметризацию, которая известна compile time (а такой 99%) в шаблоны, тем самым без потери производительности мы получим гибкую абстракцию
Ладно, подытожим. У многих людей это вызывает сложности.
У меня не возникло никаких сложностей, ни на атмеге в свое время ни на стм32 хардварно и софтварно.
Существуют и другие алгоритмы, да, но это единичные случаи.
Я к чему, пока я пишу это сообщение при чтении с винчестера через satа используется crc32, при использовании любого pci устройства используется crc32, сейчас отправлю сообщение и в IP протоколе будет использоваться то же самое crc32. Modbus и еще масса промышленных стандартов поддерживают в виде контрольной суммы циклически избыточный код.
Все что вы описали по LitleEndian и.т.п. это характеристика протокола передачи и не относится к контрольной сумме любого типа. Все остальные параметры применимы опять же к любой контрольной сумме и если не описаны, опускаются, как в вашем варианте CRC:=CRC + byte*44111 не видно xor out.
Сомнителен смысл использования своих алгоритмов расчета контрольной суммы, существует же алгоритм crc и используется везде где только можно.
По скорости исполнения кода у вас с таблицей выйдет тоже самое, что и умножение 8 бит на магическую константу в вашем примере, по эффективности выше в разы.
Хранить 256 байт данных во флэше для crc8 не так уж и тяжко.
Да и наконец в документации проще написать, используется crc16 полином такой то, гораздо меньше вероятность как вы говорите вынести мозг и микроконтроллеру и программисту, чем сказать "мы тут все 2 раза умножаем на 44111 потом складываем и обрезаем до 8 бит"
Не согласен с тем, что конкретный проект не нужен. Сделать часы это идеальная для обучения задача.
Опять же, про C++ в embedded ни слова. Constexpr и статический полиморфизм как будто созданы специально для микроконтроллеров. Получаем легко читаемый и переносимый код без оверхеда.
Не понимаю, зачем вы выкидываете всю настройку железа в __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.
Абстрактный пример не претендующий на реалистичность
Большой заказ на монтаж с большой маржой, сдать надо за месяц, всех мало-мальски умеющих паять перевели в временно в монтажники.
Программисты сидят этот месяц без дела, при этом расчет дохода исходя из нормо-часа программиста не совсем будет верен. Выбор следующий: они или месяц могут делать заказ за любую цену, даже сильно меньшую чем себестоимость, или не работать вообще.
он имеет каст к bool. преследует как раз safe bool idiome и нужен как раз для таких случаев
godbolt.org/g/Bz35nQ
Второе дает просто прекрасные результаты, код выглядит как будто написан для пк, но сочетание static constexpr для экземпляра внутри какого то скоупа позволяет компилятору произвести аллокацию на этапе компиляции и поместить экземпляр во флеш.
Выглядит это примерно так, и код ниже может не использоватьт оперативную память вообще (я инитил итуглил светодиодом в бесконечном вайле, на gcc-arm-none-eabi, эта логика вырождалось в 50 байт кода во флеше и 0 байт оперативной памяти)
.
Помимо этого, есть вероятность что в C++ добавят compile time allocator.
Что совсем перевернет методы разработки под мк.
В данный момент разрабатываю измерительные системы для антенных комплексов.
Видео
На данном видео можно увидеть комплекс, в разработке которого я принимал участие.
Дальнейшую дискуссию с вами продолжать не могу, в силу отстуствия конструктивной составляющей. Похоже шаблоны и С++ для вас есть вселенское зло, которое надо искоренять всеми силами
На компиляторах от 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
Если вы используете раннее связывание, то оверхеда перед прибиванием гвоздями нет совершенно никакого. При этом код типа
приятнее читать и удобнее сопровождать
Ртос это уже другого поля ягоды, при этом в текущем проекте никто не запрещал мне критичный к времени выполнения код обрабатывать в прерываниях с более высоким приоритетом прямо поверх шедулера.
У меня не возникло никаких сложностей, ни на атмеге в свое время ни на стм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/
По скорости исполнения кода у вас с таблицей выйдет тоже самое, что и умножение 8 бит на магическую константу в вашем примере, по эффективности выше в разы.
Хранить 256 байт данных во флэше для crc8 не так уж и тяжко.
Да и наконец в документации проще написать, используется crc16 полином такой то, гораздо меньше вероятность как вы говорите вынести мозг и микроконтроллеру и программисту, чем сказать "мы тут все 2 раза умножаем на 44111 потом складываем и обрезаем до 8 бит"
Сам делаю похожим на описанный в статье способ, но все является статическим массивом указателей в классе InterruptManager
Опять же, про C++ в embedded ни слова. Constexpr и статический полиморфизм как будто созданы специально для микроконтроллеров. Получаем легко читаемый и переносимый код без оверхеда.
По поводу C++ в embedded советую книгу Real time c++
Логично инициализировать периферию в конструкторе класса ацп, ведь он и предназначался для связи логики с железом.
При этом отдельно хочется заметить, что динамическое выделение памяти под классы, относящиеся к железу, во всраиваемых системах это моветон. Мало где увидишь плату, где например припаян разъем 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.
— Помнил я еще с школы, что, если взять за ручку ведро с водой и сильно его раскрутить, то ни капли воды не прольется.
А мы как раз новый чайник купили. Ну я и решил показать детям фокус…
Дальше рассказ детей.
— Папа позвал нас на кухню. Посадил. Налил в чайник воды. Размахнулся и разбил его о потолок!
В keil есть бесплатная версия с ограничением размера кода в 32 кб.