|
Как ПРАВИЛЬНО программировать на С++, Вопросы по программированию на С++ для микроконтроллеров. |
|
|
|
Jul 27 2010, 08:48
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Mahagam @ Jul 27 2010, 15:41)  нет. как-то це-крест-крест не сильно прижился у эмбеддеров. Да нет, нормально прижился. Просто тут ИМХО вопросы не конкретно эмбеддерские, а уровня проектирования. Я так понимаю, у вас стоит вопрос расширивания общего ресурса между несколькими потребителями? Это обычно решается с помощью драйвера устройства.
|
|
|
|
|
Jul 27 2010, 08:53
|

фанат дивана
     
Группа: Свой
Сообщений: 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 в каждом из объектов.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 29 2010, 12:50
|
Участник

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

|
Цитата(AHTOXA @ Jul 27 2010, 12:53)  Наследовать в этом случае нельзя, а то получится по экземпляру SPI в каждом из объектов. А не покатит сделать то, что "глобальное", статическим членом класса? Тогда все унаследуется нормально, без лишних сущностей. Или не?
|
|
|
|
|
Jul 29 2010, 13:15
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Ink @ Jul 29 2010, 19:50)  А не покатит сделать то, что "глобальное", статическим членом класса? Тогда все унаследуется нормально, без лишних сущностей. Или не? Объекты от статических членов не будут дублироваться только в случае создавание объектов от одного класса. В случае создания объектов от разных классов, объект SPI будет продублирован.
|
|
|
|
|
Jul 30 2010, 05:56
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(neiver @ Jul 29 2010, 22:03)  У меня есть некоторые интересные наработки на Си плюс плюс под АВР. Кому интересно спрашивайте, раскажу подробнее. Интересно Выложите пожалуйста реализацию
|
|
|
|
|
Jul 30 2010, 09:21
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Для Код typedef PinList<Pa1, Pa2, Pa3, Pb3, Pb4, Pb5> pins; pins::Write(0xff); листинг не очень интересный - всё заоптимизировалось в доску  поскольку все значеня известны на момент компиляции: Код 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Пример побольшеРеализацияВсё это реализовано на основе списков типов и с помощью очень злой и черной шаблонной магии
|
|
|
|
|
Aug 2 2010, 07:43
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 2 2010, 08:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата Нифига не понял. Если вы посмотрите на sizeof(A) и наследуемые классы, то увидите, что int Х в них нет. А если уберете static, то размер классов увеличится. Вот об этом и разговор.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|