Пример работы с I/O портами AVR на C++

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ArtDen писал(а): И как это относится к вопросу библиотеки C++ для работы с портами AVR?! :shock:
Это же ваше???
Недавно столкнулся с C++ - библиотекой для работы с портами ввода/вывода на STM32. Очень удобная штука.
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

То, что можно по ошибке написать
Ну, знаете ли, по ошибке можно и Off вместо On написать. :)
И можно всё-таки пояснить зачем нужно знать ассемблер, чтобы программировать на МК?
В частности, чтобы понимать, почему C++ под такие мелкие системы неприменим. :)

Чтобы иметь возможность оценить эффективность кода, глянув в дизассемблер. Чтобы понимать, почему GCC лучше, чем mikroBASIC, и почему mikroBASIC лучше, чем AlgorithmBuilder. А также почему IAR порой лучше всех перечисленных компиляторов вместе взятых.

А еще есть вещи, которые невозможно/трудно/нецелесообразно писать на том же Си. Например, софтовую реализацию 1-Wire, где каждый такт на счету. Очень полезно писать работу со сдвиговыми регистрами на ассемблере, ибо разница в скорости существенна. И так далее, и тому подобное.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34

Сообщение ArtDen »

YS писал(а):В частности, чтобы понимать, почему C++ под такие мелкие системы неприменим. :)
Можно чем-нибудь подтвердить эту мысль?
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Можно чем-нибудь подтвердить эту мысль?
Я ведь уже приводил дизассемблированный код для ООП-варианта и чистого Си. Видно, что в ООП-варианте для каждой строки генерируется отдельный блок одинакового кода. Зачем? Это бесполезная трата памяти и времени. И это в самом простом проекте, проще которого не бывает.

Представляете, что произойдет, если вдруг захотеть породить экземпляр класса? :)))

Еще раз призываю - поглядите на Arduino. Там как раз упрощенный C++. Дизассемблируйте что-то, написанное на Wiring, и ужаснитесь. :)))
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34

Сообщение 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

В общем, никто так и не понял в чём профит такого подхода :facepalm:

PS: подтверждения ненужности C++ для МК так и не получил :)
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Реклама
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

подтверждения ненужности C++ для МК так и не получил
Мне за Вас погуглить сравнение эффективности Wiring (упрощенный C++ для AVR) и pure C? :)
|Ассемблерный код тогда станет полностью аналогичный с Pure-C
Уверены?

Потом, мы же говорим не о светодиодной мигалке, а о чем-то приличном? Напишите, например, вывод в регистр HC595, и сравним. :) Хотя это тоже на уровне мигалки.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34

Сообщение ArtDen »

YS писал(а):Мне за Вас погуглить сравнение эффективности Wiring (упрощенный C++ для AVR) и pure C? :)
А разве разговор идёт о Wiring?
YS писал(а):
|Ассемблерный код тогда станет полностью аналогичный с Pure-C
Уверены?
Конечно.
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

А разве разговор идёт о Wiring?
Я ведь даже в скобках на всякий случай указал, что такое Wiring. :) Кстати компилятор там - тот же GCC, так что сравнение корректно.

Только не говорите, что использующий плюсовые фичи остановится на их применении к портам. :) Хотя, в общем, и тут особых преимуществ перед дефайнами не видно.

Смысл дефайнов в том, что большинство операций, ими описанных, должно выполниться препроцессором либо оптимизатором и не войти в результирующий бинарник. А вот ООП-фишки такого преимущества лишены.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34

Сообщение ArtDen »

YS писал(а):Я ведь даже в скобках на всякий случай указал, что такое Wiring. :) Кстати компилятор там - тот же GCC, так что сравнение корректно.
Не вижу логической связи между утверждениями "Wiring генерирует тормозной код" и "Компилятор C++ генерирует тормозной код"
YS писал(а):Только не говорите, что использующий плюсовые фичи остановится на их применении к портам. :)
Не совсем понял
YS писал(а):Смысл дефайнов в том, что абсолютное большинство кода, ими описанного, должно выполниться препроцессором либо оптимизатором и не войти в результирующий бинарник. А вот ООП-фишки такого преимущества лишены.
Тоже не понял. Код (бинарный) выполняется процессором. Если имелся ввиду исходный код, то он не выполняется ни оптимизатором, не препроцессором :shock: И почему ООП-фишки лишены такой возможности? (кстати, какой именно возможности?)
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ArtDen писал(а): В общем, никто так и не понял в чём профит такого подхода :facepalm:
Да, не смогли раскрыть тему архинужности С++ полностью... бывает... :))
PS: подтверждения ненужности C++ для МК так и не получил :)
А нужно??? Кому и зачем???
"Я не даю готовых решений, я заставляю думать!"(С)
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ArtDen писал(а): Не совсем понял
Тоже не понял.
Название темы... хоть помните??? :)))
"Я не даю готовых решений, я заставляю думать!"(С)
Мучитель микросхем
Аватара пользователя
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34

Сообщение 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++.
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Эта же тема про библиотеку для работы с портами ввода/вывода для AVR на C++.


Так Вы нам не доказали чем она лучше традиционного подхода. Мы бы поняли , если бы Ваш код компилятор свёл к такому.

Код: Выделить всё

Loop:
sbi PINx,LED
rjmp LOOP
Т.к Вы не знаете asm , поясню- это обычная мигалка светодиодом
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

2ArtDen
Если вы совсем не в теме, то и не стоит так нервничать...
И если у С++ есть неоспоримые преимущества, так покажите их...
И любовь/ненависть тут совсем не при чём... есть такие понятия как "целесообразность" и "наилучший/быстрый результат"...
"Я не даю готовых решений, я заставляю думать!"(С)
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Не вижу логической связи между утверждениями "Wiring генерирует тормозной код" и "Компилятор C++ генерирует тормозной код"
Wiring ничего не генерирует. :) Wiring - диалект C++, который компилируется GCC...
Не совсем понял
Я имел в виду, что скорее всего, парадигма ООП будет распространена на всю программу. : )
Тоже не понял. Код (бинарный) выполняется процессором. Если имелся ввиду исходный код, то он не выполняется ни оптимизатором, не препроцессором
Тогда я Вас очень удивлю. Если Вы напишете

Код: Выделить всё

a=((2+3)+4*8) | (1<<2);
то компилятор на этапе разбора (!) вычислит значение (((2+3)+4*8) | (1<<2)), и в код пойдет
Да-да, компилятор выполнит написанный Вами код. А еще он может оптимизировать повторяющиеся части выражений. И при написании макросов вовсю этим пользуются. Макрос - не переменная. Он подставляется в исходник в виде строки.

***

Тов. ArtDen, не обращайте внимания, тов. HHIMERA просто перенервничал. :)

А в целом - я ни в чем Вас не обвиняю и не призываю прям щас верить мне на слово и отказываться от С++ (более того, есть области, где он незаменим). Вы написали код, вложили усилия, что-то узнали. Вы молодец. :) Просто почитайте про Wiring, внутреннюю кухню объектов, оптимизации компиляторов и принципы разбора кода. И все-таки поглядите на ассемблер. : ) А я, пожалуй, закончу тут проповедовать. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34

Сообщение 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 писал(а): Тогда я Вас очень удивлю. Если Вы напишете

Код: Выделить всё

a=((2+3)+4*8) | (1<<2);
то компилятор на этапе разбора (!) вычислит значение (((2+3)+4*8) | (1<<2)), и в код пойдет
Да-да, компилятор выполнит написанный Вами код. А еще он может оптимизировать повторяющиеся части выражений. И при написании макросов вовсю этим пользуются. Макрос - не переменная. Он подставляется в исходник в виде строки.
Про выполнение исходного кода компилятором написан бред. Он ничего не выполняет. Далее по пунктам:
YS писал(а): компилятор на этапе разбора (!) вычислит значение (((2+3)+4*8) | (1<<2)),
Бред. На этапе разбора компилятор строит AST-дерево. При этом он ничего не вычисляет. Значение (((2+3)+4*8) | (1<<2)) будет вычислено на этапе многостадийной оптимизации в одной из стадий свёртки констант. Повторю ещё раз: компилятор ничего не выполняет!
YS писал(а): И при написании макросов вовсю этим пользуются. Макрос - не переменная. Он подставляется в исходник в виде строки.
Когда это я писал, что макрос - это переменная?

И вообще как это относиться к теме?
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ArtDen писал(а): Повторюсь:
1. Нога определяется только в одном месте (1 строка). На си ради этого надо писать три строки:
#define XXXXX_PORT PORTA
#define XXXXX_DIR DDRA
#define XXXXX_BIT 0x01
Надуманно... одной строкой больше, одной меньше... не впечатляет...
При групповой инициализации может быть и наоборот...
2. Меньше вероятность допустить ошибки перепутав порты или биты
Надуманно... есть статистические данные по этому поводу, которым можно верить??? "Капитана Очевидность не предлагать!"(С)
3. Лучшая читаемость
Надуманно... для этого есть абстракция...
4. Проще переносить код между аппаратными платформами
Надуманно... С++ не пользуюсь, а трудностей с переносом не ощущаю... "Что я не так делаю?" (С) :)))
"Я не даю готовых решений, я заставляю думать!"(С)
Мучитель микросхем
Аватара пользователя
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34

Сообщение ArtDen »

HHIMERA писал(а):
ArtDen писал(а): 3. Лучшая читаемость
Надуманно... для этого есть абстракция...
Во. Я второй раз уже слышу это слово в этой теме. Так что есть абстракция применительно к читаемости кода? Можно с примерами.
HHIMERA писал(а):Надуманно... С++ не пользуюсь, а трудностей с переносом не ощущаю... "Что я не так делаю?" (С) :)))
Ещё раз повторюсь: речь идёт не про С++, а про библиотеку работы с портами. Вопросы по С/С++ обсуждаются в соседней теме.
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ArtDen писал(а):Ещё раз повторюсь: речь идёт не про С++, а про библиотеку работы с портами. Вопросы по С/С++ обсуждаются в соседней теме.
Ладно... пусть будет так... вам виднее... :))
Но тема, вообще то, называется "Пример работы с I/O портами AVR на C++"... может просто пример был неудачный... :)
"Я не даю готовых решений, я заставляю думать!"(С)
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

off не для холивара:
Почему Си - хорошо, а Си++ - плохо http://www.codenet.ru/progr/cpp/c-vs-cpp/
Пример работы с I/O портами AVR на Arduino http://www.arduino.cc/en/Tutorial/Button
имхо выглядит нагляднее
Ответить

Вернуться в «AVR»