Гость Игорь

C++ и Микроконтроллеры

19 сообщений в этой теме

Гость Игорь   
Гость Игорь

Добрый день!

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

Подскажите, из того что есть в ++ что обязательно необходимо знать для программирования микроконтроллеров ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546
2 минуты назад, Гость Игорь сказал:

из того что есть в ++ что обязательно необходимо знать для программирования микроконтроллеров ?

Обязательно - ничего. Достаточно вообще обычного Си.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Игорь   
Гость Игорь
8 минут назад, Alex сказал:

Обязательно - ничего. Достаточно вообще обычного Си.
 

А желательно ? может классы для более хорошей организации программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BARS_    731
Только что, Гость Игорь сказал:

классы для более хорошей организации программы

Даром там не нужны. Только лишнюю память забивать. МК программят на Си.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    421
8 часов назад, Гость Игорь сказал:

А желательно ?

Думаю, шаблоны надо изучить. По тем примерам, которые мне попадались, С++ для микроконтроллеров (я говорю про круг своих интересов - AVR, т.е. 8-битники), я делаю вывод, что основной выигрыш достигается применением шаблонов, а не классов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    421

А чего там подробнее? Прежде всего, я лично с плюсами не очень дружу - так, общее представление имею...

Иерархии классов для известных мне примеров не дают тех преимуществ, как для "больших" систем, т.к. в маломерных МК можно использовать только статические экземпляры классов, что по своей сути ничем от обычного С-подхода не отличается, разве что чуть элегантнее исходники (не кидайтесь тапками, но тут в пример приведу ардуино-скетчи - абстрагирование от аппаратуры очень высокое). Главные плюшки "объектного" подхода проявляются при динамическом создании и уничтожении экземпляоров классов, а для этого и памяти маловато, и быстродействия.

Что еще остается в плюсах, кроме не пригождающихся классов? Только шаблоны. Вот тут и получается более-менее приятный результат - написал, вроде 1 шаблон, а в итоге работает 100500 разных функций. Наибольший шок эти шаблонные подходы у меня вызвали, когда я на просторах electronix.ru наткнулся на статью про "виртуальные порты", т.е. когда при выводе байта каждый его бит может попадать на произвольную ногу микроконтроллера. К сожалению, ни ссылки, ни автора не помню... Помню только, что очень лихо там автор шаблоны применял - голову сломать можно.

Что касается "оверхеда", то С++ в основном не так уж и проигрывает классическому С, если все-таки говорить об ограниченном применении для МК-маломерок (см. выше). Так что если хочется - запросто можно пользовать. Лично я не делаю этого по одной причине: выигрыш мизерный, а головняк по изучению плюсов заметный, и даже те же шаблоны перегревают мозг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

"Перегрузка" ещё - хороший плюс плюсов.
Что касается классов. По мне, единственным их плюсом в использовании под "мелкие" платформы, без ущерба ресурсам - логическое объединение (связывание) полей классов (или структур) и методов. На Си приходится создавать функции, одним из параметров которых - указатель на структуру. Плюсы решают это мелкое недоразумение.


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    421
22 минуты назад, Alex сказал:

"Перегрузка" ещё - хороший плюс плюсов

Я не испытываю особого восторга от этого... Потому что когда видишь в коде перегруженные операторы, далеко не всегда это на самом деле интуитивно понятно... И вместо облегчения чтения кода приходится наоборот, долго ковыряться в исходниках, разбираясь, где же это переопределение было сделано и нафига... Но фича очень здорово "блестит"...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Перегружать можно не только операторы, но и аргументы функций :) 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GOR23    39

Смысл в том что один метод(функция) делает конкретное действие, но может это сделать с помощью разных входящих данных. Бывает удобно... но обойтись можно.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546
2 часа назад, BARS_ сказал:

А смысл?

Смысл осознаётся только тогда, когда начинаешь использовать эти все возможности.
Расписывать это всё тут бессмысленно.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dm37    54
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. Причём, если таймер не позволяет обеспечить нужное значение, то во время компиляции выдаётся ошибка.

Изменено пользователем dm37

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dm37    54

То, что у меня получилось на C++, можно посмотреть здесь https://ru.files.fm/u/a2sfccuf#/list/, файл uC_cpp.7z

Внутри:
- пример с динамической индикацией (исходники + proteus)
- пример с LCD на HD44780 (исходники + proteus)
- небольшое описание

Микроконтроллеры ATtiny2313 и ATmega32, компилятор IAR

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Привет)
у меня возникла проблема с программированием микроконтроллера....
не могу понять как мне из 8 светодиодов сделать так скажем бегущую "змейку" из 4 светодиодов ? не подскажете как это на с++ оформить?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dm37    54

Ну если применительно к тому, что я писал, то:
- создать класс драйвера выходного устройства (например 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) для задания номера эффекта

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Сообщения

    • выкидываешь транзистор , выход РС2 подтягиваешь к +5в резистором 1-2кОм , подключаешь выход датчика к РС2, подаешь на датчик питание +5в
    • да ни вопрос http://forum.cxem.net/index.php?/topic/99351-усилитель-для-rgb-ленты/&do=findComment&comment=1470140 оптрон заменишь на транзистор и будет тебе счастье  
    • Пушкина я читал, причем не буквы повторяя, а вникая в смысл написанного. У лукоморья дуб зелёный, златая цепь на дубе том. Поэтом описано АФУ, сооруженное на изгибе линии берега, на морском полуострове, т.е. в точке, благоприятной для приёма. И днем и ночью кот ученый всё ходит по цепи кругом. Поэт завуалировал словом "КОТ"  ни что иное, как ТОК, который циркулирует в цепи АФУ и подчёркивает, что ток тот не простой, а учёный, т.е. содержащий в себе учение, обученный, т.е. говоря нынешними понятиями ток модулированный, несущий на себе сигнал. Идет направо - песнь заводит, налево - сказки говорит. Указано, что при ходе тока в правую (правильную) сторону возникает песня, правильно выделяется речевой сигнал, а при ходе "налево" возникает только "сказочка", т.е. относительно правильного тут речевой сигнал уже "никакой". Так поэт описал базовый принцип детектирования. Это Вам не Максвелл после настоечки, это физика как искусство, тут мало прочитать, это ещё суметь понять надо!    
    • В твоих скринах ГОСТа никаких 10-ти % не видно. То, что ты выделил, ты, хоть, сам читал? Причём тут предельные параметры и характеристики? Мы усилитель оцениваем на КАЧЕСТВО или когда он СЛОМАЕТСЯ? А те, другие, скрины, невемо откуда взяты, с какой интернет мусорки. Только это, явно НЕ ДОКУМЕНТ. Измерения какого нибудь глянцевого аудиожурнала.  Или "спеца", типа тебя. Я, уже 100500 раз писал, и, лично для тебя ещё раз не поленюсь написать - мощность при 10% КНИ измеряется исключительно в рекламных целях и ничего общего с качественным звуком не имеет. Не согласен? Твоё дело. Меряй при 10-ти, меряй при 40-ка, меряй при 10-ти кратной перегрузке. И впаривай эту мощность покупателям. И называй её как хочешь - хоть шумовой, хоть пиковой, хоть музыкальной, хоть запредельной. Все эти эпитеты для того и придуманы, чтобы мозги пудрить. Чтобы реальный качественный Ватт как 100500 продать. Давай глянем на спецификации Dynaco ST-70 Люди, как молитву, повторяют - 35 Ватт, 1% или менее. Да, не спорю - они упоминают и цифру в 80 Ватт пика. Но, скромно умалчивают об искажениях на этой мощности. Ибо, нечем там хвалиться. Твк, что, раз поклонившись богу Рекламы, специалисты фирмы дальше говорят только о реальной качественной мощности. Понимая, что усилитель покупается не для утюги греть. Василичь! Сам понял, что сказал? Что значит - в 0,1 раза  всего?  В смысле, в 10 раз меньше? Эх, "инженер", "инженер".... Где тебя, только, математике учили?    
    • или к примеру вот такая схема http://eldigi.ru/articles/tachometer_attiny2313 к ней можно подключить индуктивный или от автомобиля датчик оборотов? если да то как это сделать?