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

 
 
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
Mahagam
сообщение Aug 2 2010, 09:51
Сообщение #16


Местный
***

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



программисты на Си обсуждают и решают проблемы конкретных контроллеров, конкретного железа. це-крест-крест добавляет к этим проблемам ещё и проблемы собственно языка. начинаются обсуждения проблем что и как откуда наследуется инкапсулируется и полиморфируется. за деревьями не видно леса.
ну почему я не удивлён.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 2 2010, 09:57
Сообщение #17


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Mahagam @ Aug 2 2010, 13:51) *
программисты на Си обсуждают и решают проблемы конкретных контроллеров, конкретного железа. це-крест-крест добавляет к этим проблемам ещё и проблемы собственно языка.

Всё зависит от сложности и размера проекта.
С определённого момента дополнительные возможности, которые даёт язык, перекрывают его "проблемы".


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Ink
сообщение Aug 3 2010, 07:08
Сообщение #18


Участник
*

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



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

Вот об этом и разговор.

Естественно X там нет, он лежит отдельно от всего в единственном экземпляре. Но я не понимаю вот этого:
Цитата
В случае создания объектов от разных классов, объект SPI будет продублирован.

Это как так может быть? С чего создастся два разных Х?

Цитата(Mahagam @ Aug 2 2010, 13:51) *
це-крест-крест добавляет к этим проблемам ещё и проблемы собственно языка.

Конечно. И ровно то же самое говорят упертые ассемблерщики в сторону цешников (и справедливо, если на все смотреть плоско!). Смотрите на мир шире, не зря эти языки были придуманы, не зря существуют методы проектирования ПО. Естественно, что для простого SPI не нужно городить классы, но когда у вас будет огромный проект, вы встряните и будете долго понимать, как же так получилось непонятно.

Думается мне, что это не "проблемы языка", а банально проблемы от незнания языка. Это не характеризует язык.
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 3 2010, 07:53
Сообщение #19


Местный
***

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



я и смотрю широко. война с конструкциями языка (и только с конструкциями языка) - удел програмеров це++
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 3 2010, 08:26
Сообщение #20


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

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



Цитата(Mahagam @ Aug 3 2010, 10:53) *
я и смотрю широко. война с конструкциями языка (и только с конструкциями языка) - удел програмеров це++


В 1981 году мы делали статистический анализатор кардиоинтервалов на К580ИК80. У меня (единственного программиста) не было абсолютно ничего кроме блокнотика с клетчатой бумагой, таблицы мнемоники команд и программатора УФ ПЗУ. Все это было сделано, работало и получило награду на выставке в Женеве. Но ...!!! После этого я зарекся заниматься таким программированием. Мне ночами снились квадратики с кодами. Думается это одна из причин появления языков высокого уровня. Вторая причина - переносимость. Третъя - документированность (имею в виду, что если с вами что-то случается, то вашу работу легче кому-то подхватить).

А причин бесконечных ратований за ассемблер, на мой взгляд, две:
1. Понятность ассемблера для "железячника".
2. Лень изучения языков высокого уровня применительно к конкретному процессору.
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 3 2010, 09:59
Сообщение #21


Местный
***

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



где вы ратование за ассемблер увидели????
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 3 2010, 10:03
Сообщение #22


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

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



Цитата(Mahagam @ Aug 2 2010, 12:51) *
программисты на Си обсуждают и решают проблемы конкретных контроллеров, конкретного железа. це-крест-крест добавляет к этим проблемам ещё и проблемы собственно языка. начинаются обсуждения проблем что и как откуда наследуется инкапсулируется и полиморфируется. за деревьями не видно леса.
ну почему я не удивлён.


Или я чего-то не так понял?
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 3 2010, 11:15
Сообщение #23


Местный
***

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



и где я упоминал ассемблер???
поясняю - программеры на Си воюют только с железом и со своими алгоритмами. си плюс плюс - кагбэ намекает, что проблем будет в два раза больше. а именно: секас с инкапсуляцией, наследованием, полиморфизмом (ну три кита проблем smile.gif )
Go to the top of the page
 
+Quote Post
neiver
сообщение Aug 3 2010, 11:29
Сообщение #24


Местный
***

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



Вы, видимо мало на С++ программировали...

На С++ можно писать более эффективные программы (по размеру/памяти/скорости) чем на чистом Си (применительно к 8-ми битникам в частности). И Наследование, инкапсуляция и полиморфизм (как динамический так и (особенно) статический) в этом только помошники а не проблемы. Это всего лишь средства языка, которые быдучи примененными к месту дают положительный результат. Ну а при неумелом использовании... Всё зависит от программиста.

Сообщение отредактировал neiver - Aug 3 2010, 11:29
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 3 2010, 11:48
Сообщение #25


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

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



Цитата(Mahagam @ Aug 3 2010, 14:15) *
и где я упоминал ассемблер???
поясняю - программеры на Си воюют только с железом и со своими алгоритмами. си плюс плюс - кагбэ намекает, что проблем будет в два раза больше. а именно: секас с инкапсуляцией, наследованием, полиморфизмом (ну три кита проблем smile.gif )


Да, витиевато пишите. Сейчас только ваша мысль прояснилась.

По поводу С++. Очень хорошо на форуме сказал автор scmRTOS: С++ ничего не добавляет, если вы сами этого не просите.
Go to the top of the page
 
+Quote Post
Ink
сообщение Aug 3 2010, 12:24
Сообщение #26


Участник
*

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



Цитата(Mahagam @ Aug 3 2010, 15:15) *
программеры на Си воюют только с железом и со своими алгоритмами.

Это тоже ошибочное мнениеsmile.gif Программеры на си, которые воюют, они воюют и с си! Потому что не знают языка! А те, кто знает, те не воюют, точно так же как и с си++.
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 3 2010, 12:50
Сообщение #27


Местный
***

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



во налетели. smile.gif
ещё раз. чисто наблюдения показывают, что вопросы касаемые конструкций и возможностей языка у программистов Си практически не обсуждаются. зато активно муссируются у плюсистов. выводы какие?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 3 2010, 12:59
Сообщение #28


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

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



Цитата(Mahagam @ Aug 3 2010, 15:50) *
во налетели. smile.gif
ещё раз. чисто наблюдения показывают, что вопросы касаемые конструкций и возможностей языка у программистов Си практически не обсуждаются. зато активно муссируются у плюсистов. выводы какие?


Учите матчасть!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 3 2010, 13:05
Сообщение #29


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Mahagam @ Aug 3 2010, 16:50) *
во налетели. smile.gif
ещё раз. чисто наблюдения показывают, что вопросы касаемые конструкций и возможностей языка у программистов Си практически не обсуждаются.

А что там особо обсуждать, разве что правила глянуть в спорных ситуациях.
Фактически, макронадстройка над ассемблером, с нелинейным преобразованием.
Нет возможностей - нет вопросов.
Хотя нет, был недавно вопрос - ARV со своими менюшками колдовал.
Никак эта дикая смесь структур и юнионов не хотела в флешь ложиться...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Aug 3 2010, 13:16
Сообщение #30


Местный
***

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



Цитата(Ink @ Aug 3 2010, 14:08) *
Это как так может быть? С чего создастся два разных Х?

Прошу прощения smile.gif
Почему-то показалось, что вы хотите не наследоваться от базового класса, а создавать статические члены в "потребителях" SPI smile.gif
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 3 2010, 14:51
Сообщение #31


Местный
***

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



QUOTE (sergeeff @ Aug 3 2010, 15:59) *
Учите матчасть!

смотрю, плюсисты никак не выучат. вечно проблемы с языком возникают biggrin.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 3 2010, 14:54
Сообщение #32


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

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



Цитата(Mahagam @ Aug 3 2010, 15:50) *
ещё раз. чисто наблюдения показывают, что вопросы касаемые конструкций и возможностей языка у программистов Си практически не обсуждаются. зато активно муссируются у плюсистов. выводы какие?
Ещё раз. Чисто наблюдения показывают, точнее, показали лет 12-16 назад, что вопросы, касаемые конструкций языка, у программистов на асм практически не обсуждаются, зато активно муссируются у С-шников. Помнятся по SU.CROSSTOOLS да RU.EMBEDDED имено такие "болезни роста" и точно так же многие тогда говорили, что фигня это всё и ассемблерщики борятся с железом и задачей, а С-шники с языком и компилятором. И много приходилось спорить и доказывать, что борьба с компилятором - просто от незнания основ языка в духе правил приведения типов.
Но по мере увеличения числа знающих С эти вопросы отпали, место С во встроенных системах никто не оспаривает. Сейчас слово "асм" заменилось на "С", "С" на "С++" и наблюдаем второй виток. От тех, кто не видел первого?


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 3 2010, 16:13
Сообщение #33


Местный
***

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



стандартов на языки понаделали давно. с появлением стандартов на си - все болезни роста пропали.
на плюсы вроде как уже 12 лет первому стандарту, а проблемы языка - остались.
похоже этот "виток" превратился в вечное кольцо.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 3 2010, 17:05
Сообщение #34


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Mahagam @ Aug 3 2010, 20:13) *
на плюсы вроде как уже 12 лет первому стандарту, а проблемы языка - остались.

Поэтому пора уже думать об С#


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 3 2010, 17:10
Сообщение #35


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

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



Цитата(Mahagam @ Aug 3 2010, 19:13) *
стандартов на языки понаделали давно. с появлением стандартов на си - все болезни роста пропали.
на плюсы вроде как уже 12 лет первому стандарту, а проблемы языка - остались. похоже этот "виток" превратился в вечное кольцо.
В упомянутые времена разговоров про "С-шники воюют с компилятором" языку С тоже много лет было, стандарту C89 было много лет, С99 был на подходе.
Но в нише мелкоконтроллеров он был многим в новинку, болезни роста не от возраста языа зависят, а от времени его применения в нише, так как это болезни роста не языка как такового.
Многие из тех, кто много лет просидел в этой нише на ассемблере - просто не воспринимали С. Вопросы "рискнувших" (в смысле применения С) укрепляли их в вере в то, что "С-шники борятся ..." дале по тексту. Но "рискнувшие" прошли свою фазу освоения языка и все те вопросы остались, но они теперь ассоциируются не со всеми, применяющими С, а только с новичками. А "тогда" практически все новичками и были, С был уделом программистов на "достаточно больших машинах", а "в эмбеддед ему не место" (хотя я удивлялся — почему на "ДВК-2" с 56К озу на всё про всё вместе с ОС ему за десять лет до этого было место, а на 8051 с 16-20-32К ПЗУ для автономной программы — так не место).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 3 2010, 17:44
Сообщение #36


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

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



Цитата(MrYuran @ Aug 3 2010, 20:05) *
Поэтому пора уже думать об С#


С его то идеологией уборки мусора?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 3 2010, 18:12
Сообщение #37


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(sergeeff @ Aug 3 2010, 21:44) *
С его то идеологией уборки мусора?

А что там с идеологией не так?
Стековый язык, с уборкой проблем быть не должно


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 3 2010, 18:32
Сообщение #38


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

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



Цитата(MrYuran @ Aug 3 2010, 21:12) *
А что там с идеологией не так?
Стековый язык, с уборкой проблем быть не должно


http://msdn.microsoft.com/en-us/library/ms...28VS.90%29.aspx :

Цитата
In C#, garbage collection is handled by the common language runtime (CLR) with similar functionality to that of the JVM. The CLR garbage collector periodically checks the memory heap for any unreferenced objects, and releases the resources held by these objects.
Go to the top of the page
 
+Quote Post
Savrik
сообщение Aug 3 2010, 19:09
Сообщение #39


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Управляеймый код, конечно, хорошо в своей области, но, как правило, во встраваимых системах программист привык быть уверенным в том, что и как делает программа. А если забывать за собой убирать - наверное, стоит сменить профильsmile.gif
Оффтоп. Почему C# не такой популярный? потому, что его разрабатывал мужик без бороды.
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 4 2010, 07:49
Сообщение #40


Местный
***

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



ReAl
при чём тут ниша и контроллеры? если обсуждаются проблемы именно языковых конструкций. зайдите на любой форум программеров - война с языком идёт вечно. причём чуть ли не с базовыми конструкциями.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 4 2010, 08:06
Сообщение #41


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

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



Цитата(Mahagam @ Aug 4 2010, 10:49) *
ReAl
при чём тут ниша и контроллеры? если обсуждаются проблемы именно языковых конструкций. зайдите на любой форум программеров - война с языком идёт вечно. причём чуть ли не с базовыми конструкциями.


"С войной покончили мы счеты —
Бери шинель, пошли домой!"
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 4 2010, 08:15
Сообщение #42


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



QUOTE
(хотя я удивлялся — почему на "ДВК-2" с 56К озу на всё про всё вместе с ОС ему за десять лет до этого было место, а на 8051 с 16-20-32К ПЗУ для автономной программы — так не место).


Потому что на архитектуру PDP-11 ложится идеально. А на 51 - увольте wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Serega Doc
сообщение Aug 5 2010, 04:10
Сообщение #43


Местный
***

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



Добрый день.
Неожиданно был удивлен что здесь из-за такого вопроса получился холивар.
Считаю что разработчик сам должен для себя решить на каком языке и с какой эффективностью он будет реализовывать проект.
Так что считаю вообще спор бессмысленным. И прошу его прекратить.

И если можно ответить еще на один вопрос.
Можно ли каким либо образом сделать переход из одного метода класса в другой не вызовом его через Call а переходом через Jmp.
Вернее что бы компилировалось так. А то сейчас у меня два метода которые возвращают один и тот же тип WatcherState
Но при этом один просто выполняет проверки и возвращает значение
Второй же более длинный по времени выполнения выполняет расчет и так же возвращает WatcherState
Вот как я это пока написал
Код
if (Tvalue == TimerValue)
    {
        return Next();
    }
    else
    {
        return WAIT;
    }

Что можете посоветовать?
Go to the top of the page
 
+Quote Post
Ink
сообщение Aug 5 2010, 06:34
Сообщение #44


Участник
*

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



Цитата(Serega Doc @ Aug 5 2010, 08:10) *
Можно ли каким либо образом сделать переход из одного метода класса в другой не вызовом его через Call а переходом через Jmp.

Может я ошибаюсь, но сдается мне, что никак так не сделать. Либо как-то в отдельно взятом компиляторе, но все равно сомневаюсь. Очень.
А инлайн не подходит?
Go to the top of the page
 
+Quote Post
neiver
сообщение Aug 5 2010, 07:21
Сообщение #45


Местный
***

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



А чем собственно call не угодил? Хотите пару тактов и пару байт в стеке съэкономить? Если это действительно важно - можно сделать эти функции члены (в С++ нет методов) inline? Например написать их реализацию в объявлении класса. Если функции маленькие, то возможно удастся съэкономить и побольше, за счет отсутствия вызовов и передачи аргументов.
Go to the top of the page
 
+Quote Post
Serega Doc
сообщение Aug 5 2010, 08:37
Сообщение #46


Местный
***

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



Спасибо за рекомендации.
inline я активно использую в header файле.
И для данной функции это бессмысленно из-за дублирования кода.

Я в принципе тоже так думал что нет такой возможности. Но надеялся что я чего-то не ведаю.
Еще раз спасибо.
Go to the top of the page
 
+Quote Post
XVR
сообщение Aug 11 2010, 09:20
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Mahagam @ Aug 4 2010, 11:49) *
ReAl
зайдите на любой форум программеров - война с языком идёт вечно. причём чуть ли не с базовыми конструкциями.
Заходил. Видел борьбу начинающих со своей безграмотностью, борьбы ПРОГРАММИСТОВ с С++ не видел rolleyes.gif
Go to the top of the page
 
+Quote Post
alexvok
сообщение Aug 19 2010, 10:32
Сообщение #48





Группа: Участник
Сообщений: 11
Регистрация: 23-02-08
Пользователь №: 35 326



Посоветуйте пажалуйста книгу
С++ с примерами для AVR
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 19 2010, 14:11
Сообщение #49


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

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



Цитата(alexvok @ Aug 19 2010, 14:32) *
Посоветуйте пажалуйста книгу
С++ с примерами для AVR
Боюсь, что таковых не имеется...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
neiver
сообщение Aug 19 2010, 14:40
Сообщение #50


Местный
***

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



Примеры есть у меня, есть и свой подход к программированию для систем с сильно ограниченными ресурсами на С++(на примере AVR).
Будет свободное время - напишу статейку по этой теме (если будут желающие её читать smile.gif ).
А так вкратце могу сказать, что программы на С++ получаются компактнее, быстрее и легче читаются аналогичных программ на Си.
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 20 2010, 08:32
Сообщение #51


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(neiver @ Aug 19 2010, 18:40) *
А так вкратце могу сказать, что программы на С++ получаются компактнее, быстрее и легче читаются аналогичных программ на Си.

Я, в принципе, охотно верю, но тем не менее не могу придумать, какие понятия в микроконтроллерных системах можно сделать классами. Слишком уж они отличаются от обычных программ.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 20 2010, 08:37
Сообщение #52


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(777777 @ Aug 20 2010, 12:32) *
Я, в принципе, охотно верю, но тем не менее не могу придумать, какие понятия в микроконтроллерных системах можно сделать классами.

Да хоть какие угодно.
Порт, например, чем вам не класс?
УАРТ?
АЦП?
Таймеры?
Есть физические данные, есть объекты в адресном пространстве, есть методы, работающие с этими данными и объектами.
Почему бы не соединить вместе?

Adc->Init();
Adc->StartConversion();
...
Uadc = Adc->GetResult();


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 20 2010, 11:15
Сообщение #53


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(MrYuran @ Aug 20 2010, 12:37) *
Да хоть какие угодно.
Порт, например, чем вам не класс?
УАРТ?
АЦП?
Таймеры?

Нет, это не классы. Это объекты, существующие в одном экземпляре. (Правда, в программировании есть понятие синглтона, но это все-таки экзотика). А класс - это в некий тип данных, как int или char. Можно создавать объекты таких типов в любом колчестве, они обладают некими свойствами. Примером класса может быть окно - можно создавать множество объектов такого класаа - окон с разными свойствами - размером, типом, - вызывать их методы с целью поменять их, выполнить какое-то действие - нарисовать на нем что-то и т.п. Можно например, как я писал в соседнем посте, создать класс кнопки и использовать его для обработки нажатий на кнопки, отличать длительное и короткое нажатие, выполнять полиморфно их обработку.
Цитата(MrYuran @ Aug 20 2010, 12:37) *
Есть физические данные, есть объекты в адресном пространстве, есть методы, работающие с этими данными и объектами.
Почему бы не соединить вместе?

Adc->Init();
Adc->StartConversion();
...
Uadc = Adc->GetResult();

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

Сообщение отредактировал 777777 - Aug 20 2010, 11:18
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 20 2010, 11:39
Сообщение #54


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(777777 @ Aug 20 2010, 15:15) *
Это лишь видимость С++, в реальности это ничем не лучше вызова обычных функций. А от объектно-ориентированного программирования польза будет только если пользоваться всеми его особенностями - инкапсуляцией, наследованием, полиморфизмом. А для этого нужно весь проект рассматривать как поле для взаимодействия объектов, а не просто переделать проект на С++ потому что это модная фича.

Ну так и АЦП может быть внутренним, а может быть внешним и подключаться через дополнительный драйвер SPI или I2C. Плюс, их может быть несколько. Так что, налицо класс, несколько объектов (возможно, разных) и единая методика работы. Тут и полиморфизм, а возможно, и перегрузка методов (в зависимости от типа АЦП).

Цитата(777777 @ Aug 20 2010, 15:15) *
Нет, это не классы. Это объекты, существующие в одном экземпляре.

Ни разу не видел контроллер с одним портом smile.gif
Вот немного выше был пример, как можно очень удобно представить разрозненные пины разных портов как один обычный порт.
Лучшего примера, я думаю, не найти.
Ну и в конце концов, чуть приподнявшись и отвязавшись от железа, имеем обычную абстрактную программу, в которой можно применять все тонкости и возможности с++.
Я для пробы делал класс цифровых фильтров - очень удобно.
В одном объекте сосредоточен буфер с дискретными отсчётами, методы и выходное значение.
Опять же, можно сделать несколько разных фильтров с разными параметрами и характеристиками.

А уж если есть экранчик (хотя бы 128х64) и менюшки-поля-окошки, то тут уж вообще разговор молчит.
Однозначно, плюсы рулят.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 20 2010, 12:43
Сообщение #55


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(777777 @ Aug 20 2010, 18:15) *
Нет, это не классы. Это объекты, существующие в одном экземпляре.

То, что классы нужно заводить только при возникновении необходимости во множественном (> 1) использовании объектов, - распространенный стереотип-заблуждение. Классы - это просто типы, определяемые пользователем, и использовать их имеет смысл во всех случаях, когда описание программных сущностей удобно воспринимать в виде законченных объектов, даже если такой объект в программе всего один. Классы, как типы, определяемые пользователем, позволяют программисту провести близкие аналогии между объектами реального мира и сущностями программы, что значительно облегчает процесс разработки, т.к. выводит логику программы на более высокий уровень абстракции (от низкоуровневого железа). К тому же, это обстоятельство позволяет в значительной мере формализовать процесс проектирования программы - т.е. составить проект ("рыбу") будущей программы из кубиков структурной схемы еще до написания первой строки кода.

Кстати, на том же С очень удобно заводить в структуру объекты, относящиеся к одному и тому же (по смыслу) месту программы, даже если таких структур нужна всего одна.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 21 2010, 16:37
Сообщение #56


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(dxp @ Aug 20 2010, 16:43) *
Кстати, на том же С очень удобно заводить в структуру объекты, относящиеся к одному и тому же (по смыслу) месту программы, даже если таких структур нужна всего одна.

Да, структура - частный случай класса.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 21 2010, 18:24
Сообщение #57


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

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



Ну вот как раз сегодняшний пример.
ATmega48. Программа сравнительно древняя на С (и нет желания её переписывать начисто, но что-то новое даже такого объёма будет сразу писаться на С++).
Дописывается кусочек функционала, понадобилось при входе в некоторый режим сохранить состояние некоторых выходов, выключаемых в этом режиме, а при выходе из режима восстановить. Ну всё понятно, заводится флаг нахождения в этом режиме (в режим может быть повторный вход, который теперь отличается тем, что сохраняь уже отключенные ножки не нужно) и буферная переменная для сохранения состояния выходов. Т.е. появляются две глобальных переменных файловой области видимости и связь между функциями через них.
На С++ все эти функции изначально объединяются в класс-«драйвер режима» и потом хоть обдобавляйся в этом классе приватных полей.
Казалось бы, между
Код
SomeModeOn();
SomeModeOff();

Код
someMode.On();
someMode.Off();

разницы не видно, «а она есть»©

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 23 2010, 07:33
Сообщение #58


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(alexvok @ Aug 19 2010, 14:32) *
С++ с примерами для AVR

Может, напишем сообща?
rolleyes.gif
Я уже название придумал.
"С++ в микроконтроллерах. Почему бы и нет?"
Экспортный вариант:
"С++ for microcontrollers. Why no?"

У "плюсов" есть ещё один несомненный плюс. Прежде чем сломя голову что-то писать, надо сначала продумать структуру.
То есть, дополнительный организующий момент.
Кстати, данная тема именно с этого и началась - с вопроса об оптимальной структуре.

Спор "плюсы против бесплюсов" считаю таким же контрпродуктивным, как "асм против си".
Си вобрал в себя основные на тот момент методики структурирования ассемблера.
Плюсы - также включают основные методики из сишного программирования. То, что на си пишется в виде отдельного модуля, на с++ можно поместить в класс. Закрытые члены - это аналог static-функций и переменных. В общем, всё то же самое, только проще, короче, быстрее и нагляднее.
Точно так же, есть надстройки над с, дающие дополнительную абстракцию, например, компонентно-ориентированный диалект Nes-C, на котором написана TinyOS

Сообщение отредактировал MrYuran - Aug 23 2010, 09:03


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
neiver
сообщение Aug 23 2010, 08:33
Сообщение #59


Местный
***

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



Идея интересная. Я статью по этой теме пишу - никак не допишу... Времени мало. А тут книгу...
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 24 2010, 11:21
Сообщение #60


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(ReAl @ Aug 21 2010, 22:24) *
Кстати, классы, изначально предназначенные для того, чтобы иметь только один экземпляр - вполне нормальное явление.

Да это явление может и нормальное, я не спорю. Хуже когда этот класс в принципе не может иметь несколько экземпляров - это уже архитектурная проблема, говорящая о том, что классу тут делать нечего. Можно например написать класс CIdle, который будет инкапсулировать в себе бесконечный цикл, имеющийся в любом контроллере:
Код
class CIdle
{
CIdle()
    {
    sei();
    while(1)
        {}
    }
}

Применение
Код
main()
    {
    // инициализация периферии
    ...
    // дальше работают только прерывания
    CIdle idle;
    }

Но этот пример попахивает онанизмом, не находите? Даже если в него навтыкать указателей на функции и заставить их вызывать по кругу, пользы от него не прибавится.


Цитата(MrYuran @ Aug 23 2010, 11:33) *
"С++ в микроконтроллерах. Почему бы и нет?"
Экспортный вариант:
"С++ for microcontrollers. Why no?"

По-английски это не звучит, надо по-французски: pourquoi pas? smile.gif
Цитата(MrYuran @ Aug 23 2010, 11:33) *
У "плюсов" есть ещё один несомненный плюс. Прежде чем сломя голову что-то писать, надо сначала продумать структуру.
То есть, дополнительный организующий момент.

Да, это действительно полезно...
Go to the top of the page
 
+Quote Post
Andron_
сообщение Aug 24 2010, 14:10
Сообщение #61


.NET developer
***

Группа: Свой
Сообщений: 218
Регистрация: 20-10-07
Из: Новосибирск
Пользователь №: 31 532



по осени начал писать проект для сигнальника TI, решил на свой страх и риск использовать С++ и динамическое управление памятью в некоторых моментах.
поскольку продумать изначально удачную структуру умишка не хватило (в-смысле, не смог) структура программы получилась путанная местами и через чур замудренная. Сейчас дописываю... Естественно, что писалось полгода назад я уже наглухо забыл. В-принципе, мне нравится - с помощью Doxygen'овской документации весьма приятно дописывать.
Динамическое выделение пока также работает стабильно, я боялся худшего.

Немного неудобно использовать inline функции в классах - CCS 3.3 корявенько их разворачивает в редакторе во время отладки и по шагам ходит как-то неправильно местами.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 24 2010, 15:15
Сообщение #62


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

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



Цитата(777777 @ Aug 24 2010, 14:21) *
Да это явление может и нормальное, я не спорю. Хуже когда этот класс в принципе не может иметь несколько экземпляров - это уже архитектурная проблема, говорящая о том, что классу тут делать нечего.
Можно например написать класс CIdle, который будет инкапсулировать в себе бесконечный цикл, имеющийся в любом контроллере

Во-первых, если я хорошо высплюсь, то я и "чисто-С-шных" маразмов в ответ смогу придумать как доказательство того, что С в микроконтроллрах делать нечего.
Во вторых, в этой теме уже говорили - и в С несколько переменных, относящихся к одной и той же логической сущности, имеет смысл объединить в структуру даже если эта структра используется в программе в принципе один единственный раз. Это будет "архитектурной проблемой" ? Лучше пусть будет несколько на вид независимых переменных?




--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
xelax
сообщение Aug 25 2010, 08:38
Сообщение #63


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(MrYuran @ Aug 23 2010, 11:33) *
У "плюсов" есть ещё один несомненный плюс. Прежде чем сломя голову что-то писать, надо сначала продумать структуру.
То есть, дополнительный организующий момент.
Кстати, данная тема именно с этого и началась - с вопроса об оптимальной структуре.


Я то наивно полагал, что продумывать структуру программы необходимо вне зависимости от языка программирования. biggrin.gif

Выскажу кромольную мысль:
На архитектуру язык программирования влияет лишь косвенно. Этап перехода с С на С++ уже давным давно закончился (если кто-то ещё не заметил). Все более или менее крупные и что немаловажно УСПЕШНЫЕ компании специализирующиеся на разработке софте (и эмбеддед в том числе) начинают с UML или подобного дизайна. Да собственно это и есть основной этап. А в получившейся на выходе архитектуре-софте любая команда индо-китайских тупокодеров добьёт код за пару месяцев.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 25 2010, 08:48
Сообщение #64


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(xelax @ Aug 25 2010, 12:38) *
Я то наивно полагал, что продумывать структуру программы необходимо вне зависимости от языка программирования. biggrin.gif

Ну, иерархическая модель классов более располагает к структурированию, чем рассыпные модули си.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 25 2010, 11:19
Сообщение #65


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

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



Я бы сказал так — по сравнению с С язык С++ более жёстко наказывает за непродуманность структуры.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 26 2010, 05:54
Сообщение #66


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ReAl @ Aug 25 2010, 18:19) *
Я бы сказал так — по сравнению с С язык С++ более жёстко наказывает за непродуманность структуры.

Скорее более явно показывает (подчеркивает) корявости в этом контексте.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Waso
сообщение Sep 3 2010, 05:35
Сообщение #67


Местный
***

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



Цитата(neiver @ Aug 19 2010, 21:40) *
Примеры есть у меня, есть и свой подход к программированию для систем с сильно ограниченными ресурсами на С++(на примере AVR).
Будет свободное время - напишу статейку по этой теме (если будут желающие её читать smile.gif ).
А так вкратце могу сказать, что программы на С++ получаются компактнее, быстрее и легче читаются аналогичных программ на Си.

Цитата(MrYuran @ Aug 23 2010, 14:33) *
Может, напишем сообща?
rolleyes.gif
Я уже название придумал.
"С++ в микроконтроллерах. Почему бы и нет?"

Желающие читать такие статьи есть! Вот по крайней мере я, например! Так-что жду с нетерпением.
А как наберете с десяток статей - соедините их в книгу и будете барыши получать. wink.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Sep 3 2010, 14:58
Сообщение #68


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

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



Цитата(Waso @ Sep 3 2010, 09:35) *
А как наберете с десяток статей - соедините их в книгу и будете барыши получать. wink.gif


Наивность впечатляет...
Go to the top of the page
 
+Quote Post
Waso
сообщение Sep 3 2010, 15:07
Сообщение #69


Местный
***

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



В чем же она заключается, наивность-то?
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Sep 5 2010, 18:11
Сообщение #70


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(xelax @ Aug 25 2010, 11:38) *
Этап перехода с С на С++ уже давным давно закончился (если кто-то ещё не заметил).

Да... я заметил. Закончился. Как и жизнь C++. Мало того - когда о Cpp забудут на C еще будут писать целые системы.

Цитата(xelax @ Aug 25 2010, 11:38) *
Все более или менее крупные и что немаловажно УСПЕШНЫЕ компании специализирующиеся на разработке софте (и эмбеддед в том числе) начинают с UML или подобного дизайна.

biggrin.gif ... Эмбэддед буржуи часто называют JavaME. А "подобный дизайн"... Так все с него начинают. Даже строители зданий из железобетонных блоков.

Цитата(xelax @ Aug 25 2010, 11:38) *
Да собственно это и есть основной этап. А в получившейся на выходе архитектуре-софте любая команда индо-китайских тупокодеров добьёт код за пару месяцев.

Я сомневаюсь, что для 8-и битника стиральной машины нужна прям-таки команда индусов и менеджеров с UML диаграммами в руках.

Цитата(MrYuran @ Aug 25 2010, 11:48) *
Ну, иерархическая модель классов более располагает к структурированию, чем рассыпные модули си.

biggrin.gif ага... И к постоянному переструктурированию. Сколькими способами можно разбить белый лист на подчасти!? Не даром в том же C++ есть все что-бы нарушить инкапсуляцию "если очень надо"... Ну а полиморфизм - это ли не повод накидать в проект всего чего не лень? То, что при этом он, зачастую теряет не только обозримость, но и простую читабельность(х.з. какую там из реинкарнаций и где вызывают - и не все IDE такие же функциональные как мелкософтовская визуалстудия). Ну а уж если появилась иерархическая модель классов - это верный признак, что от первоначальной архитектуры отказались biggrin.gif biggrin.gif biggrin.gif , но переписать все заново не представляется возможным ввиду отсутствия времени совместно с запутанностью и нечитабельностью уже написанного кода.


Хорошая статья что-бы задуматься - а туда ли в жизни направляешь стопы свои... wink.gif


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 6 2010, 11:34
Сообщение #71


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(DRUID3 @ Sep 5 2010, 22:11) *

Это всё конечно хорошо, в теории.
А в реальности никто не даст 20 лет на вылизывание кода, как в случае с академическим миниксом.
Зачастую цикл жизни изделия составляет от 2 до 5 лет.
Да и не в каждой конторе работают гении уровня Таненбаума.
Так что, оставшимся остаётся довольствоваться прозой и использовать общепринятые методики и наработки.
Тем более что действительно, лучше сегодня выпустить актуальное, хоть и несколько сырое изделие, чем завтра сидеть с вылизанным, но никому не нужным...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 6 2010, 20:52
Сообщение #72


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Хорошая статья что-бы задуматься - а туда ли в жизни направляешь стопы свои...
А вы никогда не слышали как Торвальдс критикует микроядра? smile.gif bb-offtopic.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
neiver
сообщение Sep 7 2010, 08:32
Сообщение #73


Местный
***

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



Цитата(sigmaN @ Sep 7 2010, 00:52) *
А вы никогда не слышали как Торвальдс критикует микроядра? smile.gif bb-offtopic.gif

Торвальдс и Си++ усиленно критикует.
Мне нравится, что Steven Dewhurst ему на это отвечает.
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Sep 7 2010, 09:21
Сообщение #74


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

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(Ink @ Aug 3 2010, 10:08) *
но когда у вас будет огромный проект, вы встряните и будете долго понимать, как же так получилось непонятно.
Вот большой проект: http://www.freebsd.org/cgi/cvsweb.cgi/src/. C++ есть только в библиотеках для C++. Ничего, не встряли. А NetBSD из той-же серии так вообще на тьму платформ портирована, и во многом благодаря здоровому консерватизму.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Sep 7 2010, 09:40
Сообщение #75


Местный
***

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



Цитата(halfdoom @ Sep 7 2010, 16:21) *
Вот большой проект: http://www.freebsd.org/cgi/cvsweb.cgi/src/. C++ есть только в библиотеках для C++. Ничего, не встряли. А NetBSD из той-же серии так вообще на тьму платформ портирована, и во многом благодаря здоровому консерватизму.

А в чем плюс то голого сишного подхода? Никто не спорит, что все, что пишется на С++, можно сделать и на Си.
Вопрос - какими средствами и какой надежностью.

Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 7 2010, 10:20
Сообщение #76


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Мне кажется, всётаки, что сравнение переходов ASM->C и C->C++ некоректно. Так как первый решает главную задачу - убирает зависимость программиста от процессора (не от переферии). Эта задача глобальна для эмбеддера. И эта задача решается как академически так и практически. Соответственно повышается переносимость, возможность заимствований. Вроде бы переход C->C++ академически решает те же задачи. Но, на мой взгляд дальнейшие шаги в данной области целесообразны лишь при однотипных задачах.
Например, если программист непрерывно работает с графикой, то лучше потратить кучу времени написать и вылизать соответствующие классы работы с графикой. Но если он сегодня работает с ШД, а завтра с CAN, а послезавтра с графикой, то возникают нюансы.
Собственно эти нюансы просты. Написал я свои классы на тему конечных автоматов - потратил время. Вылизал - потратил время. А далее написал 10 проектов никакого отношения к этому не имеющещих. Через 2 года у меня появилась тема где, казалось бы можно применить наработки по конечным автоматам. И что будет? Я потрачу минимум неделю чтобы всё вспомнить и проникнуться высоким уровнем моих наработок, ещё неделю чтобы соотнести то решение с новым проектом. Естественно выяснится, что в чистом виде это чуть-чуть не подходит. И надо добавить пару новых свойств и чуть подправить реализацию. Причём лучше это сделать так, чтобы новый класс работал бы и со старым приложением. Надо честно признаться (хотя бы себе), что создавать новый класс, производный от старого, учитывая что старый писали тоже вы и, учитывая, что вы просто не учли вот этот вот нюанс, что вылез в новом проекте, вы не станете. Далее вам опять придётся проникнуться всеми нюансами разработки вашего класса, опять потребуется время для написания и отладки, чтобы через год-два вам мифически было бы проще всё это использовать.
Конечно, можно сказать что это произойдёт в случае низкого уровня программиста. А я вам возражу, что в случае низкого уровня программиста этот класс придётся переписать заново, а не чуть-чуть подправить.

По-моему, С++ это всётаки удел крупных контор с большим коллективом программистов, с чётким разделением задач, с проектами близкой направленности, с хорошей документированностью наработок и т.д и т.п. Пытаться одному программисту "охватить необъятное" (читай ... изучить и использовать все новейшие течения в области программирования) будет провальным. Из-за физической невозможности.
Go to the top of the page
 
+Quote Post
one_man_show
сообщение Sep 7 2010, 10:54
Сообщение #77


Помогу, чем смогу
******

Группа: Админы
Сообщений: 2 786
Регистрация: 28-05-04
Из: Москва
Пользователь №: 25



В своей практике стараюсь сделать примеры применения своего "творчества", чтобы легче передавалось по наследству и самому быстрее въезжать, что наваял лет пять тому назад. Времени и терпения писать документацию по своим наработкам в 99% случаев не хвататет, поэтому примеры применения с коментариями выручают. Какой язык программирования при таком подходе уже не имеет значения.


--------------------
С уважением,
Ваган Саруханов
Проекты|Форум|Facebook|Linkedin
Go to the top of the page
 
+Quote Post
Harvester
сообщение Sep 7 2010, 11:27
Сообщение #78


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(Waso @ Sep 3 2010, 19:07) *
В чем же она заключается, наивность-то?


bb-offtopic.gif
А Вы давно покупали книги по электронике/программированию?


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Sep 7 2010, 11:39
Сообщение #79


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

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(Dima_G @ Sep 7 2010, 12:40) *
А в чем плюс то голого сишного подхода? Никто не спорит, что все, что пишется на С++, можно сделать и на Си.

Я же написал про портирование на множество платформ. На момент портирования NetBSD лишь для немногих из них был вменяемый компилятор С++. Соответственно и у нас имеется определенное количество наработок на голом С, причем многим из них уже за 10 лет. Смысла в переписывании нет.
Цитата(Dima_G @ Sep 7 2010, 12:40) *
Вопрос - какими средствами и какой надежностью.
Сисадмин говорит, что предыдущая инкарнация нашего сервера под FreeBSD имела аптайм 3.5 года и была обновлена из-за переезда на новое железо.

Применительно к встраиваемым системам - посчитайте сколько процентов занимают данные и сколько алгоритмы. Нужно ли затевать ради этого мизера пляски с ООП? Вот в прикладных задачах С++ безусловно имеет преимущество благодаря возможностям инкапсуляции, наследования, да и просто более жесткой типизации.

Ну и классика сравнения этих языков для встраиваемых систем: "есть два пути: можно грамотно использовать все возможности C либо ограниченный набор возможностей C++" - кто сказал это не помню, но сказано верно.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2010, 11:44
Сообщение #80


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Harvester @ Sep 7 2010, 15:27) *
bb-offtopic.gif
А Вы давно покупали книги по электронике/программированию?

Если я вижу стоющую книгу, я её покупаю не задумываясь, на конторские деньги либо на свои.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Sep 7 2010, 14:57
Сообщение #81


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



offtop

Цитата(sigmaN @ Sep 6 2010, 23:52) *
А вы никогда не слышали как Торвальдс критикует микроядра? smile.gif bb-offtopic.gif


Цитата(neiver @ Sep 7 2010, 11:32) *


Авторитет Торвальдса все-таки сильно завышен. Нет, разумеется он молодец - написать свою до конца работоспособную ОС-ку еще в студенческие годы(когда вечно не хватает времени) и "раздать ее людям"... Но... Если задуматься - студенческую ОС без прикладного софта напарить можно разве что тем людям которые профинансировали "сапфировые носители" для украинской центральной библиотеки. Да и писать UNIX, пусть и самобытный, по книжке это не одно и то же, что придумать UNIX. Чувствуете разницу?

В те далекие годы столменовский GNU и "опенсоус" набирали силу, появился GCC - который на данный момент, что бы там не говорили, является одним из лучших компиляторов. А что произошло бы если "опенсорщики" подхватив самые конструктивные идеи общими стараниями создали бы еще и ОС без изъянов? Не создали... И поныне... И именно благодаря Линусу и его Linux'у. Если какое-то из социальных потрясений не остановить - его нужно возглавить? Так? Кто и когда решил сделать ставку на архитектурную быдло-поделку - а первые версии ядра ну ничегошеньки из ряда вон выходящего не демонстрировали - навсегда останется под покровом тайны. Но факт фактом. И здесь понемногу начинает закатываться звезда Столмена - эдакого эксцентричного мечтателя и восходит Торвальдса - жизнерадостного практика со здоровым видом. Хм rolleyes.gif , есть над чем задуматься... Даже в каком-то документальном фильме видел сценку - Столмена награждают премией Линукса - на что он сам в ответ язвит "Ха, это все равно что Хан Соло награждал бы премией Альянс Повстанцев" (прочтите эту фразу несколько раз... и подумайте)...

Я когда-то Вам, sigmaN, не ответил(не было времени на развернутый ответ) что-же быдлокодерского в Линуксе. В самом коде - качественно ничего. Но в архитектуре - это "в лоб" написаный UNIX переживший несколько конструктивных потрясений. Ну каГбЭ бульварный роман написанный на безупречном русском wink.gif .

Кстати темные силы мировой закулисы не столь коварны(там точно нет русских или украинцев - иначе голову Столмена нашли бы под Белой Церковью, в лесу, делов то smile.gif ) сколь дальновидны. Ни для кого не секрет, что дикие народности типО иранцев, украинцев, русских и китайцев беззастенчиво используют свободное ПО (которое писАли люди со всего мира) в том числе и в военной технике. Не повод ли задуматься - а стОит ли при этом "раздавать" самое лучшее wink.gif ...


P.S.: да, я сторонник теории заговоров и не стыжусь этого tongue.gif ...

P.P.S.: "диким народностям" стоит задуматься, что не все "свободное ПО" одинаково полезно biggrin.gif , и верные инвестиции сеодня(инвестиции интеллекта в том числе) завтра могут обернуться качественным(ключевым) преимуществом в целой отрасли. Это на просто на каждом углу кричать "о, свободное ПО... а-а-а-а...у-у-у-у... э-э-э-э... Покупайте наше свободное ПО" biggrin.gif rolleyes.gif ...

P.P.P.S.: готов поспорить, что та же история и с т.н. "нейронными сетями" - как по мне, то это "каша из топора". Жаль, что это уж совсем-совсем оффтоп...


end_offtop
Прикрепленные файлы
Прикрепленный файл  linux_0.01.tar.gz ( 71.38 килобайт ) Кол-во скачиваний: 47
 


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 7 2010, 23:01
Сообщение #82


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Блни, а зря оффтоп прикрыли.
Вот щас про Торвальдса потроллить бы, а))))

Цитата
Сисадмин говорит, что предыдущая инкарнация нашего сервера под FreeBSD имела аптайм 3.5 года и была обновлена из-за переезда на новое железо.

Прям 3.5года без единого ребута??? Я в восторге!

Лично я абсолютно согласен с Торвальдсом, что такие вещи как ядро ОС на С++ лучше не писать.И аргументирует он своё мнение.
Один мой знакомый говорит что типа забивать гвозди можно и ноутбуком... Конечно, он на много круче, чем обычный молоток, но... улавливаете мысль, нам то гвоздь забивать надо и в деле забивания гвоздя - молоток зэ бэст.
А ещё Торвальдс правильно сказал как-то что-то типа: компиляторы, языки - всё это инструменты в наших руках и если мы будем идти на поводу у своих инструментов или не делаем чего-то, потому что нам не позволяют наши инструменты, то как-бы пора бы может быть нам сменить профессию или поменять инструменты. (как-то так, за достоверность не ручаюсь)
Но, конечно, тема вообще холливарная пошла....завязывать надо..

P.S. Без оффтопа жить тяжело. Чё, мож и вправду на шараге зарегиться...... smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 8 2010, 06:16
Сообщение #83


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sigmaN @ Sep 8 2010, 02:01) *
Один мой знакомый говорит что типа забивать гвозди можно и ноутбуком... Конечно, он на много круче, чем обычный молоток, но... улавливаете мысль, нам то гвоздь забивать надо и в деле забивания гвоздя - молоток зэ бэст.
Сравнение некорректно. Ноутбук изначально не предназначен для забивания гвоздей. Есть такие специальные пневматические молотки, для которых гвозди выпускаются в кассетах. Вот это больше похоже - можно с чувством, не спеша, накачивая мышцу забивать ручным молотком, а можно нажав кнопку загнать пневматическим. Плата - стоимость инструмента (читай - необходимость изучать С++) и несколько более высокая стоимость гвоздей в кассете по сравнению с гвоздями россыпью в ящике (читай - некоторые накладные расходы типа кода вызова конструкторов). Но если покупать гвозди не по одинаковому количеству, а, скажем, закупить количество гввоздей, которое можно забить за час одним и вторым инструментом, то выясняется, что это количество гвоздей в кассетах уже подходит под понятие "мелкий опт" и по мелкооптовым ценам гвоздь даже с дополнительной кассетой стоит дешевле, чем гвоздь без кассеты по розничным. Вот такое сравнение мне кажется более похожим на C/C++.

Ну или сравните лопату и экскаватор. Только лопату берите не с Джамшутом впридачу, а с профессиональным копателем. И посчитайте, сколько надо заплатить профессиональному оператору лопаты за рытье траншеи, скажем, м*м*км и сколько будет стоить та же работа, выполненная экскаватором с профессиональным оператором экскаватора за рычагами. И сравните затраченное в обоих случаях время.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 8 2010, 09:13
Сообщение #84


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Нет, точно пора завязывать, оффтоп же!


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Sep 8 2010, 14:50
Сообщение #85


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

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(sigmaN @ Sep 8 2010, 02:01) *
Прям 3.5года без единого ребута??? Я в восторге!

Поскольку он периодически хвастался растущим аптаймом, то на 3 году я решил поинтересоваться "а не зря ли мы его кормим" (имелся в виду сисадмин). Действительно, uptime был за тысячу с лишним дней, все порты были аккуратно обновлены и даже пересобраны некоторые системные библиотеки и демоны. Но ядро оставалось прежним и перезагрузок не требовалось.
Go to the top of the page
 
+Quote Post
neiver
сообщение Sep 9 2010, 15:30
Сообщение #86


Местный
***

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



Господа/Товарищи/Эмбеддеры/Радио коты (нужное подчеркнуть), я таки худо-бедно да дописал ранее обещенную статью про организацию ввода-вывода для МК семейства AVR на Си++.
Собственно, статья состоит из двух основных частей. Первая - обзорная о том как ввод-вывод организуется на цистом Си. Вторая - как это можно сделать на Си++.
Конструктивные комментарии/замечания/пожелания приветствуются.

Прикрепленные файлы
Прикрепленный файл  CppGpioForAvr.zip ( 139.07 килобайт ) Кол-во скачиваний: 262
 
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 10 2010, 06:03
Сообщение #87


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(neiver @ Sep 9 2010, 19:30) *
Господа/Товарищи/Эмбеддеры/Радио коты (нужное подчеркнуть), я таки худо-бедно да дописал ранее обещенную статью про организацию ввода-вывода для МК семейства AVR на Си++.

Отличная статья!
И намного нагляднее, чем 6 страниц руками махать.
Рекомендую разместить в разделе статей.
Обсуждение здесь


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 10 2010, 08:32
Сообщение #88


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(neiver @ Sep 9 2010, 18:30) *
Конструктивные комментарии/замечания/пожелания приветствуются.
Опенофис показал множество опечаток. Периферия пишется через "е" - это сразу бросилось в глаза. Продолжаю читать.

Код
#define PortaBits (*((Bits*)&PORTA))
пропущен volatile

Код
    static void Set()
    {
        *(uint8_t*)(PORT + __SFR_OFFSET) |= (1 << PIN);
    }
Снова пропущен volatile

Код
    typedef TPin<Porta, 0> Pa0;

....
    Pa0.SetDirWrite(); // <- разве тут не должно быть Pa0::SetDirWrite() ?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
WHALE
сообщение Sep 10 2010, 09:55
Сообщение #89


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Код
void LCDwrite4(uint8_t value)
{
    LDP &= ~(1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4); //clear data bus
    
    if(cmd & (1 << 0))
        LDP |= LCD_D4;
    if(cmd & (1 << 1))
        LDP |= LCD_D5;
    if(cmd & (1 << 2))
        LDP |= LCD_D6;
    if(cmd & (1 << 3))
        LDP |= LCD_D7;
}


В аргументе фукции value на cmd замените.
А вообще-то отличная статья,спасибо!


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 10 2010, 09:57
Сообщение #90


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Подход замечательный. Обязательно использую в ближайшем проекте - надо будет крутить несколько шаговиков.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 10 2010, 11:43
Сообщение #91


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

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



Цитата(Сергей Борщ @ Sep 10 2010, 12:57) *
Подход замечательный. Обязательно использую в ближайшем проекте - надо будет крутить несколько шаговиков.
+1
Нутром чуял, что что-то такое реально сделать, но всё страшно за Александреску взяться :-) Точнее, за глубокое влезание в шаблоны.
Увы, у меня С++ больше как «С с классами» идёт, хоть я и понимаю, что этого мало.

p.s[0] Отличная иллюстрация того, что программисты на С борятся с аппаратурой (вручную маски битов собирают), а программисты на С++ борятся с компилятором (заставляют его делать тупую работу).

p.s[1] По поводу лицензии.
scmRTOS тоже поначалу была (L)GPL, но там не совсем понятно с использованием в проектах с закрытыми исходниками вот таких библиотек уровня исходников. И Гарри перевёл её на нечто MIT/BSD-подобное.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Sep 11 2010, 05:54
Сообщение #92


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

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(ReAl @ Sep 10 2010, 15:43) *
p.s[0] Отличная иллюстрация того, что программисты на С борятся с аппаратурой (вручную маски битов собирают), а программисты на С++ борятся с компилятором (заставляют его делать тупую работу).

Позволю себе добавить, что отличная, но однобокая иллюстрация. Автор абсолютно не упоминает о возможности описания проекта на языках с гораздо более гибкими и удобными конструкциями. Ведь никто не обязывает втискивать себя в прокрустово ложе препроцессора C или шаблонов C++. Современные скриптовые языки вроде ruby или python позволяют эффективно описать проект (причем не только МК но и всю периферию) и автоматически сгенерировать все требуемые макроопределения, функции, файлы конфигурации и документации, причем генератор легко может учитывать особенности целевого компилятора или ассемблера. При этом сложность описания не ограничивается парой портов.

Приведу усеченный пример:
Код
require 'atmega162'
require 'unitimer'

M = ATMega162.new

M.device_name = "My Super Device"
M.clksrc = :FAST_CRYSTAL
M.clkfreq = 14.3e6
M.bldr_size = 2048

M.hw_version = [1, 2]
M.fw_version = [1, 1]

#
# Pins configuration
#
M.dp :A, 0, :KBDR0,     :IN,  :PULLUP    :desc => "kbd row 0"
M.dp :A, 1, :KBDR1,     :IN,  :PULLUP    :desc => "kbd row 1"
...
M.dp :C, 0, :LED_A,    :OUT,  :INIT1,        :desc => "Display1, seg A"
M.dp :C, 1, :LED_E,    :OUT,  :INIT1,        :desc => "Display1, seg E"
M.dp :C, 2, :LED_C,    :OUT,  :INIT1,        :desc => "Display1, seg C"
M.dp :C, 3, :LED_F,    :OUT,  :INIT1,        :desc => "Display1, seg F"
M.dp :C, 4, :LED_B,    :OUT,  :INIT1,        :desc => "Display1, seg B"
M.dp :C, 5, :LED_D,    :OUT,  :INIT1,        :desc => "Display1, seg D"
M.dp :C, 6, :LED_G,    :OUT,  :INIT1,        :desc => "Display1, seg G"
M.dp :C, 7, :LED_H,    :OUT,  :INIT1,        :desc => "Display1, seg H"

#
# define pins group for display segements
#
M.dg :LED_SEGMENTS, 8, [:LED_A, :LED_B, :LED_C, :LED_D, :LED_E, :LED_F, :LED_G, :LED_H]

#
# unitimer configuration, period 20uS, mode - OCR
#
M.unitimer(20e3, :OCR)
M.UT.add "05S",     500e3, :timer_05s_handler
M.UT.add "LED",        200, :led_timer
M.UT.add "MODBUS",    :MODBUS_TIMER_TICK, :mb_timer
...
M.sources=%@
  main.c
  leds.c
  control.c
  heater.c
@

Функциональность объекта ATMega162 имеющего общим предком семейство МК АВР понимает не только определения портов и групп битов, но и может быть расширена за счет подключения дополнительных модулей как unitimer в этом примере. Так, аналогичные расширения имеются для шин Modbus, Microlan, pcuart, пресловутого 44780, sed1520. Более того, поскольку уже все описано на языке высокого уровня, генератор учитывает конфигурацию фьюзов и генерирует соответствующие секции Makefile'ов учитывая особенности AvReal или avrdude.

Значительным преимуществом данного подхода является и то, что вся конфигурация собрана в один или несколько однородных файлов, что резко снижает вероятность непреднамеренных ошибок.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 11 2010, 07:27
Сообщение #93


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

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



Цитата(halfdoom @ Sep 11 2010, 08:54) *
Позволю себе добавить, что отличная, но однобокая иллюстрация. Автор абсолютно не упоминает о возможности описания проекта на языках с гораздо более гибкими и удобными конструкциями.
...
Приведу усеченный пример
И Вам спасибо за иллюстрацию, или, по крайней мере, её фрагмент.
Зато пример автора полный, по которому можно учиться и которым можно пользоваться :-)
Если бы, чтобы уйти от упрёка в однобокости, в такой объём кто-то попытался бы втиснуть «чуть менее, чем все» возможности, то это было бы несколько страниц реферативного журнала, по которому можно было бы узнать о спектре идей, но ничему нельзя было бы научиться. Такое тоже полезно и это ждёт своего автора.
Каждая иллюстрация однобока, и только их множество создаст более-менее полную картину.
На то и фрум.



--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 11 2010, 08:39
Сообщение #94


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(halfdoom @ Sep 11 2010, 09:54) *
Позволю себе добавить, что отличная, но однобокая иллюстрация.

Ну так представьте народу второй бок, в виде контр-статьи. Чтобы можно было пользоваться, а не голословно.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Sep 11 2010, 11:46
Сообщение #95


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

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(ReAl @ Sep 11 2010, 10:27) *
Если бы, чтобы уйти от упрёка в однобокости, в такой объём кто-то попытался бы втиснуть «чуть менее, чем все» возможности, то это было бы несколько страниц реферативного журнала
Наверное да, от обзорных статей всегда ожидаешь большего чем они, как правило, содержат. Что, конечно, ни сколько не умаляет их ценности.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 11 2010, 11:49
Сообщение #96


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(halfdoom @ Sep 11 2010, 12:54) *
Позволю себе добавить, что отличная, но однобокая иллюстрация. Автор абсолютно не упоминает о возможности описания проекта на языках с гораздо более гибкими и удобными конструкциями. Ведь никто не обязывает втискивать себя в прокрустово ложе препроцессора C или шаблонов C++.

То, о чем вы говорите, - это ортогональная вещь. Нативный код - это нативный код, и он обладает такими свойствами, которые не заменят никакие кодогенераторы. Есть отличный кодогенератор COG, который позволяет писать определения прямо в исходном коде. И в ряде случаев это действительно удобная и мощная штука. Но пример использования С++, приведенный в обсуждаемой статье, не нуждается ни в каких кодогенераторах - он предельно лаконичен, полон, прост в использовании и эффективен. Да, он сложен в реализации. Все эти трюки тов. Александреску - это высший пилотаж плюсового программирования, они требуют глубокого понимания концепций языка, а это приходит только с опытом его использования. Вот это и есть главная проблема для эмбеддеров - такого опыта у них, как правило, нет (по вполне объективным причинам). Поэтому этот код с шаблонами, списками типов и прочим для большинства - китайская грамота. Хотя при наличии отлаженной библиотеки можно использовать и не страдать. Необходимость вникать потребуется в случае портирования ее на другую платформу.

Но в любом случае есть мотив осваивать подобные средства. А автору статьи - большущий респект: очень нетипично для эмбеддера поднять такой уровень понимания С++! В статье навести корректуру (поправить опечатки, ошибки) и однозначно поместить в библиотеку форума.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Sep 11 2010, 12:11
Сообщение #97


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

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(MrYuran @ Sep 11 2010, 11:39) *
Ну так представьте народу второй бок, в виде контр-статьи. Чтобы можно было пользоваться, а не голословно.
Была такая идея, но все сильно завязано на нашу внутреннюю инфраструктуру на экспозицию которой никто добро не даст. Со временем попробую отделить мух от котлет.


Цитата(dxp @ Sep 11 2010, 14:49) *
То, о чем вы говорите, - это ортогональная вещь. Нативный код - это нативный код, и он обладает такими свойствами, которые не заменят никакие кодогенераторы. Есть отличный кодогенератор COG, который позволяет писать определения прямо в исходном коде. И в ряде случаев это действительно удобная и мощная штука.

Позволю себе еще раз выразить свою точку зрения на подобные вещи требующие хорошего владения всеми элементами C++: какими-бы навороченными не были возможности шаблонов они все равно остаются в рамках языка. Они не генерируют мэйкфайлы, не делают выжимки для документации, не проверяют на корректность совокупность параметров конфигурации МК, не генерирует код который приходится писать на ассемблере. Все это позволяют делать высокоуровневые надстройки, которые видят не пару портов, а весь комплекс в целом.

Конечно, для одного небольшого проекта в год вариант описанный в статье закрывает почти все нужды, но для больших объемов, как показывает практика, что описанный мной подход, ИМХО конечно, оказался гораздо удобнее.

Замечание насчет нативного кода не ясно - код созданный на базе описателей является нативным и даже оптимизированным под конкретный МК или компилятор.
Go to the top of the page
 
+Quote Post
BSVi
сообщение Sep 12 2010, 06:58
Сообщение #98


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 18-12-07
Из: Киев
Пользователь №: 33 391



Уже некоторое время пишу на плюсах в эмбеддед-проектах. Довольно удобно получается. Я бы не сказал, что плюсы не прощают архитектурные ошибки. Скорее, плюсы сужают область поиска правильной архитектуры - каждая сущность - класс. Кроме того, существует куча паттернов, о которых так много говорят программеры для "старших братьев". Собственно, сейчас изучением паттернов я и занят. После статьи я понял, что стоит почитать еще и Александреску.


--------------------
http://bsvi.ru/ - блог эмбеддера
Go to the top of the page
 
+Quote Post
neiver
сообщение Sep 12 2010, 08:14
Сообщение #99


Местный
***

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



Я исправил высказынные замечания и некоторые опечатки.
Вот исправленная версия.

PS.
Если кто хочет опубликовать статью у себя - пожалуйса!
Ссылаться можно на мой Git репозиторий:
AvrCpp
Прикрепленные файлы
Прикрепленный файл  CppGpioForAvr.zip ( 134.52 килобайт ) Кол-во скачиваний: 717
 
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 12 2010, 23:05
Сообщение #100


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Великолепная статья!
Самому очень понравилась!
Немного пропиарил ))
DI HALT'у тоже понравилась и теперь её можно лицезреть у него на сайте

P.S. аффтар жги ещё! это очень круто wink.gif

И да, ВСЕХ С ДНЕМ ПРОГРАММИСТА!!!!
Чистого и безглючного кода нам всем cheers.gif


--------------------
The truth is out there...
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 Текстовая версия Сейчас: 20th July 2025 - 23:29
Рейтинг@Mail.ru


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