Easyelectronics.ru

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

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



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

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

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 52
Откуда: Нижний Новгород
Функции для работы с неким 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
Сообщения: 52
Откуда: Нижний Новгород
evsi писал(а):
kokuam писал(а):
Интересно как прописать такую зависимость в библиотечный статический класс от локального класса не потратив ни байта оперативки?

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


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


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

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

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


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

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

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
Сообщения: 988
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
Сообщения: 52
Откуда: Нижний Новгород
да, верно, если всё лежит в одном .h-файле то работает


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

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

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


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

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

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

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


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

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


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

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

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

jmp __vector_1
jmp __vector_2
jmp __vector_3
...

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

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


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

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

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

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

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


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

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 52
Откуда: Нижний Новгород
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
Сообщения: 842
С учетом оптимизации, может оказаться, что это исполняется так же быстро, как и непосредственное объявление статического метода класса в качестве обработчика.


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

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



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


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

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

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


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

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


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

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


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

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

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