Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2020, 09:34

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



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

Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 06 ноя 2016, 02:02 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Что-то в голове на данный момент каша. Проблема на данный момент следующая: вывод информации. Вывод может осуществляться на ЖКИ дисплей, на 7 сегментные индикаторы, в UART, наконец.
И каждый раз приходится переписывать модули. Так как на дисплей в своем формате, на светодиодные индикаторы в своем. В данный момент нужно выводить на 7 сегментные индикаторы. Притом по SPI (сдвиговые регистры). Это переделывать модуль чтобы вывести не на порты МК, а по SPI. Переделывать преобразование чисел, так как модуль написан под ЖКИ дисплей. Вдобавок, нужно определиться, чем считать SPI в данном случае. Этаким графическим модулем, или все-таки самостоятельным модулем, который не только вывод информации осуществляет.
Может кто-то уже двигался в этом направлении. Помогите определиться, свести свои наработки к некоему стандарту.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 06 ноя 2016, 13:52 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1946
Попробуйте разбивать модули на отдельные части - ввод, логика, вывод - так чтобы модули ввода и вывода не зависели от данных, а модули логики - от железа.
В случае с индикацией разные модули логики - это будут разные конверторы данных в байтики, а разные модули вывода - просто передача готовых байтиков в разную периферию.

_________________
mcu.goodboard.ru


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

Зарегистрирован: 02 май 2015, 16:16
Сообщения: 2071
ЧМО_OUT_LCD_Текст
ЧМО_OUT_LCD_Графика
ЧМО_OUT_SPI
ЧМО_OUT_UART
....


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

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1643
Откуда: Курск
Мне в этом плане симпатичен язык описания аппаратуры (hardware description language), вот где модульность
Программно, как и написали, разбивать на независимые модули


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

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Суперуниверсально не получится. Хотя бы потому, что на семисегментные индикаторы меньше влазит и не все символы отображаются.

Я с семисегментниками делал так - была такая структура:
Код:
typedef struct
{
    char data[4];
    uint8_t attr;
    uint8_t disp_time;
} LCD_data;

соответственно массив структур - циклично отображаются на экране в течение disp_time*100ms
attr - битовая маска, два бита на символ, показывает стиль отображения символа:
00 - просто отображается
01 - мигает с частотой 2 Гц (медленно)
10 - мигает с частотой ~10 Гц (быстро)
11 - мигает медленно, но на месте символа отрисовывается "курсор" (нижний сегмент)

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

Соответственно, та часть программы, которая отвечала за SPI или динамический ногодрыг - обращалась только к этим данным.

И правило - разделять модули, давать им четкий интерфейс. Вот проектирование этого интерфейса - это и есть работа разработчика. Я посчитал, что мигание символа и переключение "экранов" нужно перенести на уровень ниже, и логика верхнего уровня об этом уже не парится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 06 ноя 2016, 16:00 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Спасибо лично от меня за соотношение "полсекунды - обозначение, секунду - значение". Очень правильная идея, запомню, вдруг пригодится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 06 ноя 2016, 18:30 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Ну как бы данные у меня отвязаны от модулей. Модули общаются меж собой флагами, сообщениями. К примеру, модуль АЦП. В прерывании по окончании преобразований выставляется флаг. Модуль АЦП при выставленном флаге готовит данные, выставляет сообщение. Модуль вывода информации при наличии этого сообщения и соответствующем состоянии меню выводит данные в буфер дисплея. Модуль дисплея уже тупо по времени кидает данные из буфера на экран.


Последний раз редактировалось demiurg1978 06 ноя 2016, 19:38, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 06 ноя 2016, 19:25 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1946
Если модуль АЦП только пишет куда-то код АЦП, а модуль дисплея только читает откуда-то биты сегментов, и ни тот, ни другой ничего не знают ни о каких числах, тогда данные отвязаны

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 06 ноя 2016, 19:38 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Затруднения на данный момент:
Первое:
Show Семигментные индикаторы


Show LCD


Делаю задел на будущие проекты. Как видно, названия созвучны. Если используется и ЖКИ и семисегментные индикаторы, то как быть? Дать соответствующие названия функциям или тут нужен другой подход.

Как бы в данный момент можно и плюнуть на затруднения. Проект на семигментных индикаторах. Но! Изначально был сделан для ЖКИ. Стал переделывать на семисгментники. Столкнулся с тем, что нужна отладка. А отладочный инструмент у меня только один. 20x4 ЖКИ. И тут началось. Названия функций созвучны, данные для дисплеев разные и так далее.
То есть, нужно выводить и на ЖКИ и на семигментники...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 06 ноя 2016, 21:04 
Заглядывает иногда

Зарегистрирован: 29 сен 2011, 12:23
Сообщения: 98
Откуда: Санкт-Петербург
demiurg1978 писал(а):
Как видно, названия созвучны. Если используется и ЖКИ и семисегментные индикаторы, то как быть? Дать соответствующие названия функциям или тут нужен другой подход..

Да, здесь нужен другой подход. И он называется "пространство имен". А такая штука есть в C++.
С++ не заставляет сразу использовать наследование, полиморфизм, шаблоны и т.д.
Если вам нужны пространства имен, используйте только их.

Будет у вас так, в модулях Lcd и семисегментном:
Код:
namespace Lcd {

void printChar(char c)
{}

}

namespace Led {

void printChar(char c)
{}

}


А вызывать будете так:
Код:
char c = 'A';
Lcd::printChar(c);
Led::printChar(c);


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

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 618
Откуда: Челябинск
demiurg1978 писал(а):
Что-то в голове на данный момент каша. Проблема на данный момент следующая: вывод информации. Вывод может осуществляться на ЖКИ дисплей, на 7 сегментные индикаторы, в UART, наконец.
И каждый раз приходится переписывать модули. Так как на дисплей в своем формате, на светодиодные индикаторы в своем. В данный момент нужно выводить на 7 сегментные индикаторы. Притом по SPI (сдвиговые регистры). Это переделывать модуль чтобы вывести не на порты МК, а по SPI. Переделывать преобразование чисел, так как модуль написан под ЖКИ дисплей. Вдобавок, нужно определиться, чем считать SPI в данном случае. Этаким графическим модулем, или все-таки самостоятельным модулем, который не только вывод информации осуществляет.
Может кто-то уже двигался в этом направлении. Помогите определиться, свести свои наработки к некоему стандарту.

SPI - всего-навсего интерфейс для обмена данными с периферией. Периферийные устройства могут быть различными: АЦП, ЦАП, RTC и т.д. Поэтому можно написать отдельный програмный драйвер, с которым данными обмениваются различные программые модули. С точки зрения драйвера абсолютно безразлично, что выполняет тот или иной программый модуль. Для драйвера важно знать откуда поступают данны на вывод, сколько этих данных, где разместить входные данные и что делать по завершению передачи данных.
То же самое справедливо и для дургих интерфейсов:UART, I2C...
Например, запрос к SPI может выгядеть так:
Код:
void SPI_rq (char *buffer, char size, char *flags);  // SPI request function prototype

Здесь: buffer - адрес буфера;
size - размер блока данных;
flags - содержит различные данные (направление передачи, статус завершения и т.д.).
Чтобы не расписывать это все многократно, можно офрмить параметры в виде единой структуры.
Более того, такой же запрос может быть сделан к любому другому драйверу и тогда его можно будет достаточно просто унифицировать. Только нужно в запросе дополнительно указать тип интерфейса. Правда, при этом потребуется дополнительный программный модуль - диспетчер УВВ. А там и до ОС будет недалеко. Или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 07 ноя 2016, 12:16 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Bill писал(а):
...

Вопрос про SPI на данный момент не остро стоит. На будущее. SPI, UART - сводится к общему знаменателю. В принципе вы четко сформулировали то, что хотел бы знать.

Проблема в следующем. Делаю один проект, так как на руках не было семисегментных индикаторов, начал делать прототип на ЖКИ дисплее 20x4. Так как он более чем избыточен, использовал ЖКИ как и обычно, как отладочный инструмент. Чтобы выводил наружу требуемые переменные, состояние периферии МК. Пришли семисегментные дисплеи. И так как проект не закончен, нужна отладка, соответственно ЖКИ. То есть одновременная работа семисегментников и ЖКИ. Проблема возникла в том, что многие функции и переменные модулей ЖКИ и семигментников созвучны.
dsp_buf,
clr_dsp_buf,
print_char,
print_buf,
print_val_u08,
print_val_u16,
print_val_u32,
Вот тут я и застопорился. Как мне быть. Соответственно обзывать переменные и функции или тут нужон другой подход.
Тут подсказали, что нужен C++. А я на нем не пишу.


Последний раз редактировалось demiurg1978 07 ноя 2016, 12:27, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 07 ноя 2016, 12:26 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 618
Откуда: Челябинск
demiurg1978 писал(а):
Bill писал(а):
...

Вопрос про SPI на данный момент не остро стоит. На будущее. SPI, UART - сводится к общему знаменателю. В принципе вы четко сформулировали то, что хотел бы знать.

Проблема в следующем. Делаю один проект, так как на руках не было семисегментных индикаторов, начал делать прототип на ЖКИ дисплее 20x4. Так как он более чем избыточен, использовал ЖКИ как и обычно, как отладочный инструмент. Чтобы выводил наружу требуемые переменные, состояние периферии МК. Пришли семисегментные дисплеи. И так как проект не закончен, нужна отладка, соответственно ЖКИ. То есть одновременная работа семисегментников и ЖКИ. Проблема возникла в том, что многие функции и переменные модулей ЖКИ и семигментников созвучны.
dsp_buf,
clr_dsp_buf,
print_char,
print_val_u08,
print_val_u16,
print_val_u32,
Вот тут я и застопорился. Как мне быть. Соответственно обзывать переменные и функции или тут нужон другой подход. Тут подсказали, что нужен си с плюсами. А я на нем не пишу.

Ну, так, опять же, при необходимости можно унифицировать функции. Например, сожно сделать так:
Код:
print_val (char type, long data);
В зависмости от указанного типа выводимые данные будут интепретироваться соответсвующим образом. Или нет?
PS: в Си++ делается примерно так же, только это все скрыто от программиста. Точнее, это делается при описании функции.
PPS: Я тоже Си++ не использую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 07 ноя 2016, 12:27 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Расписал я этот список и кажется увидел решение.
led_dsp_buf,
lcd_dsp_buf,
clr_dsp_buf (led_dsp_buf, MAX_LED_INDS, CHAR_SPASE);
clr_dsp_buf (lcd_dsp_buf, POSITION_MAX_X * POSITION_MAX_Y, ' ');

Ну и так далее. Что скажете?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 07 ноя 2016, 12:33 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 618
Откуда: Челябинск
demiurg1978 писал(а):
Расписал я этот список и кажется увидел решение.
led_dsp_buf,
lcd_dsp_buf,
clr_dsp_buf (led_dsp_buf, MAX_LED_INDS, CHAR_SPASE);
clr_dsp_buf (lcd_dsp_buf, POSITION_MAX_X * POSITION_MAX_Y, ' ');

Ну и так далее. Что скажете?

У функции clr_dsp_buf аргументы в разных случаях разные. Что будет делать данная функция?


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

Зарегистрирован: 19 фев 2015, 17:37
Сообщения: 1604
Откуда: void
Излишнего ветвления и условных операторов все же лучше избегать, КМК. Придется делать две функции, да. Ну или C++.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 07 ноя 2016, 12:39 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Bill писал(а):
...

Код:
//========================================================================
u08 dsp_buf [MAX_LED_INDS];
//------------------------------------------------------------------------
// Очистка буфера дисплея.

u08 dsp_buf [MAX_LED_INDS];

void clr_dsp_buf (void)
{
   for (u08 i = 0; i < MAX_LED_INDS; i++)
      dsp_buf [i] = CHAR_SPACE;
}
//========================================================================

//========================================================================
// Очистка буфера дисплея.

char dsp_buf [POSITION_MAX_X * POSITION_MAX_Y];

void clr_dsp_buf (void)
{
   u08 i;

   for (i = 0; i < POSITION_MAX_X * POSITION_MAX_Y; i++)
      dsp_buf [i] = 0x20;

   init_dsp_buf (); // Переинициализация модуля дисплея.
}
//========================================================================


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

Зарегистрирован: 19 фев 2015, 17:37
Сообщения: 1604
Откуда: void
Так все-таки, какая сигнатура у функции clr_dsp_buf?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 07 ноя 2016, 12:50 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Faberge писал(а):
Так все-таки, какая сигнатура у функции clr_dsp_buf?

В смысле?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 07 ноя 2016, 12:54 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1946
demiurg1978 писал(а):
Если используется и ЖКИ и семисегментные индикаторы, то как быть? Дать соответствующие названия функциям или тут нужен другой подход.

Я предлагал для ЖКИ, 7 сегм. инд. и т.п. написать отдельные независимые модули.
Написать и отладить один раз и больше не трогать.
Под модулем я имею в виду две ф-ции (инициализацию и КА) и контекст модуля - структуру в RAM, где хранятся параметры, состояние КА, буферы и указатели на буферы и т.п.
При таком подходе, для замены в программе, например, ЖКИ на 7 сегм. инд. потребуется только переписать конверторы данных - чтобы из чисел формировался не буфер байтиков-символов ЖКИ, а буфер байтиков-сегментов 7 сегм. инд.

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 07 ноя 2016, 12:58 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1266
demiurg1978 писал(а):
Проблема возникла в том, что многие функции и переменные модулей ЖКИ и семигментников созвучны.
dsp_buf,
clr_dsp_buf,
print_char,
print_buf,
print_val_u08,
print_val_u16,
print_val_u32,
Вот тут я и застопорился. Как мне быть. Соответственно обзывать переменные и функции или тут нужон другой подход.
Тут подсказали, что нужен C++. А я на нем не пишу.

У меня простенький базовый класс, там есть виртуальная функция выводящая один символ(или байт) и еще несколько других, самая сложная из которых похожа на упрощенный вариант printf. Если нужен вывод на индикатор или в usart, то я наследую от этого класса и переопределяю эту виртуальную функцию, т.е. вызываться будет функция вывода символа для конкретного модуля(она может выводить его сразу или добавлять в буфер). По сути я дописал одну строку(ну две, если с include :)), а нормальный компилятор одиночную виртуальную функцию при одиночном наследовании превращает в обычный вызов.


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

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
vt340 писал(а):
...

Примеры, плиз.


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

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
Функции работы с сегментными индикаторами и дисплеем лежат в разных модулях. У каждого модуля свое название. Соответственно в каждом модуле в названиях открытых функций есть название модуля:
Код:
Lcd_Init();
Lcd_PrintChar();
Lcd_GoTo();
Lcd_Process();

Segment_Init();
Segment_PrintChar();
Segment_Process();

И тут они уже становятся не созвучны и хорошо различимы глазу. А если еще не сокращать слова в названиях, то будет еще удобнее.
Массивы, переменные внутри модуля у меня почти всегда приватные, и для доступа к ним из вне завожу специальные функции (с названием модуля в названии функции).

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 07 ноя 2016, 13:44 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1946
demiurg1978 писал(а):
Примеры, плиз.

Щас, всё брошу, чтоб примеры на форум постить )
Какие слова непонятны?

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сведение программных модулей к неким стандартам
СообщениеДобавлено: 08 ноя 2016, 13:51 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
Универсальный подход, используемый в том числе, в ядре линукса предполагает использование интерфейсного объекта (в контексте posix также известного как Открытый Файл, но эта абстракция гораздо щире той, что нам необходима).

В очень упрощенном виде этот объект будет содержать только базовую функцию вывода, индивидуальную для каждого объекта.
Код:
struct output_object {
    void* private_data;
    int (*write)(struct output_object*, void* data, size_t len); //Это указатель на функцию!
    //функции также передается  указатель на сам объект, что была возможность обращаться к private_data.

    int (*anotherFunction)((struct output_object*, void* arg);
}

struct output_object lcd_out = {lcd_write};
struct output_object usart_out = {usart_write};
struct output_object sevenseg_out = {sevenseg_write};

//Создание и разметка экземпляра private_data:
...
struct lcd_private_data {...};
...
lcd_out.private_data = malloc(sizeof(struct lcd_private_data));
struct lcd_private_data* data = (struct lcd_private_data*)lcd_out.private_data;
data->...;
...


Сами же функции вывод будут работать поверх этих объектов.
Код:
uprinf(struct output_object*, const char* format, ...);
uwrite(struct output_object*, void* data, int len);
uprint_int32_dec(struct output_object*, int32_t val);
uprint_int32_hex(struct output_object*, int32_t val);
uprint_string(struct output_object*, const char* str);

И так далее.

Можно так же сделать специальный интерфейсный объект для спама сразу в два канала.
В случае, если есь два lcd экрана, можно иметь по объекту на каждый и использовать private_data для хранения индивидуальной информации (адрес или текущая позиция).


Последний раз редактировалось Mirmik 08 ноя 2016, 14:12, всего редактировалось 7 раз(а).

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


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


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

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


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

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

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