• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
Гость Игорь

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

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

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

Добрый день!

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

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

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Alex    525
2 минуты назад, Гость Игорь сказал:

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

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

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


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

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

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

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


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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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


 

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


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

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

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

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


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

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

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


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

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

 

 

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    525
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 смайлов.

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

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

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

Загрузка...

  • Сообщения

    • Я не понимаю твоей проблемы. Тебе нужно три этапа пройти: 1. Берём шунт на нужный ток. В простом случае - резисторы по 0.1-0.2Ом 2Вт, в ещё более простом - кусок нихрома или манганина нужной длины под нужный ток(что бы не раскалялась и не отпаивалась). Подобрать по сопротивлению нужно. (для этого нужно знать, какой ток какому напряжению соответствует, а там по закону Ома считать) 2. Устанавливаем ток 1-10 ампер. (любой источник с амперметром и нагрузкой) 3. Подстраиваем амперметр. (крутим резистор тока) Подстроечники полюбому нужно крутить, имея заведомо точный прибор для измерения напряжения\тока. Так как они обычно плюс-минус километр показывают, или вообще не настроены. Или настроив на 10 вольт, на 20 вольт и на 5 вольт будет погрешность, а на 10В точно показывать.
    • На коллекторе 316 какое напряжение?
    • @LA5 А какие там токи рабочие через R8 ?   МОСФЕТ, как бы в линейном режиме, в классе "А" находится. И  эмиттерный повторитель,.. он же самый широкополосный.   Заодно, а нужна ли вольтодобавка? Прикрутил к выходу корректора идеальный повторитель вместо паралельника. Поскольку идеальный повторитель не вносит искажений, то на нагрузке останется что-то от корректора при бутстрипе и без: С бутстрипом покрасивше выглядит.
    • вот я тоже думаю, баланс на контрольных точках же месте. Кстати, а какую шину вы имели в виду?
    • @RIMUS1989i Работу ЭА не смотрели?
    • Не, на месте она. сейчас внимательно осмотрел дорожки, на всякий заменил R326 а вместо R328 хочу приколхозить подстроечник на 1 ком, посмотрю что с режимом будет... Уже вопрос принципа ) То, что напруга чуть выше чем на схеме, это же не принципиально?