Гость Игорь

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

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

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

Добрый день!

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

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

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


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

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

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

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

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

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

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


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

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

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

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


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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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


 

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


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

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

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

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


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

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

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


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

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

 

 

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


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

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

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

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

Загрузка...

  • Сообщения

    • по интересам или профессии? для этого надо много денег. правильно сказали выше, начинать с малого, с обычного инвертора, дальше больше... Тренироваться на железе, а потом переходить на алюминий...
    • Да забанить этого трoлля давно пора уже. Не поверю, что можно задавать такие идиотские вопросы на полном серьёзе.
    • Ну что вы! Там же нет кривых проволок и ржавых ключей, зато есть формулы и нормальные схемы - кто ж такой ерундой будет заниматься?! Там же наука, а не чудеса... Вы дайте ссылку, где в кучу говна воткнута соломина, а на ней висит неонка и светится... вот это будет экс а-ля Кеша-стайл
    • понятие нуля и земли ближе к электротехнике, если брать низковольтные схемы то там более применимо понятие - "общий провод". Это провод относительно которого проводятся все измерения в схеме. На этом проводе может быть как минус питания так и плюс. Смысл в том что создатель схемы обозначает относительно какого провода будут проводится измерения в схеме. Понятие ноль по сути обозначает отсутствие напряжения если взять сетевое напряжение то на нулевом проводе будет 0 вольт а на фазном 220В эффективного переменного напряжения. Земля это защитный провод который соединяется через землю ( в виде например штыря забитого в землю) с таким же проводом на подстанции и если происходит утечка напряжения на корпус электрооборудования который должен быть заземлен то получается короткое замыкание из-за которого должны сработать автоматические выключатели или устройство защитного отключения. Но это целая большая тема. Если интересно гуглите ПУЭ раздел заземление ну или статьи про заземление. и ноль кстати может быть соединен с землей а может быть отдельно от земли, тогда это называется рабочий ноль а земля - защитный ноль. Вообщем гуглите. Есть хорошие статьи описывающие все подробно в картинках про заземление. ну и как написали выше в вашем случае в схеме применяется двух полярное питание. +20В, -20В и общий провод. Просто в одной части схемы все напряжения относительно общего провода будут иметь положительную полярность, а в другом участке схемы отрицательную.
    • Если человек этот вам не знаком, вы его не узнаете, а лица с такого расстояния и под таким углом камера не зафиксирует. А вот если поставить камеру в машину, за задним стеклом, то вполне возможно. Причем, и камеру можно использовать попроще, например, с USB интерфейсом + ноутбук. Естественно, все замаскировать.
    • Данный показометр можно откалибровать, или просто определить погрешность измерения, что уже не мало..
    • Добрый день! У меня такой вопрос. Собрал Терминатор-3, но чувствительности даже при выставленной шкале металов добиться не удалось. Собственно вопрос: Могут ли параметры катушки повлиять на чувствительность. (DD Намотка 30 витков в паралель 0.4)? На схеме автора данного МД возле катушки стоит индуктивность 1,62Mh У меня же получилась 1,92 Mh и приемная и передающая. При конденсаторе в 100нФ частота в районе 11,2кГц.