Easyelectronics.ru

Электроника для всех
Текущее время: 26 май 2018, 05:03

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 407 ]  На страницу 1, 2, 3, 4, 5 ... 17  След.
Автор Сообщение
 Заголовок сообщения: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 15:10 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4930
Созрела у меня необходимость иметь набор простых механизмов для написания типовых задач под МК на базе AVR8, STM8S и STM32
Под это дело вызрел некий подход с активным применением макросов
Макросы применены для гибкости которой не хватает в обычном Си, но я сознательно отказался от использования С++
По двум основным причинам - С++ менее распространен и его полноценные реализации есть не для всех платформ, а так же потому, что он в значительной степени является не оптимальным по расходу ресурсов которые в МК довольно ограничены

https://github.com/axillent/stavr
статус такой - много что работает, выработан основной механизм кросплатформенности, для документирования выбран doxygen, но само документирования в начальной стадии
для затравки добавлены три варианта примеров blink которые будут с ходу работать на атмеле и на stm8s
поддержка stm32 пока отсутствует

кросс-платформенность реализована таким образом: есть файл stavr_platform.h который является корневым и должен исопльзоваться повсеместно
в нем определяется на какой платформе производится запуск и делаются минимальные первичные определения
поддерживаются Atmel studio для атмела и IAR для STM8S
для первого ничего дополнительно делать не нужно, эта среда сама выставляет переменные препроцессора для автоопределения платформы и типа МК
а вот для IAR нужно в настройке проекта задать руками переменнуую с типом МК, наример STM8S103F3
для STM32 нужно будет добавить свой вариант с поддержкой Keil

далее в файле stavr_uart.h например даны основные определения общие для платформ и идет include файлов с общим кодом из uart/uart.c и платформенным uart/uart_stm8s.c или uart/uart_avr.c

конструктивные замечания привествуются
так же привествуется участие в развитии, библиотека opensource и предполагается добавить туда все основные востребованные библиотеки от GPIO до работы с дисплеями и ethernet

при написании библиотек делается выбор - если по сути необходим единственный instance то в приоритете все определения задаются на стадии компилирования
если же возможны несколько instance то используется псевдо-с++, когда в макросе создается экземпляр необходимой структуры и она заполняется необзходимыми данными
там же определяются новые экземпляры функций с подстановкой внутри данной структуры

в какой то степени попытка сделать что то типа arduino, но есть принципиальные отличия:
- удобство и универсальность должны балансироваться с эффективностью кода. например GPIO имеет минимум накладных расходов в отличии от arduino где по сути встроен интерпретатор обращения к GPIO
- оптимальное использование ресурсов
- использование железа там где возможно, наример ADC реализован в двух вариантах одноканальном и многоканальном, но в обоих случаях измерения сделаны на прерываниях, а не на ожидании как в ардуино
- вместо С++ применяется Си с активным использованием макросов
- значительно более шировкий спектр встроенных библиотек
- использование native IDE

код пользовательской программы не во всех случаях будет 100% кросс-платформенным, сохраняется нотация в привязке к реальному железу
например UART0 есть в AVR, но его нет в STM8S, но подход к инициализации и к выхову будет одинаков и при желании можно в самой программе определять платформу и инициализировать то железо, под которое в данные момент делается компиляция
Собственно библиотека была задумана не для написания 100% переносимых программ, а для написания 100% переносимых библиотек
stavr я активно использую для написания своей библиотеки автоматизации

примеры блинков:
Show на цикле ожидания


Show на библиотечной функции delay


Show на кроссплатформенном таймере


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 16:04 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4930
еще два примера
Show ADC один канал, минимум ресурсов

Show ADC много каналов с oversampling


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 16:23 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1575
axill писал(а):
Макросы применены для гибкости которой не хватает в обычном Си, но я сознательно отказался от использования С++
По двум основным причинам - С++ менее распространен и его полноценные реализации есть не для всех платформ, а так же потому, что он в значительной степени является не оптимальным по расходу ресурсов которые в МК довольно ограничены


Распространенность достаточна, что бы об этом не заморачиваться. gcc есть почти под все (под STM8 нету, но там есть другие компиляторы). Наконец насчет "является неоптимальным" это весьма популярная чушь, которую регулярно повторяют, но никто не в состоянии доказать, поскольку она не соответствует действительности. Так что не сложно предположить, что на выходе получится очередной треш на макросах и С, который пополнит ряды библиотек полезных и интересных только автору.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 16:30 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2366
Откуда: КЧР, поселок Нижний Архыз
Ничего хорошего из всех этих "универсальных библиотек" не выходит. Как пример — всякое говно вроде SPL, калокуба и opencm3. Жуткая избыточность и тормоза.
Нет, все-таки, нет смысла пытаться сделать такую универсальную штуку. Все равно ведь придется ковыряться в RM и даташите на любой чих.
Самым правильным является набирать сниппетов, которые потом просто взял, и использовал с минимальной переделкой. А не то, что бродить по коду чужих библиотек в поисках, что ж эта функция делает и почему тупит как собака...

И да, крайне несогласен с предыдущим комментарием: С++ — говно. И уж на мелкоконтроллерах ему точно не место. Ему и на десктопе-то место лишь в GUI. Все остальное на нормальном С пишется без этой плюсовой содомии.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 16:40 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1575
Eddy_Em писал(а):
И да, крайне несогласен с предыдущим комментарием: С++ — говно.

Так обычно говорят те, кто не умеет его готовить.
Цитата:
И уж на мелкоконтроллерах ему точно не место.

Ему там самое место.
Цитата:
Ему и на десктопе-то место лишь в GUI.

Вот как раз в гуе ему точно не место. Есть куда более подходящие инструменты для этих целей.
Цитата:
Все остальное на нормальном С пишется без этой плюсовой содомии.

Содомия - это С с макросами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 16:46 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3072
Насчет С++ на РСДН тема разрослась :)

А вообще не только С++ хают в основном неосиляторы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 17:08 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4930
evsi писал(а):
ряды библиотек полезных и интересных только автору.


Это задача минимум, что либо сверх этого задача максимум

Все, что можно сделать на Си++ можно сделать на Си. Си++ это такая удобная надстройка которая избавляет от рутины и ряда типичных ошибок. Си с макросами избавляет от части рутины в Си при этом оставляет полные контроль над тем где и кааие данные распологаются, что во флэш, что в рам. Этот язык изначально для больших машин, где разделение по виду памяти лишено смысла и управлять этим разделением нет необходимости

Какие полноценные Си++ компиляторы есть для STM8 и для STM32?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 17:09 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3296
Откуда: Кемеровская область, Киселевск
Eddy_Em писал(а):
Ничего хорошего из всех этих "универсальных библиотек" не выходит. Как пример — всякое говно вроде SPL, калокуба и opencm3. Жуткая избыточность и тормоза.
Нет, все-таки, нет смысла пытаться сделать такую универсальную штуку. Все равно ведь придется ковыряться в RM и даташите на любой чих.

Для начинающих пойдет, да и опытные что-то черпанут/спиздят/подсмотрят. Свобода выбора есть, а там каждый сам для себя решит до какого уровня качать скиллы и что юзать.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 17:12 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4930
evsi писал(а):
Содомия - это С с макросами.

содомия всегда в головах)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 17:36 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3072
axill писал(а):
Какие полноценные Си++ компиляторы есть для STM8 и для STM32?


Для STM32 вроде как gcc и clang можно использовать.
Причем в Debian есть в стандартной репе пакет gcc-arm-none-eabi, в котором как раз arm-none-eabi-g++ лежит.

UPD Ну а clang надо собирать с нужным target`ом. В нем сейчас даже AVR прикрутили


Последний раз редактировалось fr0ster 11 июл 2017, 18:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 17:44 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4930
Eddy_Em писал(а):
Ничего хорошего из всех этих "универсальных библиотек" не выходит. Как пример — всякое говно вроде SPL, калокуба и opencm3. Жуткая избыточность и тормоза.
Нет, все-таки, нет смысла пытаться сделать такую универсальную штуку. Все равно ведь придется ковыряться в RM и даташите на любой чих.
Самым правильным является набирать сниппетов, которые потом просто взял, и использовал с минимальной переделкой. А не то, что бродить по коду чужих библиотек в поисках, что ж эта функция делает и почему тупит как собака...

в отличии от SPL я не претендую на всеобъемлищую унификацию
сниппеты хорошее дело, но и там возникает проблема правильного совместного сипользования множества всяких снипетов
при организации их в библиотеку получается как раз сделать их адаптацию под конкретную программу менее трудоемкой
макросы в общем то в каком то смысле и есть сниппеты...

из своего скромного опыта программирования МК вижу такой подход:
- разбиваем задачу на куски
- если под отдельную задачу есть готовый кусок библиотеки - юзаем, если нет то либо пишем кастомный код в самой программе или если видно, что такая же задача будет решаться еще сотню раз - пишем новый снипппет/макрос/хидер в библиотеку

например самое распространенное использование ADC - это непрерывное преобразование по одному или нескольким каналам
так и сделана моя примитивная библиотека, которая с точки зрения конечной программы решает эту задачу легко вне зависимости от платформы
но если потребуется какая то более сложная задача - наример преобразование по триггерам, то библиотеку в сторону и пишем по даташиту как на духу
фишка в том, что в 90% случаев это будет именно вариант - непрерывное преобразование....

или взять таймер. у меня его основная работа - это формирование временных событий или временных отсчетов кратных долям секунды, секундам или минутам
в библиотеки сейчас один вид таймера - такой в котором можно задать 1-3 вектора, для вызова каждые 100мсек, каждую секунду или каждую минуту
для львиной доли задач в моем случае этого достаточно без необходимости каждый раз что то там инициализировать, копи-пастить и отлаживать


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 18:03 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3296
Откуда: Кемеровская область, Киселевск
Да все нормально, пиши, а там время покажет.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 18:18 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 515
axill писал(а):
или взять таймер. у меня его основная работа - это формирование временных событий или временных отсчетов кратных долям секунды, секундам или минутам в библиотеки сейчас один вид таймера - такой в котором можно задать 1-3 вектора, для вызова каждые 100мсек, каждую секунду или каждую минуту для львиной доли задач в моем случае этого достаточно без необходимости каждый раз что то там инициализировать, копи-пастить и отлаживать

Т.е. помигать светодиодом раз в секунду на таймере я не смогу, только раз в 2 секунды? :) Или отсчитывать 10 раз по 100ms?

Eddy_Em писал(а):
И да, крайне несогласен с предыдущим комментарием: С++ — говно.

Просвещайся.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 11 июл 2017, 18:29 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4930
Reflector писал(а):
Т.е. помигать светодиодом раз в секунду на таймере я не смогу, только раз в 2 секунды? :)

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

ну а если нужна какая то другая задача, например моргать с частотой 38Кгц для IR, то это другая история, или касстомная или вопрос новой библиотеки как описано выше


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 00:22 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2366
Откуда: КЧР, поселок Нижний Архыз
Ох уж эти плюсеры... Говно ваш ЯП, и не переубедить вам меня! Он излишне усложнен. Самый оптимальный вариант — С. Это уже не ассемблер, но и еще не содомия вроде крестов, диезов или каких-нибудь go/D/etc.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 01:33 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3296
Откуда: Кемеровская область, Киселевск
c++ и не нужен в микроконтроллерах.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 10:18 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1575
axill писал(а):
Все, что можно сделать на Си++ можно сделать на Си.

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

При чем тут разделение по виду памяти?
Цитата:
Какие полноценные Си++ компиляторы есть для STM8 и для STM32?

Для STM32 (как и остальных армов) есть gcc.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 10:22 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1575
Eddy_Em писал(а):
Ох уж эти плюсеры... Говно ваш ЯП, и не переубедить вам меня!

Зачем вас переубеждать? Не хотите - не пользуйтесь.
Цитата:
Он излишне усложнен.

Эзоп, "Лиса и виноград": лиса не может достать виноград и говорит, что он зелен еще.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 10:28 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3072
Eddy_Em писал(а):
Ох уж эти плюсеры... Говно ваш ЯП, и не переубедить вам меня! Он излишне усложнен. Самый оптимальный вариант — С. Это уже не ассемблер, но и еще не содомия вроде крестов, диезов или каких-нибудь go/D/etc.


Про неумение готовить уже говорилось, но все же какой компайлер чисто Сишный не содомия тогда?
А что, в случае С++ ктото заставляет использовать фичи языка только потому, что они там есть?

ЗЫ А кстати, про С-- слышать приходилось?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 11:19 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1575
Oxford писал(а):
c++ и не нужен в микроконтроллерах.

Вообще-то там и С не сильно нужен. Есть, например, rust.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 13:05 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4930
evsi писал(а):
При чем тут разделение по виду памяти?


по вашему без разницы куда пойдет сотня другая виртуальных таблиц с данными экземпляров классов во флэш или в во флэш с перегрузкой в рам на старте?
нет, конечно если вы в проектах выбираете железо так, что его рам не используется и на половину, тогда это не важно
а в больших компьютерах это неважно еще и потому, что нет разделения

но вот знаете, во всякой мелочи типа avr8, stm8 или в некоторых cortex бывает ресурсов не так уж и много...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 14:21 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1575
axill писал(а):
по вашему без разницы куда пойдет сотня другая виртуальных таблиц с данными экземпляров классов во флэш или в во флэш с перегрузкой в рам на старте?

Ух как у вас все хреново-то со знанием плюсов. Наличие VMT вовсе не обязательно. Как и применение иерархий классов с виртуальными методами. Это так, к сведению.

P.S. почему-то каждый раз, когда кто-то выступает с такой аргументацией как у вас, на поверку обнаруживаются зияющие пробелы в знании С++.
P.P.S. даже не знаю, смеяться или плакать над фразой "виртуальная таблица с данными экземпляров классов". вы хоть в курсе, что именно лежит в VMT?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 14:22 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2896
axill писал(а):
по вашему без разницы куда пойдет сотня другая виртуальных таблиц с данными экземпляров классов во флэш или в во флэш с перегрузкой в рам на старте?
но вот знаете, во всякой мелочи типа avr8, stm8 или в некоторых cortex бывает ресурсов не так уж и много...

то что плюсы позволяют выстрелить себе в ногу куда более эффективно и гораздо большим количеством способов вовсе не означает что именно так и надо делать,
нахера вам в авр8 и стм8 с меньше чем килобайтом памяти множественные наследования, RTTI и прочая "содомия"?
тема-то про простую библиотеку, ну вот и давайте те кто тут так громко кричит и убеждает остальных, что плюсы не нужны
сделают на С без шаблонов так, чтобы в, например, циклический буфер из данной библиотеки положить можно было что угодно, а не только байт, ну надо мне например результаты АЦП в uint32_t буферизировать перед отправкой в УАРТ/запись во флэш, или даже структуру которая содержит несколько значений, помимо результата АЦП, время захваченное таймером, например, когда внешний триггер для ацп пришёл.
а потом сравним что получится по количеству написанного кода, по удобству использования и по оверхэду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 14:23 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1575
axill писал(а):
содомия всегда в головах)

Согласен. Именно потому я и написал:
evsi писал(а):
Содомия - это С с макросами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 июл 2017, 14:30 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1575
_pv писал(а):
сделают на С без шаблонов так, чтобы в, например, циклический буфер из данной библиотеки положить можно было что угодно, а не только байт

Хороший пример. Еще надо добавить "с проверкой типов, что бы не запихнуть в буфер что попало" :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 407 ]  На страницу 1, 2, 3, 4, 5 ... 17  След.

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


Кто сейчас на конференции

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


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB