Страница 3 из 3
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 09:32:41
ArtDen
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 10:34:03
oleg110592
вопрос, немного не по теме - есть ли еще библиотеки классов C++ для AVR?
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 16:01:01
Goldsmith
ArtDen писал(а):Более аргументированной статьи по поводу C vs C++ я не встречал

Да уж,
Ваня Жуков расставил-таки точки над i в своей версии
письма на деревню дедушке...
Не иначе как его вчерась хозяин шпандырем отчесал за то, что отказался перегружать операторы и использовать объекты.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 18:01:49
oleg110592
Имхо, применительно для AVR Ваня Жуков прав. Писать на Си++ для тини13/26/2313 вряд ли кто будет, там и Си не очень. Для компьютера - да Си++ хорош и то из-за наличия библиотек классов. И то вытесняется другими языками программирования. Для AVR полно библиотек на Си, наверное можно использовать в программе написанной на Си++, а надо ли. Простите за off.
По теме:
http://kazus.ru/forums/showthread.php?t=17357
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 19:01:32
HHIMERA
Да... Паша там молодец!!!
Раздал "сёстрам по серьгам"...
На ДиАхтунге тоже тема проскакивала... но в "ворошиловские стрелки" толпой народ, почему-то, не повалил... видать "не поняли счастья своего безмерного и безмятежного"...
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 21:30:41
Goldsmith
oleg110592 писал(а):Имхо, применительно для AVR Ваня Жуков прав. Писать на Си++ для тини13/26/2313 вряд ли кто будет
Таки да. Но дело в том, что (к счастью) Tiny13 на сегодняшний день не единственный процессор (и даже не самый мощный), к тому же далеко не все программы укладываются в килобайт кода, а крайне ценное мнение Вани высказано
о языке в целом безотносительно
области его применения. И опубликовано письмецо отнюдь не в разделе "Программировуем Tiny13", а, заметьте, "Языки программирования". Здесь весьма уместно мнение
профессора Преображенского по аналогичному поводу:
вы в присутствии двух людей с университетским образованием позволяете себе с развязностью совершенно невыносимой подавать какие-то советы космического масштаба и космической же глупости
Да и вообще в качестве авторитетов в части программирования лучше ссылаться на Дейкстру, Вирта или Кнута, как-то весомее получается. Каждый должен заниматься своим делом:
Ванька покривил рот, потер своим черным кулаком глаза и всхлипнул.
"Я буду тебе табак тереть, -- продолжал он, -- богу молиться, а если что, то секи меня, как Сидорову козу. А ежели думаешь, должности мне нету, то я Христа ради попрошусь к приказчику сапоги чистить, али заместо Федьки в подпаски пойду."
Высечь и впрямь не мешало бы... Так, для порядку.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 22:04:59
HHIMERA
Goldsmith писал(а):
Да и вообще в качестве авторитетов в части программирования лучше ссылаться на Дейкстру, Вирта или Кнута, как-то весомее получается. Каждый должен заниматься своим делом:
Да как-то это:
ArtDen писал(а):
1. Код проще читается. Не надо напрягать мозги при виде
RST_PORT &= ~RST_PINMASK;. Выражение
RST_Pin::Off(); гораздо понятнее.
2. Нереально допустить такое ошибки как
RST_PORT &= RST_PINMASK;
С каких это пор знание ассемблера обязательно для программирования на МК?
не вяжется с этим:
Дейкстра многократно предостерегал от попыток превратить разработку программ в некий тривиальный процесс; по его мнению, программирование, в сути своей — чрезвычайно сложная научная и инженерная деятельность, и никакие новые методы и инструменты не смогут кардинально изменить это положение — они лишь освобождают программиста от части рутинной работы. Попытки же превратить программирование в простое занятие, доступное каждому, обречены на провал.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 23:03:57
Goldsmith
Не вяжется, но не язык тому виной, и уж тем более не объектная парадигма.
Критиковать конкретное решение конкретной задачи - конструктивно. Автор ознакомится с альтернативными предложениями, сравнит со своим собственным и либо убедится, что его решение оптимально, либо увидит его слабые стороны и будет думать, как улучшить.
Отвергать решение на основании того, что некто тиснул невнятную статеечку в интернетах по предмету, в котором сам толком не разобрался и потому напрочь отрицает, крайне неконструктивно.
Предлагаемое решение не идеально, но вовсе не по причинам, указанным в письме Вани Жукова Константину Макарычу.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 23:11:55
oleg110592
написал же off не для холивара:
мне, например, больше понравились комментарии к злосчастной статье Вани.
Тема С++ для микроконтроллеров мне интересна. Где бы посмотреть примеры на С++ для AVR (про ScmRTOS знаю).
(к счастью) Tiny13 на сегодняшний день не единственный процессор (и даже не самый мощный)
Получается С++ придется применять на жирных Mega (особенно если использовать STL и исключения), а по мнению профи, на этом форуме и не только на этом, вместо Mega надо применять ARM.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 23:39:31
HHIMERA
Goldsmith писал(а):
Отвергать решение на основании того, что некто тиснул невнятную статеечку в интернетах по предмету, в котором сам толком не разобрался и потому напрочь отрицает, крайне неконструктивно.
Предлагаемое решение не идеально, но вовсе не по причинам, указанным в письме Вани Жукова Константину Макарычу.
Так, всё таки... решение не идеально... отвергаем???
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 03, 2013 23:47:25
HHIMERA
oleg110592 писал(а):
а по мнению профи, на этом форуме и не только на этом, вместо Mega надо применять ARM.
И толку будет больше, чем от Меги на С++...
Re: Пример работы с I/O портами AVR на C++
Добавлено: Пн фев 04, 2013 00:26:28
Goldsmith
oleg110592 писал(а):Получается С++ придется применять на жирных Mega (особенно если использовать STL и исключения)
Тут вовсе не в жире дело. Языки общего назначения (как С и С++) создаются для решения определенных классов задач, а не под конкретные микросхемы.
Есть задачи, которые превосходно укладываются в рамки объектно-ориентированного анализа и проектирования. Для них использование С++ вполне органично. Есть задачи, которые более естественно решаются структурными методами. Туда тоже можно притянуть объекты за уши, но получится не слишком элегантно. Чтобы сделать правильный выбор, нужно достаточно хорошо знать и то, и другое. Чем знаний меньше, тем решение необоснованнее (и одновременно категоричнее, что мы и видели в злополучном письме дедушке).
HHIMERA писал(а):Так, всё таки... решение не идеально... отвергаем???
Я думаю, каждый должен решить это для себя сам.
Лично мне оно не слишком понравилось, поэтому
лично я воздержусь от его копирования. Но набираться наглости и говорить от лица всего прогрессивного человечества, как Ваня, все-таки не стану, тем более что оно (человечество) меня на это не уполномочило. Если кому-то решение пришлось впору, это его осознанный выбор.
Любая абстракция хороша, когда помогает решать задачи, и плоха, когда мешает. У меня не возникло ощущения, что мне она окажется полезной в своем нынешнем виде.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Пн фев 04, 2013 07:38:22
ArtDen
Добавил active state (активное состояние) для пина, чтобы соответствовать оригинальной библиотеке для STM32 (и изначальным макросам для AVR по мотивам которых эта либа была написана).
Теперь можно добавлять 'L' или 'H' (по умолчанию стоит 'H'), чтобы указывать активное состояние пина ('H' - 1, 'L' - 0):
Код: Выделить всё
typedef Pin<'B', 0, 'L'> LED1Pin;
typedef Pin<'B', 1, 'H'> LED2Pin; // 'H' можно не писать: Pin<'B', 1>
Re: Пример работы с I/O портами AVR на C++
Добавлено: Пн фев 04, 2013 12:13:16
oleg110592
Re: Пример работы с I/O портами AVR на C++
Добавлено: Пн фев 04, 2013 13:08:39
Goldsmith
Аналогичная заметка от гуру: James W. Grenning. Why are you Still Using C?
Мой реферат статьи и ее
оригинал.
Re: Пример работы с I/O портами AVR на C++
Добавлено: Пн фев 04, 2013 17:39:45
HHIMERA
Опрос, проведенный Embedded.com, показал, что 68% респондентов используют для разработки встроенного ПО язык С. По какой причине они предпочитают C, а не C++? Частично это объясняется доступностью инструментальных средств. Но помимо этого многие разработчики даже не подозревают, какие возможности открывает перед ними объектно-ориентированный подход.
Угу... видать не все очки носят... не видят просто...
Подчас репутация C++ страдает из-за того, что он услужливо выполняет за вас некоторые весьма дорогостоящие операции (например. передачу громоздких объектов по значению). Есть способы надежно защититься от этой непрошенной помощи, например, объявив закрытый конструктор копирования для таких классов. Аналогично можно защититься от возврата объекта по значению.
Вот только "Бюро медвежьих услуг" и не хватало...
Резюме автора: программисты используют C++ для встроенных разработок намного реже, чем следовало бы, причем это связано не с объективными недостатками языка и/или компилятора, а скорее с незнанием и склонностью верить ничем не подтвержденным слухам.
Вообще смахивает на примитивный маркетинг... типа "Тогда мы идём к вам!"(С)...
А пытаться доказывать, что 68% респондентов "тупо ошибаются и просто верят слухам"... по крайней мере - глупо...
Если ещё и вспомнить, что ни С, ни С++ не находятся в списке рекомендованных для применения в ответственных приложениях... и учесть, что поиск багов и ошибок, учитывая большую развитость и сложность С++, более затруднителен, то становится очевиден и понятен выбор 68% респондентов... использующих для разработки встроенного ПО язык С...
Re: Пример работы с I/O портами AVR на C++
Добавлено: Вс фев 10, 2013 13:44:31
ArtDen
По замечаниям добавил 2 дополнительные функции:
ConfInPulledUp - настраивает пин на вход с подтяжкой к + питания
Пример:
Код: Выделить всё
typedef Pin<'B', 0> InpPin;
InpPin::ConfInPulledUp(); // вход с подтяжкой к +
bool pin_value = InpPin::Signaled();
Latched - для пина, настроенного на выход возвращает последнее записанное туда состояние
Пример:
Код: Выделить всё
typedef Pin<'B', 1, 'L'> LED1Pin;
LED1Pin::ConfOut();
LED1Pin::On();
bool pin_out_value = LED1Pin::Latched(); // читаем выходное состояние пина
Re: Пример работы с I/O портами AVR на C++
Добавлено: Пн фев 11, 2013 19:24:12
Kavka
ArtDen писал(а):1. Нога определяется только в одном месте (1 строка). На си ради этого надо писать три строки:
2. Меньше вероятность допустить ошибки перепутав порты или биты
3. Лучшая читаемость
4. Проще переносить код между аппаратными платформами
1) Ну, если точнее, то, в худшем случае, четыре строчки!
2) Это можно получить дефайнами.
3) И это можно получить дефайнами.
4) И это можно получить дефайнами тоже.
Если речь идёт о "написал в одном месте правильно и используй где хочешь",
то перефразирую, практически, запретную для этого сайта реплику из известного сериала:
Как, тебе не нравятся дефайны? Просто ты не умеешь их готовить!
Спойлер
Ничего не мешает написать вот так. Кому что-то мешает - читай подпись под сообщением.Код: Выделить всё
#define LED1 B, 1
#define LED2 B, 2
void main()
{
char a;
PIN_INIT_AS_INPUT(LED1);
PIN_PULLUP_ON(LED1);
a = PIN_GET(LED1);
PIN_PULLUP_OFF(LED1);
PIN_INIT_AS_OUTPUT(LED1);
PIN_INIT_AS_OUTPUT(LED2);
PIN_CLR(LED1);
PIN_CLR(LED2);
while (1)
{
PIN_NEG(LED1);
PIN_NEG(LED2);
}
}
Разворачивается, как положено, в следующий код Код: Выделить всё
void main()
{
char a;
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
a = PINB & (1 << (1));
PORTB &= ~(1 << (1));
DDRB |= (1 << (1));
DDRB |= (1 << (2));
PORTB &= ~(1 << (1));
PORTB &= ~(1 << (2));
while (1)
{
PORTB ^= (1 << (1));
PORTB ^= (1 << (2));
}
}