Гость Игорь Опубликовано 4 июня, 2017 Поделиться Опубликовано 4 июня, 2017 Добрый день! На данный момент язык С++ представляет очень большие возможности. STL, многопоточность и прочее. Подскажите, из того что есть в ++ что обязательно необходимо знать для программирования микроконтроллеров ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 4 июня, 2017 Поделиться Опубликовано 4 июня, 2017 2 минуты назад, Гость Игорь сказал: из того что есть в ++ что обязательно необходимо знать для программирования микроконтроллеров ? Обязательно - ничего. Достаточно вообще обычного Си. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Гость Игорь Опубликовано 4 июня, 2017 Поделиться Опубликовано 4 июня, 2017 8 минут назад, Alex сказал: Обязательно - ничего. Достаточно вообще обычного Си. А желательно ? может классы для более хорошей организации программы. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
BARS_ Опубликовано 4 июня, 2017 Поделиться Опубликовано 4 июня, 2017 Только что, Гость Игорь сказал: классы для более хорошей организации программы Даром там не нужны. Только лишнюю память забивать. МК программят на Си. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 4 июня, 2017 Поделиться Опубликовано 4 июня, 2017 8 часов назад, Гость Игорь сказал: А желательно ? Думаю, шаблоны надо изучить. По тем примерам, которые мне попадались, С++ для микроконтроллеров (я говорю про круг своих интересов - AVR, т.е. 8-битники), я делаю вывод, что основной выигрыш достигается применением шаблонов, а не классов. 0 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 С этого места подробнее) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 А чего там подробнее? Прежде всего, я лично с плюсами не очень дружу - так, общее представление имею... Иерархии классов для известных мне примеров не дают тех преимуществ, как для "больших" систем, т.к. в маломерных МК можно использовать только статические экземпляры классов, что по своей сути ничем от обычного С-подхода не отличается, разве что чуть элегантнее исходники (не кидайтесь тапками, но тут в пример приведу ардуино-скетчи - абстрагирование от аппаратуры очень высокое). Главные плюшки "объектного" подхода проявляются при динамическом создании и уничтожении экземпляоров классов, а для этого и памяти маловато, и быстродействия. Что еще остается в плюсах, кроме не пригождающихся классов? Только шаблоны. Вот тут и получается более-менее приятный результат - написал, вроде 1 шаблон, а в итоге работает 100500 разных функций. Наибольший шок эти шаблонные подходы у меня вызвали, когда я на просторах electronix.ru наткнулся на статью про "виртуальные порты", т.е. когда при выводе байта каждый его бит может попадать на произвольную ногу микроконтроллера. К сожалению, ни ссылки, ни автора не помню... Помню только, что очень лихо там автор шаблоны применял - голову сломать можно. Что касается "оверхеда", то С++ в основном не так уж и проигрывает классическому С, если все-таки говорить об ограниченном применении для МК-маломерок (см. выше). Так что если хочется - запросто можно пользовать. Лично я не делаю этого по одной причине: выигрыш мизерный, а головняк по изучению плюсов заметный, и даже те же шаблоны перегревают мозг. 1 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 "Перегрузка" ещё - хороший плюс плюсов. Что касается классов. По мне, единственным их плюсом в использовании под "мелкие" платформы, без ущерба ресурсам - логическое объединение (связывание) полей классов (или структур) и методов. На Си приходится создавать функции, одним из параметров которых - указатель на структуру. Плюсы решают это мелкое недоразумение. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 22 минуты назад, Alex сказал: "Перегрузка" ещё - хороший плюс плюсов Я не испытываю особого восторга от этого... Потому что когда видишь в коде перегруженные операторы, далеко не всегда это на самом деле интуитивно понятно... И вместо облегчения чтения кода приходится наоборот, долго ковыряться в исходниках, разбираясь, где же это переопределение было сделано и нафига... Но фича очень здорово "блестит"... 0 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 Перегружать можно не только операторы, но и аргументы функций 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 А смысл? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
GOR23 Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 Смысл в том что один метод(функция) делает конкретное действие, но может это сделать с помощью разных входящих данных. Бывает удобно... но обойтись можно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 2 часа назад, BARS_ сказал: А смысл? Смысл осознаётся только тогда, когда начинаешь использовать эти все возможности. Расписывать это всё тут бессмысленно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 5 июня, 2017 Поделиться Опубликовано 5 июня, 2017 (изменено) 12 часа назад, ARV сказал: Наибольший шок эти шаблонные подходы у меня вызвали, когда я на просторах electronix.ru наткнулся на статью про "виртуальные порты", т.е. когда при выводе байта каждый его бит может попадать на произвольную ногу микроконтроллера. К сожалению, ни ссылки, ни автора не помню... http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikrokontrollerov-na-si.html В 04.06.2017 в 13:58, Гость Игорь сказал: Подскажите, из того что есть в ++ что обязательно необходимо знать для программирования микроконтроллеров ? Обязательно шаблоны и по возможности только статические методы классов (без конструктора) Пробовал C++ вместо Си (компилятор IAR): по RAM можно получить результат как на Си (байт в байт), по объёму кода (Flash) зависит от оптимизации, но в целом код на C++ соизмерим с размером кода на Си (пробовал C++ на ATtiny2313 и ATmega32, работает нормально и там и там). Когда основные классы уже написаны, то получается очень даже ничего, например настройка и использование таймера (прерывание каждую милисекунду) выглядит так: typedef TTimer0_SimpleCycle < TTimerValue< 1 >::ms> Timer_0; // класс, отвечающий за настройку таймера на 1 млсек ... Timer_0::Init(); Timer_0::Start(); Можно задавать в MCycles, KCycles, Cycles, MHz, KHz, Hz, ms, us, ns. Причём, если таймер не позволяет обеспечить нужное значение, то во время компиляции выдаётся ошибка. Изменено 5 июня, 2017 пользователем dm37 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 21 июля, 2017 Поделиться Опубликовано 21 июля, 2017 То, что у меня получилось на C++, можно посмотреть здесь https://ru.files.fm/u/a2sfccuf#/list/, файл uC_cpp.7z Внутри: - пример с динамической индикацией (исходники + proteus) - пример с LCD на HD44780 (исходники + proteus) - небольшое описание Микроконтроллеры ATtiny2313 и ATmega32, компилятор IAR 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Мария Сушко Опубликовано 9 августа, 2017 Поделиться Опубликовано 9 августа, 2017 Привет) у меня возникла проблема с программированием микроконтроллера.... не могу понять как мне из 8 светодиодов сделать так скажем бегущую "змейку" из 4 светодиодов ? не подскажете как это на с++ оформить? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 9 августа, 2017 Поделиться Опубликовано 9 августа, 2017 Так же как и на Си 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 9 августа, 2017 Поделиться Опубликовано 9 августа, 2017 Ну если применительно к тому, что я писал, то: - создать класс драйвера выходного устройства (например DrvLed8), в классе драйвера создать два метода: DrvLed8::Init() - инициализация пинов контроллера, DrvLed8::Set(uint8_t mask) - включение/выключение светодиодов в зависимости от маски (0xAA, 0x55) - создать класс устройства DevLed8 с одним методом DevLed8::Tick(), в котором будет осуществляться смена маски для DrvLed8::Set(uint8_t mask) - создать счётчик TCounter, для определения (изменения) скорости мигания (если доработать, то, например, через метод TCounter::Set(uint16_t value) можно менять скорость мигания, при наличии кнопок, конечно) - настроить прерывание на 1 млсек (можно другое значение). В прерывании выполнять Counter::Tick() а дальше примерно так typedef TFlags < 1 > Flags; // хранилище флагов на 1 флаг typedef TFlag < Flags, 0 > FCounter; // флаг для работы счётчика typedef TDevLed8 < TDrvLed8 > DevLed8; // устройство управления 8 светодиодами typedef TCounter < 200, FCounter > Counter; // счётчик на 200 млсек typedef TTimer0_SimpleCycle < TTimerValue < 1 > ::ms > Timer_1ms; // настройка таймера на 1 млсек //--------------------------------------------------------- struct IRQ_1ms { #pragma inline = forced static inline void execute(void) { Counter::Tick(); } }; template void IRQ_Timer0_CompareA < IRQ_1ms > ::execute(); //--------------------------------------------------------- void main(void) { DevLed8::Init(); Timer_1ms::Init(); Counter::Init(); Timer_1ms::Start(); _SEI(); while(1) { if(Counter::Check()) { DevLed8::Tick(); Counter::Reset(); } } } После можно будет добавить в класс DevLed8 метод SetMode(uint8_t mode) для задания номера эффекта 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 20 августа, 2017 Поделиться Опубликовано 20 августа, 2017 по С++ обновил описаниеhttps://ru.files.fm/u/a2sfccuf#/list/ файл uC_cpp.7z 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.