реклама на сайте
подробности

 
 
12 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Как ПРАВИЛЬНО программировать на С++, Вопросы по программированию на С++ для микроконтроллеров.
Serega Doc
сообщение Jul 26 2010, 14:25
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 267
Регистрация: 11-11-04
Из: Одесса
Пользователь №: 1 103



Добрый день. Учусь программировать на С++.
И иногда возникают вопросы в правильном проектировании классов.
Сейчас описываю класс для работы с последовательными регистрами 74HC595.
Уже есть класс для работы с SPI.
Где инициализировать SPI блок AT Mega 168 в классе работы с регистром или же глобально во всей программе.
Сейчас SPI будет использоваться только в регистрах.
Но в будущем планирую параллельно регистрам подключить еще и FLASH память (еще один класс по работе с памятью FLASH) на SPI.

Что посоветуете?

Вдогонку PS
И как правильно писать классы для регистров и FLASH наследовать от SPI или же внутри классов объявлять член класса SPI?
Go to the top of the page
 
+Quote Post
Serega Doc
сообщение Jul 27 2010, 06:43
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 267
Регистрация: 11-11-04
Из: Одесса
Пользователь №: 1 103



Это глупый вопрос который обсуждали миллион раз?
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Jul 27 2010, 08:41
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 2-07-04
Из: Minsk
Пользователь №: 240



нет. как-то це-крест-крест не сильно прижился у эмбеддеров.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Jul 27 2010, 08:48
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Mahagam @ Jul 27 2010, 15:41) *
нет. как-то це-крест-крест не сильно прижился у эмбеддеров.


Да нет, нормально прижился. Просто тут ИМХО вопросы не конкретно эмбеддерские, а уровня проектирования.
Я так понимаю, у вас стоит вопрос расширивания общего ресурса между несколькими потребителями?
Это обычно решается с помощью драйвера устройства. smile.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 27 2010, 08:53
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Serega Doc @ Jul 26 2010, 20:25) *
Где инициализировать SPI блок AT Mega 168 в классе работы с регистром или же глобально во всей программе.


Поскольку к SPI могут обращаться разные устройства, то объект класса SPI надо сделать глобальным. В конструкторы объектов dataflash, HC595, DAC, ADC, которые висят на SPI, в этом случае надо передавать ссылку на класс SPI.

Цитата
И как правильно писать классы для регистров и FLASH наследовать от SPI или же внутри классов объявлять член класса SPI?


Наследовать в этом случае нельзя, а то получится по экземпляру SPI в каждом из объектов.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Serega Doc
сообщение Jul 27 2010, 13:29
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 267
Регистрация: 11-11-04
Из: Одесса
Пользователь №: 1 103



Спасибо все заработало. Что бы не плодить тем буду в будущем писать сюда по вопросам проектирования.
Жаль что мне самому не пришла идея использовать указатель на SPI.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 27 2010, 17:31
Сообщение #7


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Ну оно "так и надо по теории". Сама флешка не есть вариантом интерфейса SPI или там контроллера SPI, она только пользуется SPI как транспортом, класс флешки есть пользователем класа SPI, поєтому должен получать его для использования.
Если теперь две одинаковых флешки будут висеть на разных контроллерах SPI (один аппаратный, другой программный или один из них на соответствующем режиме USART), то просто два экземпляра одного и того же класса флешки получат по каналу SPI (по указателю или ссылке) для работы.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Ink
сообщение Jul 29 2010, 12:50
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 14-08-07
Пользователь №: 29 776



Цитата(AHTOXA @ Jul 27 2010, 12:53) *
Наследовать в этом случае нельзя, а то получится по экземпляру SPI в каждом из объектов.

А не покатит сделать то, что "глобальное", статическим членом класса? Тогда все унаследуется нормально, без лишних сущностей. Или не?
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Jul 29 2010, 13:15
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Ink @ Jul 29 2010, 19:50) *
А не покатит сделать то, что "глобальное", статическим членом класса? Тогда все унаследуется нормально, без лишних сущностей. Или не?

Объекты от статических членов не будут дублироваться только в случае создавание объектов от одного класса. В случае создания объектов от разных классов, объект SPI будет продублирован.
Go to the top of the page
 
+Quote Post
neiver
сообщение Jul 29 2010, 15:03
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



У меня есть некоторые интересные наработки на Си плюс плюс под АВР.
Например, виртуальные порты. Можно объединить от одной до 16 произвольно взятых ножек в такой виртуальный порт и манипулировать им как одним целым.
Кому интересно спрашивайте, раскажу подробнее.

typedef PinList<Pa1, Pa2, Pa3, Pb3, Pb4, Pb5> pins;

int main()
{
pins::DirWrite(0xff);
pins::Write(0xff);
}
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 29 2010, 16:51
Сообщение #11


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Приведите для интереса asm листинг того, во что это скомпилится:
Цитата(neiver @ Jul 29 2010, 19:03) *
typedef PinList<Pa1, Pa2, Pa3, Pb3, Pb4, Pb5> pins;
pins::Write(0xff);

Мысль сама по-себе очень удачная. Вы молодец!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Jul 30 2010, 05:56
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(neiver @ Jul 29 2010, 22:03) *
У меня есть некоторые интересные наработки на Си плюс плюс под АВР.
Кому интересно спрашивайте, раскажу подробнее.

Интересно rolleyes.gif
Выложите пожалуйста реализацию
Go to the top of the page
 
+Quote Post
neiver
сообщение Jul 30 2010, 09:21
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Для
Код
typedef PinList<Pa1, Pa2, Pa3, Pb3, Pb4, Pb5> pins;
pins::Write(0xff);

листинг не очень интересный - всё заоптимизировалось в доску smile.gif поскольку все значеня известны на момент компиляции:
Код
in    r24, 0x1b; 27
ori    r24, 0x0E; 14
out    0x1b, r24; 27

in    r24, 0x18; 24
ori    r24, 0x38; 56
out    0x18, r24; 24


Гораздо интереснее вот так:
Код
typedef PinList<Pa1, Pa2, Pa3, Pb3, Pb4, Pb5> pins;
pins::Write(PORTC);

Вместо PORTC можно подставить любое выражение невычисляемое на этапе компиляции.
Код
in    r18, 0x15; 21

in    r25, 0x1b; 27
mov    r24, r18
add    r24, r24
andi    r24, 0x0E; 14
andi    r25, 0xF1; 241
or    r24, r25
out    0x1b, r24; 27

in    r24, 0x18; 24
andi    r18, 0x38; 56
andi    r24, 0xC7; 199
or    r18, r24
out    0x18, r18; 24


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

Пример 1
Пример побольше
Реализация

Всё это реализовано на основе списков типов и с помощью очень злой и черной шаблонной магии smile.gif
Go to the top of the page
 
+Quote Post
Ink
сообщение Aug 2 2010, 07:43
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 14-08-07
Пользователь №: 29 776



Цитата
Объекты от статических членов не будут дублироваться только в случае создавание объектов от одного класса. В случае создания объектов от разных классов, объект SPI будет продублирован.

Нифига не понял. Вот пример:

Код
#include <iostream>

class A
{
  public:
  static int X;
  void printx() {std::cout << X << std::endl;};
  void setx(int x) {X=x;};
};
int A::X=0;


class B : public A
{
  public:
  void printx() {std::cout << X << std::endl;};
  void setx(int x) {X=x;};
};

class C : public A
{
  public:
  void printx() {std::cout << X << std::endl;};
  void setx(int x) {X=x;};
};


int main()
{
  A a;
  B b;
  C c;

  a.setx(10);
  a.printx();
  b.printx();
  c.printx();

  b.setx(20);
  b.printx();
  a.printx();
  c.printx();

  return 0;
}


Одна статическая переменная в базовом классе. От базового наследуются 2 класса, каждый видит одну и ту же переменную, так же, как если бы она была глобальной. Как бывает еще?

Ответ проги:
10
10
10
20
20
20









Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 2 2010, 08:03
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата
Нифига не понял.

Если вы посмотрите на sizeof(A) и наследуемые классы, то увидите, что int Х в них нет. А если уберете static, то размер классов увеличится.

Вот об этом и разговор.
Go to the top of the page
 
+Quote Post

12 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01474 секунд с 7
ELECTRONIX ©2004-2016