Страница 2 из 3
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 20:16:37
HHIMERA
ArtDen писал(а):
И как это относится к вопросу библиотеки C++ для работы с портами AVR?!

Это же ваше???
Недавно столкнулся с C++ - библиотекой для работы с портами ввода/вывода на STM32. Очень удобная штука.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 20:36:10
YS
То, что можно по ошибке написать
Ну, знаете ли, по ошибке можно и Off вместо On написать.
И можно всё-таки пояснить зачем нужно знать ассемблер, чтобы программировать на МК?
В частности, чтобы понимать, почему C++ под такие мелкие системы неприменим.
Чтобы иметь возможность оценить эффективность кода, глянув в дизассемблер. Чтобы понимать, почему GCC лучше, чем mikroBASIC, и почему mikroBASIC лучше, чем AlgorithmBuilder. А также почему IAR порой лучше всех перечисленных компиляторов вместе взятых.
А еще есть вещи, которые невозможно/трудно/нецелесообразно писать на том же Си. Например, софтовую реализацию 1-Wire, где каждый такт на счету. Очень полезно писать работу со сдвиговыми регистрами на ассемблере, ибо разница в скорости существенна. И так далее, и тому подобное.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 20:39:35
ArtDen
YS писал(а):В частности, чтобы понимать, почему
C++ под такие мелкие системы неприменим.
Можно чем-нибудь подтвердить эту мысль?
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 20:46:59
YS
Можно чем-нибудь подтвердить эту мысль?
Я ведь уже приводил дизассемблированный код для ООП-варианта и чистого Си. Видно, что в ООП-варианте для каждой строки генерируется отдельный блок одинакового кода. Зачем? Это бесполезная трата памяти и времени. И это в самом простом проекте, проще которого не бывает.
Представляете, что произойдет, если вдруг захотеть породить экземпляр класса?
Еще раз призываю - поглядите на Arduino. Там как раз упрощенный C++. Дизассемблируйте что-то, написанное на Wiring, и ужаснитесь.

Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 20:56:39
ArtDen
YS писал(а):Я ведь уже приводил дизассемблированный код для ООП-варианта и чистого Си)
Код не аналогичный.
Чтобы код был аналогичный, вместо
LED_PORT^=(LED1_PIN | LED2_PIN); должно быть
LED_PORT^=LED1_PIN; LED_PORT^=LED2_PIN. К тому-же мне никто не мешает написать класс Pins для работы с несколькими пинами одновременно (вместо Pin как в первом примере). Тогда мой пример будет выглядеть как
Код: Выделить всё
typedef Pins<'B', 0x1 | 0x2> LED1AND2Pins;
....
LED1AND2Pins::ConfOut();
for (;;)
{
LED1AND2Pins::Cpl();
_delay_ms(500); // Делаем задержку
}
Ассемблерный код тогда станет полностью аналогичный с Pure-C
В общем, никто так и не понял в чём профит такого подхода
PS: подтверждения ненужности C++ для МК так и не получил

Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 21:04:21
YS
подтверждения ненужности C++ для МК так и не получил
Мне за Вас погуглить сравнение эффективности Wiring (упрощенный C++ для AVR) и pure C?
|Ассемблерный код тогда станет полностью аналогичный с Pure-C
Уверены?
Потом, мы же говорим не о светодиодной мигалке, а о чем-то приличном? Напишите, например, вывод в регистр HC595, и сравним.

Хотя это тоже на уровне мигалки.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 21:14:14
ArtDen
YS писал(а):Мне за Вас погуглить сравнение эффективности Wiring (упрощенный C++ для AVR) и pure C?
А разве разговор идёт о Wiring?
YS писал(а):|Ассемблерный код тогда станет полностью аналогичный с Pure-C
Уверены?
Конечно.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 21:20:12
YS
А разве разговор идёт о Wiring?
Я ведь даже в скобках на всякий случай указал, что такое Wiring.

Кстати компилятор там - тот же GCC, так что сравнение корректно.
Только не говорите, что использующий плюсовые фичи остановится на их применении к портам.

Хотя, в общем, и тут особых преимуществ перед дефайнами не видно.
Смысл дефайнов в том, что большинство операций, ими описанных, должно выполниться препроцессором либо оптимизатором и не войти в результирующий бинарник. А вот ООП-фишки такого преимущества лишены.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 21:28:16
ArtDen
YS писал(а):Я ведь даже в скобках на всякий случай указал, что такое Wiring.

Кстати компилятор там - тот же GCC, так что сравнение корректно.
Не вижу логической связи между утверждениями "Wiring генерирует тормозной код" и "Компилятор C++ генерирует тормозной код"
YS писал(а):Только не говорите, что использующий плюсовые фичи остановится на их применении к портам.

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

И почему ООП-фишки лишены такой возможности? (кстати, какой именно возможности?)
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 21:28:39
HHIMERA
ArtDen писал(а):
В общем, никто так и не понял в чём профит такого подхода
Да, не смогли раскрыть тему архинужности С++ полностью... бывает...
PS: подтверждения ненужности C++ для МК так и не получил
А нужно??? Кому и зачем???
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 21:31:32
HHIMERA
ArtDen писал(а):
Не совсем понял
Тоже не понял.
Название темы... хоть помните???

Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 21:35:26
ArtDen
HHIMERA, не надо гнать оффтопик. Для выражения любви/ненависти к одному из языков программирования - ассемблера, С или C++ есть две другие темы:
http://www.radiokot.ru/forum/viewtopic.php?f=20&t=5931 и
http://www.radiokot.ru/forum/viewtopic.php?f=20&t=37190
Эта же тема про библиотеку для работы с портами ввода/вывода для AVR на C++.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 21:43:22
ILYAUL
Эта же тема про библиотеку для работы с портами ввода/вывода для AVR на C++.
Так Вы нам не доказали чем она лучше традиционного подхода. Мы бы поняли , если бы Ваш код компилятор свёл к такому.
Т.к Вы не знаете asm , поясню- это обычная мигалка светодиодом
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 21:48:58
HHIMERA
2ArtDen
Если вы совсем не в теме, то и не стоит так нервничать...
И если у С++ есть неоспоримые преимущества, так покажите их...
И любовь/ненависть тут совсем не при чём... есть такие понятия как "целесообразность" и "наилучший/быстрый результат"...
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 22:06:29
YS
Не вижу логической связи между утверждениями "Wiring генерирует тормозной код" и "Компилятор C++ генерирует тормозной код"
Wiring ничего не генерирует.

Wiring - диалект C++, который компилируется GCC...
Не совсем понял
Я имел в виду, что скорее всего, парадигма ООП будет распространена на всю программу. : )
Тоже не понял. Код (бинарный) выполняется процессором. Если имелся ввиду исходный код, то он не выполняется ни оптимизатором, не препроцессором
Тогда я Вас очень удивлю. Если Вы напишете
то компилятор на этапе разбора (!) вычислит значение (((2+3)+4*8) | (1<<2)), и в код пойдет
Да-да, компилятор выполнит написанный Вами код. А еще он может
оптимизировать повторяющиеся части выражений. И при написании макросов вовсю этим пользуются. Макрос - не переменная. Он подставляется в исходник в виде строки.
***
Тов.
ArtDen, не обращайте внимания, тов.
HHIMERA просто перенервничал.
А в целом - я ни в чем Вас не обвиняю и не призываю прям щас верить мне на слово и отказываться от С++ (более того, есть области, где он незаменим). Вы написали код, вложили усилия, что-то узнали. Вы молодец.

Просто почитайте про Wiring, внутреннюю кухню объектов, оптимизации компиляторов и принципы разбора кода. И все-таки поглядите на ассемблер. : ) А я, пожалуй, закончу тут проповедовать.

Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 22:26:13
ArtDen
HHIMERA писал(а):2ArtDen
Если вы совсем не в теме, то и не стоит так нервничать...
В какой именно я "не в теме": C/C++, работа с портами ввода/вывода или программирование для МК?
HHIMERA писал(а):И если у С++ есть неоспоримые преимущества, так покажите их...
Ещё раз повторяю.
Тема не про преимущества/недостатки С++ перед си и ассемблером. Тема про конкретную библиотеку для работы с портами.
HHIMERA писал(а):И любовь/ненависть тут совсем не при чём... есть такие понятия как "целесообразность" и "наилучший/быстрый результат"...
Есть конечно. Буду рад услышать "целесообразность" и "наилучший/быстрый результат" применительно к данной теме
ILYAUL писал(а):Так Вы нам не доказали чем она лучше традиционного подхода.
Повторюсь:
1. Нога определяется только в одном месте (1 строка). На си ради этого надо писать три строки:
#define XXXXX_PORT PORTA
#define XXXXX_DIR DDRA
#define XXXXX_BIT 0x01
2. Меньше вероятность допустить ошибки перепутав порты или биты
3. Лучшая читаемость
4. Проще переносить код между аппаратными платформами
YS писал(а):
Тогда я Вас очень удивлю. Если Вы напишете
то компилятор на этапе разбора (!) вычислит значение (((2+3)+4*8) | (1<<2)), и в код пойдет
Да-да,
компилятор выполнит написанный Вами код. А еще он может
оптимизировать повторяющиеся части выражений. И при написании макросов вовсю этим пользуются. Макрос - не переменная. Он подставляется в исходник в виде строки.
Про выполнение исходного кода компилятором написан бред. Он ничего не выполняет. Далее по пунктам:
YS писал(а):
компилятор на этапе разбора (!) вычислит значение (((2+3)+4*8) | (1<<2)),
Бред. На этапе разбора компилятор строит AST-дерево. При этом он ничего не вычисляет. Значение (((2+3)+4*8) | (1<<2)) будет вычислено на этапе многостадийной оптимизации в одной из стадий свёртки констант. Повторю ещё раз:
компилятор ничего не выполняет!
YS писал(а):
И при написании макросов вовсю этим пользуются. Макрос - не переменная. Он подставляется в исходник в виде строки.
Когда это я писал, что макрос - это переменная?
И вообще как это относиться к теме?
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 22:47:08
HHIMERA
ArtDen писал(а):
Повторюсь:
1. Нога определяется только в одном месте (1 строка). На си ради этого надо писать три строки:
#define XXXXX_PORT PORTA
#define XXXXX_DIR DDRA
#define XXXXX_BIT 0x01
Надуманно... одной строкой больше, одной меньше... не впечатляет...
При групповой инициализации может быть и наоборот...
2. Меньше вероятность допустить ошибки перепутав порты или биты
Надуманно... есть статистические данные по этому поводу, которым можно верить??? "Капитана Очевидность не предлагать!"(С)
3. Лучшая читаемость
Надуманно... для этого есть абстракция...
4. Проще переносить код между аппаратными платформами
Надуманно... С++ не пользуюсь, а трудностей с переносом не ощущаю... "Что я не так делаю?" (С)

Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 22:54:10
ArtDen
HHIMERA писал(а):ArtDen писал(а):
3. Лучшая читаемость
Надуманно... для этого есть
абстракция...
Во. Я второй раз уже слышу это слово в этой теме. Так что есть абстракция применительно к читаемости кода? Можно с примерами.
HHIMERA писал(а):Надуманно... С++ не пользуюсь, а трудностей с переносом не ощущаю... "Что я не так делаю?" (С)

Ещё раз повторюсь:
речь идёт не про С++, а про библиотеку работы с портами. Вопросы по С/С++ обсуждаются в соседней теме.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Сб фев 02, 2013 23:22:07
HHIMERA
ArtDen писал(а):Ещё раз повторюсь: речь идёт не про С++, а про библиотеку работы с портами. Вопросы по С/С++ обсуждаются в соседней теме.
Ладно... пусть будет так... вам виднее...
Но тема, вообще то, называется
"Пример работы с I/O портами AVR на C++"... может просто пример был неудачный...

Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 08:16:52
oleg110592
off не для холивара:
Почему Си - хорошо, а Си++ - плохо
http://www.codenet.ru/progr/cpp/c-vs-cpp/
Пример работы с I/O портами AVR на Arduino
http://www.arduino.cc/en/Tutorial/Button
имхо выглядит нагляднее