Easyelectronics.ru

Электроника для всех
Текущее время: 18 окт 2019, 19:22

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 20 сен 2018, 00:08 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 53
Откуда: Нижний Новгород
Функции для работы с неким LCD экраном собираются в библиотеку. Обычно в ней описан класс. В начале программы мы создаем его экземпляр, передавая параметры в конструкторе : LCD lcd(pin1,pin2,pin3). Дальше работаем с экземпляром, через его методы, например lcd.print("Hello World");

Особенность МК-based устройств в том, что в 99.99% случаев у них один экран, один GPS, одна клавиатура и т.д. А памяти очень мало. Поэтому я сделал все классы в таких библиотеках полностью статическими и не трачу память на экземпляры класса. Все параметры устройства хранятся в тоже статическом классе Settings, а не в членах lcd. В LCD определяются поля вида static const uint8_t dcPin = Settings::lcdDcPin и оперативная память не тратится. Такой периферии и параметров много и памяти экономится прилично.
Всё хорошо пока не нужно использовать эту библиотеку(библиотеки) в нескольких проектах. У них класс LCD у всех один, но он зависит от класса Settings, а он в каждом проекте свой.

Интересно как прописать такую зависимость в библиотечный статический класс от локального класса не потратив ни байта оперативки?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 20 сен 2018, 00:28 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2471
kokuam писал(а):
Интересно как прописать такую зависимость в библиотечный статический класс от локального класса не потратив ни байта оперативки?

Сделать класс экрана шаблоном, один из параметров которого - сеттингсы. Туда же (в параметры) можно и пины засунуть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 20 сен 2018, 03:49 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 53
Откуда: Нижний Новгород
evsi писал(а):
kokuam писал(а):
Интересно как прописать такую зависимость в библиотечный статический класс от локального класса не потратив ни байта оперативки?

Сделать класс экрана шаблоном, один из параметров которого - сеттингсы. Туда же (в параметры) можно и пины засунуть.


Спасибо! получилось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 20 сен 2018, 07:06 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Грызёте плюсы?
Поддерживаю!

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 20 сен 2018, 19:10 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 53
Откуда: Нижний Новгород
только вот засада, внутри класса могу инициализировать только статический указатель на встроенный в статический шаблонный класс объект

template<class T>
class SmartLed_T {
...
inline static Adafruit_NeoPixel* pixel = new Adafruit_NeoPixel( 1, T::led_din, NEO_GRB + NEO_KHZ800 );
...
}

раньше, до того как класс стал шаблонным у меня было так :
в .h - файле: static Adafruit_NeoPixel pixel;
в .cpp - файле : static Adafruit_NeoPixel SmartLed::pixel( 1, Settings::led_din, NEO_GRB + NEO_KHZ800 );

а теперь не получается именно объект создать внутри класса, ни в .h файле ни в .cpp
пытался так, в .cpp : template<class T> Adafruit_NeoPixel SmartLed_T<T>::pixel( 1, T::led_din, NEO_GRB + NEO_KHZ800 );
даже так, заменив T::led_din на константу 12 template<class T> Adafruit_NeoPixel SmartLed_T<T>::pixel( 1, 12, NEO_GRB + NEO_KHZ800 );

всё равно компилятор ругается :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 20 сен 2018, 20:11 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1016
kokuam писал(а):
всё равно компилятор ругается :(

Код:
class One
{
public:
   One(int x) : x(x) {}
   int x;
};

template<class T>
class SmartLed
{
public:
   SmartLed() : one(10) {}
   
   One one;
   static One two;
};

template<class T>
One SmartLed<T>::two(20);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 20 сен 2018, 23:24 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 53
Откуда: Нижний Новгород
да, верно, если всё лежит в одном .h-файле то работает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 20 сен 2018, 23:34 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1016
kokuam писал(а):
да, верно, если всё лежит в одном .h-файле то работает

Все делать в хедерах - это основной подход при работе с шаблонами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 14 окт 2018, 17:17 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 53
Откуда: Нижний Новгород
Подскажите пожалуйста, как сделать статическую функцию класса обработчиком прерывания?
А лучше не просто класса, а шаблонного класса.

Пока выкручиваюсь так - обработчиком является внешняя функция, а из нее вызываются статические методы класса:
extern "C" void __vector_7 (void) __attribute__ ((signal,used, externally_visible)) ;
void __vector_7 (void){
...
}

Но класс надо сделать шаблонным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 15 окт 2018, 14:26 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 851
А что говорит компилятор при попытке использовать в таком же ключе статическую функцию класса?
(Хотя понятно, что на extern"C" ругается)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 15 окт 2018, 14:39 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 851
Предлагаю изменить семантику таблицы прерваний в скрипте линковки.

Там у вас, видимо, жестко прописано в ассемблере что-то вроде:

jmp __vector_1
jmp __vector_2
jmp __vector_3
...

Можно сборку таблицы прерываний делать с помощью:
SORT(.vector.*)

А обработчики объявлять как __action__((section(.vector.7)))
Тогда по идее должно получиться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 15 окт 2018, 14:47 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 851
Я у себя делаю немного по другому:

У меня все обработчики прерываний вызывают функцию do_irq с аргументом-номером прерывания.
А do_irq в свою очередь смотрит в специальный массив, с элементами вида:

struct irq_record {
void(*handler)(void*);
void* handarg;
};

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 16 окт 2018, 00:47 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 53
Откуда: Нижний Новгород
Mirmik писал(а):
Я у себя делаю немного по другому:
...


вот и я сейчас так-же делаю: создаю внешнюю функцию, объявляю ее с фиксированным именем (__asm __) ( как я понимаю extern "C" делает тоже самое) и из нее вызываю статический метод.

void __vector_7 (void) __asm__("__vector_7") __attribute__ ((signal, used, externally_visible));
void __vector_7 (void){
Buzzer::isr();
}

Но в идеале хочется шаблонный класс


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 17 окт 2018, 14:04 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 851
С учетом оптимизации, может оказаться, что это исполняется так же быстро, как и непосредственное объявление статического метода класса в качестве обработчика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 31 май 2019, 21:15 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Тоже начал ваять на плюсах.
Сразу же "открытия" ...
Напрмер в классе System объявляю экземпляр класса Display.
Так вот, если объявляю его статическим, то сначала вызывается конструктор класа System,
а потом конструктор класса Display.
Если же не статическим объявляю, то наоборот - сначала вызывается конструктор класса Display, а затем уже класса System.
В статических методах только статически объявленные методы и поля можно использовать, тут тоже нестыковки получаются (по вышеописанным причинам).
Например мне надо чтобы сначала конструктор Display отработал, но объявить его нестатическим не могу, так как мне нужно обратиться к его методу в статическом методе класса System.
Противоречие.
Хочу попробовать создавать экземпляры через new и использовать указатели.



В общем - не все гладко, но интересно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 31 май 2019, 23:36 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1016
Pingvin писал(а):
Напрмер в классе System объявляю экземпляр класса Display.
Так вот, если объявляю его статическим, то сначала вызывается конструктор класа System,
а потом конструктор класса Display.

Проверь получше, конструктор статического класса должен еще до main() вызываться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 01 июн 2019, 00:36 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 173
Pingvin писал(а):
Напрмер в классе System объявляю экземпляр класса Display.
Так вот, если объявляю его статическим, то сначала вызывается конструктор класа System,
а потом конструктор класса Display.
Если же не статическим объявляю, то наоборот - сначала вызывается конструктор класса Display, а затем уже класса System.

Статические данные класса - по сути один глобальный объект на все экземпляры класса. А последовательность создания глобальных объектов стандартом не специфицируется - как линкер их разложил - так стартап-кот и будет дёргать за конструкторы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача параметров в библиотечный статический класс.
СообщениеДобавлено: 01 июн 2019, 13:03 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1016
siarzhuk писал(а):
А последовательность создания глобальных объектов стандартом не специфицируется - как линкер их разложил - так стартап-кот и будет дёргать за конструкторы.

Нужно писать на современном С++, inline переменные из С++17 решают многие проблемы т.к. конкуренции между разными единицами трансляции просто не будет. А если в одном cpp определяется и инитится статический экземпляр Display, а в другом создается экземпляр System, то будет неопределенность. Раньше для глобальных переменных всякие статические lazy функции использовали, теперь это все не нужно...


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

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


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

Сейчас этот форум просматривают: _pv


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

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

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