Easyelectronics.ru

Электроника для всех
Текущее время: 10 авг 2020, 06:59

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 407 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 17  След.
Автор Сообщение
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 09 сен 2017, 13:47 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
Описал и так и так, там разберусь

Инверсия и возможность задать моду в шаблоне очень удобны когда шаблон с раскрытием сразу отдаешь в какой то другой шаблон
Например шаблон обработки надатий кнопки логику строит от логической единицы, кнопку на gnd туда можно передать с инверсией больше ничего не делая
Другой пример - 7 сегментный дисплей. Класс анод и катод становятся одинаковыми если сами пины можно инвертировать

Вопрос. В вашем примере PinMode это класс в котором задан enum? А какого типа обьявлен параметр метода куда этот enum передается как параметр? Как int?
Бывает прлезно описывать enum как тип, тогда и некоторые редакторы дают подсказки и компилятор делает проверки соответствия. Но описывать все это неудобно, надо сначала typedef enum описать и только потом класс

Удалось описать шаблон gpio для stm8 без макроса, передавая порты как volatile unsigned char *
Может есть какой то трюк сделать так же для avr-gcc?


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1235
axill писал(а):
Инверсия и возможность задать моду в шаблоне очень удобны когда шаблон с раскрытием сразу отдаешь в какой то другой шаблон
Например шаблон обработки надатий кнопки логику строит от логической единицы, кнопку на gnd туда можно передать с инверсией больше ничего не делая
Другой пример - 7 сегментный дисплей. Класс анод и катод становятся одинаковыми если сами пины можно инвертировать

Многое зависит от стиля программирования и применяемого мк. Или дисплеев. Динамическую индикацию, например, можно повесить на DMA, в таком случае инвертированный класс пина ничем не поможет.

Цитата:
Вопрос. В вашем примере PinMode это класс в котором задан enum? А какого типа обьявлен параметр метода куда этот enum передается как параметр? Как int?
Бывает прлезно описывать enum как тип, тогда и некоторые редакторы дают подсказки и компилятор делает проверки соответствия. Но описывать все это неудобно, надо сначала typedef enum описать и только потом класс

PinMode - это строгое перечисление, enum class.

Цитата:
Удалось описать шаблон gpio для stm8 без макроса, передавая порты как volatile unsigned char *
Может есть какой то трюк сделать так же для avr-gcc?

На STM32 я делаю так:
Код:

template<uint32_t gpio, uint32_t pin, uint32_t af>
class PinT
{
public:
    static constexpr auto base() { return (GPIO_TypeDef*)gpio; }
    ....
};
template<uint32_t pin, uint32_t af = 0>
using PinA = PinT<GPIOA_BASE, pin, af>;


В gcc 5 можно было сделать чуть проще, в 6-м такое уже не работало...

Для AVR в том же gcc можно так:
Код:
template<int port, uint8_t pin>
class PinT
{
public:
    static constexpr uint8_t* PORT = (uint8_t*)port;
    static constexpr uint8_t* DDR = (uint8_t*)(port - 1);
    static constexpr uint8_t* PIN = (uint8_t*)(port - 2);
    ....
};

template<uint8_t pin>
using PinA = PinT<(int)&PORTA, pin>;


ps. забыл volatile для AVR, я для него давно не писал, а когда писал, то еще не на плюсах...


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
спасибо

печалька, но enum class в IAR не работает
а у вас для STM32 какой компилятор?

для avr заработало
а у всех МК атмела пименима эта логика? что порты идут адресами в этой последовательности:
Код:
static constexpr uint8_t* out = (uint8_t*)port;
static constexpr uint8_t* ddr = (uint8_t*)(port - 1);
static constexpr uint8_t* inp = (uint8_t*)(port - 2);


правильно понимаю, что:
Код:
template<uint8_t pin>
using PinA = PinT<(int)&PORTA, pin>;


эквивалент:
Код:
template<uint8_t pin>
class PinA : public PinT<(int)&PORTA, pin> {};


т.е. частичная специализация с переименованием


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1235
axill писал(а):
печалька, но enum class в IAR не работает
а у вас для STM32 какой компилятор?

У меня gcc 6.2.

Цитата:
для avr заработало
а у всех МК атмела пименима эта логика? что порты идут адресами в этой последовательности:
Код:
static constexpr uint8_t* out = (uint8_t*)port;
static constexpr uint8_t* ddr = (uint8_t*)(port - 1);
static constexpr uint8_t* inp = (uint8_t*)(port - 2);

По идее да, но не уверен. Я это писал когда уже с AVR дела не имел, проверял только на mega88.

Цитата:
правильно понимаю, что:
Код:
template<uint8_t pin>
using PinA = PinT<(int)&PORTA, pin>;


эквивалент:
Код:
template<uint8_t pin>
class PinA : public PinT<(int)&PORTA, pin> {};


т.е. частичная специализация с переименованием

В данном контексте using - это более продвинутая версия typedef.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
Reflector писал(а):
По идее да, но не уверен. Я это писал когда уже с AVR дела не имел, проверял только на mega88.

ясно, будет надежнее передать все три в шаблон

Reflector писал(а):
В данном контексте using - это более продвинутая версия typedef.

но результат то одинаков))
вчера как раз искал такую конструкцию и додумался только до наследования.
хорошо, буду применять using

а если я конвертирую enum class в инт то получу правильное значение? т.е. значение выбранной константы


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
облом - IAR не понимает такую конструкцию с using


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1235
axill писал(а):
а если я конвертирую enum class в инт то получу правильное значение? т.е. значение выбранной константы

Естественно, конвертируй в какую хочешь сторону. Тут другая проблема, т.к. нет неявного приведения к int, то для тех же битовых операций приходится приводить типы явно, что довольно громоздко. Я где-то подсмотрел такое решение:
Show

Тогда можно сделать так:
Код:
enum class Color { Red, Green, Blue };
DeclareEnumOp(Color);

Color color = Color::Red | Color::Blue;

axill писал(а):
облом - IAR не понимает такую конструкцию с using

Можно, конечно, обойтись и typedef...
Код:
template<uint32_t pin> struct PinA
{
   typedef PinT<GPIOD_BASE, pin> type;
};

PinA<2>::type led;


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
::type здесь выглядит лишним
А с наследованием как я пишу какие то проблемы?


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1235
axill писал(а):
::type здесь выглядит лишним
А с наследованием как я пишу какие то проблемы?

Да нет, делай как больше нравится.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
ну там где using работает буду его использовать, а где нет то наследование

димо придется исходить из некого минимума фич, IAR тут самый отсталый
правда я еще Keil не тестировал , он под stm32 у меня будет


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

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 27
почитайте это "Работа с портами ввода-вывода микроконтроллеров на Си++"
http://easyelectronics.ru/rabota-s-port ... na-si.html


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
technik-1017 спасибо, выше уже прозвучало решение


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
Переписал небольшой проект для stm8 на с++
Получил гибкость и многоплатформенность которой добивался
Исполняемый код один в один как в сишной версии, а вот рам вырос на 200 с лишним байт, т.е чуть меньше чем в два раза
Как теперь понять где надо подкрутить, чтобы были меньшие завтраты?


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

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 27
>> Как теперь понять где надо подкрутить, чтобы были меньшие завтраты?

можете выложить проект?


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
стал делать новый проект и столкнулся с тем, что в пустом проекте С++ IAR STM8S 524 байта read write memory то есть как я понимаю RAM
загадка


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1235
axill писал(а):
стал делать новый проект и столкнулся с тем, что в пустом проекте С++ IAR STM8S 524 байта read write memory то есть как я понимаю RAM
загадка

На STM32 С++ проект мигающий светодиодом отжирает 28 байт RAM.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
не знаю, может что то не так понял с IAR


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1235
Может в ключах дело, каких-то аналогах -fno-exceptions -fno-rtti из gcc, но 524 байта - это в любом случае перебор.


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

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 27
может стек много берёт


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
ключи все пересмотрел, там есть только разные виды оптимизации и что-то что называется data-model
написал в профильную тему, может подскажут
стек было бы странно если бы система создавала стек размером с половину всей рам. хотя кто знает, может резерв на хранение экземпляров класса
ощущение, что это именно какой то резерв, так как он практически не отличается между пустой программой и программой на пару сотен строк кода
вернусь к этому позже

а вот другой вопрос по теме
если не брать во внимание enum class (не поддерживается IAR) то как лучше описывать списковые значения?
вариант 1:
Код:
namespace PinMode { enum { Input, Output }; }

вариант 2:
Код:
class PinMode { enum { Input, Output }; }


или какой то третий вариант?


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
и еще вопрос к тому, что выше
структуру сообщения описывать лучше по старинке как struct только с полями или же как class/struct с методами?
речь про структуру описывающую данные для передачи через интерфейс

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


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

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 27
сейчас проверил в IAR для STM8 v2.20.2:
пустой проект для STM8S003F3 при значениях Stack size (bytes) = 200 (по умолчанию) будет "524 bytes of readwrite data memory"
для Stack size (bytes) = 20 будет "44 bytes of readwrite data memory"


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
спасибо, то есть это все резерв для стека?
по идее все локальные переменные тоже в стеке хранятся?
т.е. это по идее резерв который расходуется на исполнение кода


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 703
Откуда: Германия
axill писал(а):
и еще вопрос к тому, что выше
структуру сообщения описывать лучше по старинке как struct только с полями или же как class/struct с методами?
речь про структуру описывающую данные для передачи через интерфейс

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


class/struct отличаются ровно одной вещью - в классе по умолчанию все члены частные, в структуре - публичные. Т.е.
Код:
class A {
  public:
};


полностью эквивалентен
Код:
struct A {
};


И не виртуальные методы не добавляют данных в структуру. Т.е. - без разницы.


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 703
Откуда: Германия
axill писал(а):
стал делать новый проект и столкнулся с тем, что в пустом проекте С++ IAR STM8S 524 байта read write memory то есть как я понимаю RAM
загадка


Ну так взять и посмотреть в *.map


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 407 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 17  След.


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


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

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


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

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

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