Например TDA7294

Форум РадиоКот • Просмотр темы - C++ для микроконтроллеров
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 18, 2024 11:33:56

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: C++ для микроконтроллеров
СообщениеДобавлено: Вс авг 20, 2017 18:49:37 
Родился

Зарегистрирован: Вс апр 02, 2017 18:20:34
Сообщений: 10
Рейтинг сообщения: 0
Хочу поделиться наработками по программированию микроконтроллеров на языке C++.

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

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

Всё находится здесь
https://ru.files.fm/u/a2sfccuf#/list/,файлuC_cpp.7z


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Вт авг 22, 2017 20:52:42 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 390
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7010
Откуда: Ижевск
Рейтинг сообщения: 0
Ахтунг! "Небезопасный источник."

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Чт авг 24, 2017 18:53:53 
Родился

Зарегистрирован: Вс апр 02, 2017 18:20:34
Сообщений: 10
Рейтинг сообщения: 0
Чем заходите?
Касперский определяет как "Безопасный веб-сайт (по данным Kaspersky Security Network)"

Файл прикрепил к сообщению


Вложения:
uC_cpp.7z [662.08 KiB]
Скачиваний: 283
Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Пн авг 28, 2017 15:26:13 
Друг Кота

Карма: 38
Рейтинг сообщений: 618
Зарегистрирован: Пн апр 06, 2015 11:01:53
Сообщений: 3092
Откуда: москва, уфа
Рейтинг сообщения: 0
не очень понятно пока, зачем. Классы со сплошь public static inline void методами - имхо маленько не то, ради чего стоит использовать плюсы.


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Пн авг 28, 2017 15:58:12 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
не очень понятно пока, зачем. Классы со сплошь public static inline void методами - имхо маленько не то, ради чего стоит использовать плюсы.

На самом деле все не так плохо, в эмбедде большинство методов и должны быть static и часто inline, хотя непонятно зачем автор при помощи #pragma явно заставляет компилятор инлайнить методы там, где они и так будут инлайниться согласно правилам языка. Вот если бы тут все методы были статические и не использовались шаблоны, тогда да, можно было бы спокойно заменить классы неймспейсами ничего особо не потеряв...


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Пн авг 28, 2017 16:45:09 
Родился

Зарегистрирован: Вс апр 02, 2017 18:20:34
Сообщений: 10
Рейтинг сообщения: 0
>> имхо маленько не то, ради чего стоит использовать плюсы
К сожалению C++ для ПК и для микроконтроллеров отличается. Нельзя многое из ПК использовать в микроконтроллерах - микроконтроллер не справиться, ну и стиль программирования для микроконтроллера не имеет смысла для ПК.
>> непонятно зачем автор при помощи #pragma явно заставляет компилятор инлайнить методы
наличие ключевого слова inline не означает, что компилятор обязательно будет инлайнить метод (по крайней мере в IAR), для принудительного "инлайнинга" необходимо использовать #pragma. Во многих местах можно #pragma убрать и ничего не измениться, но не везде (можете по экспериментировать). Для себя решил, что если метод должен инлайнится, то наличие #pragma обязательно (в основном это касается прерываний).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Пн авг 28, 2017 17:10:46 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
наличие ключевого слова inline не означает, что компилятор обязательно будет инлайнить метод (по крайней мере в IAR), для принудительного "инлайнинга" необходимо использовать #pragma. Во многих местах можно #pragma убрать и ничего не измениться, но не везде (можете по экспериментировать). Для себя решил, что если метод должен инлайнится, то наличие #pragma обязательно (в основном это касается прерываний).

А речь не про наличие inline, а про случаи типа таких:
Код:
class TCounter
{
public:
        #pragma inline = forced
        static inline void Init(void)
        {
            Recount = VALUE;
            FCounter::Reset();
        }
...
};

Тут не нужен ни inline, ни #pragma inline, в стандарте по этому поводу говорится следующее: A member function may be defined in its class definition, in which case it is an inline member function, or it may be defined outside of its class definition if it has already been declared but not defined in its class definition.

И почему этот метод принимает void?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Пн авг 28, 2017 18:29:26 
Родился

Зарегистрирован: Вс апр 02, 2017 18:20:34
Сообщений: 10
Рейтинг сообщения: 0
начну с "почему void".
Для определения переменной Recount необходимо указать тип. Тип для Recount определяется на стадии компиляции в шаблоне в зависимости от значения (у меня это 1000, т.е тип будет uint16_t).
Код:
typedef STATIC_TYPE_UNSIGNED_VALUE(Value) T;
static volatile T Recount;

Мне (по условию) не требовалось менять значение инициализации (Если алгоритм требует, то конечно можно и передать значение). Тогда будет так:
Код:
static inline void Init(T value )
{
    Recount = value;
    FCounter::Reset();
}

но тогда входное значение будет (должно) иметь тоже тип uint16_t. Если сразу задать тип для Recount, то придётся делать класс под каждый тип, что не целесообразно.

Ну и отсюда почему inline. Т.к. это шаблонный класс, и инициализация предполагалась только один раз поэтому код решил инлайнить, чтобы компилятор не оформил это в вызов метода.

Добавлено after 13 minutes 7 seconds:
вообще всё что связано с inline появилось после того как начал заниматься прерываниями в C++.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Пн авг 28, 2017 18:33:40 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
Dm37, я говорю совершенно о другом :) В С было так:
Код:
void func(void);

В С++ стало так:
Код:
void func();

Ты пишешь на С++, но местами как будто на С. Очень часто когда я вижу подобный код с ним в комплекте еще идут typedef struct и прочие пережитки чистого С.

Цитата:
Ну и отсюда почему inline. Т.к. это шаблонный класс, и инициализация предполагалась только один раз поэтому код решил инлайнить, чтобы компилятор не оформил это в вызов метода.

Еще раз повторяю, любой метод определенный в теле класса неявно является встроенным, т.е. инлайнится согласно правилам самого языка. Конечно можно явно прописать и inline со всякими прагмами, но это не имеет никакого значения.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Пн авг 28, 2017 18:50:23 
Родился

Зарегистрирован: Вс апр 02, 2017 18:20:34
Сообщений: 10
Рейтинг сообщения: 0
>> В С++ стало так:
я это знаю, это не нарушает синтаксис

>> struct
в любом учебнике по C++ struct показан как public класс

по поводу inline, C++ не работает с прерываниями, это надстройка embedded. Поэтому корректной работы от компилятора ждать не приходится, надо ему помочь (ещё раз повторюсь, что сначала не было inline, он появился только после работы с прерываниями, когда результат был отрицательный)

Я ждал замечаний не по поводу синтаксиса (что пока достаточно спорно), а по организации программы, ошибкам, рекомендации


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Вт авг 29, 2017 04:03:43 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Добрый день, с С++ совсем не знаком по этому и пишу, подскажите в нем есть более удобные способы/методы распараллеливания задач(на конечных автоматах), ну скажем вот в функции инициализации LCD,
Код:
        static void Init(void)
        {
            InitPorts();
            DELAY_MS(15);
            SetModeCmd();
            WriteCfg(0x30);
            DELAY_MS(4.1);
            WriteCfg(0x30);
            DELAY_US(100);
            WriteCfg(0x30);
            DELAY_US(100);
            WriteCfg(0x20);
            DELAY_US(100);
            Write(0x28);
            DELAY_US(40);
            Write(0x08);
            DELAY_US(40);
            Write(0x0C);
            DELAY_US(40);
            Write(0x01);
            DELAY_MS(1.6);
            Write(0x06);
      }

Что бы вместо DELAY_MS происходил выход в майн, и проход по всем остальным задачам.
В общем есть ли там более удобное использование switch case ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Вт авг 29, 2017 04:30:21 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
да ради бога, заходи по прерыванию таймера, а там уже свитч-кейсом выбирай какую часть кода выполнять.

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Вт авг 29, 2017 06:57:41 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
pokk писал(а):
Что бы вместо DELAY_MS происходил выход в майн, и проход по всем остальным задачам
как велико ваше желание выстрелить себе в ногу? какие-такие задачи требуют от вас этого самого "распараллеливания"? вы на 100% уверены, что это необходимо?

самый лучший совет, который я могу вам дать, повторяет суть принципа бритвы Оккама: не делай то, без чего можно обойтись.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C для микроконтроллеров
СообщениеДобавлено: Вт авг 29, 2017 07:27:51 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
DELAY_US нет смысла переделывать, а вот DELAY_MS особо если с большими цифрами, да работающий внутри прерывания вполне может придать контроллеру некоторую ... туповатовть. (динам. индикация может подвисать, нажатие кнопки (не на INTе) может оказаться пропущенным, "собака" не кормлена...

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: C++ для микроконтроллеров
СообщениеДобавлено: Вт авг 29, 2017 08:25:25 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Да на все 100% уверен что надо, даже функцию инициализацию надо так как, весь маин состоит из параллельных частей, а индикатор может повисать,из за внешних помех, так что приходится его передергивать(пере инициализировать).


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y