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

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

Сообщение ArtDen »

oleg110592 писал(а):off не для холивара:
Почему Си - хорошо, а Си++ - плохо http://www.codenet.ru/progr/cpp/c-vs-cpp/
:)) :))
Более аргументированной статьи по поводу C vs C++ я не встречал :)
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

вопрос, немного не по теме - есть ли еще библиотеки классов C++ для AVR?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

ArtDen писал(а):Более аргументированной статьи по поводу C vs C++ я не встречал :)
Да уж, Ваня Жуков расставил-таки точки над i в своей версии письма на деревню дедушке...

Не иначе как его вчерась хозяин шпандырем отчесал за то, что отказался перегружать операторы и использовать объекты.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Имхо, применительно для AVR Ваня Жуков прав. Писать на Си++ для тини13/26/2313 вряд ли кто будет, там и Си не очень. Для компьютера - да Си++ хорош и то из-за наличия библиотек классов. И то вытесняется другими языками программирования. Для AVR полно библиотек на Си, наверное можно использовать в программе написанной на Си++, а надо ли. Простите за off.
По теме: http://kazus.ru/forums/showthread.php?t=17357
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Да... Паша там молодец!!! :music:
Раздал "сёстрам по серьгам"... :)))
На ДиАхтунге тоже тема проскакивала... но в "ворошиловские стрелки" толпой народ, почему-то, не повалил... видать "не поняли счастья своего безмерного и безмятежного"...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

oleg110592 писал(а):Имхо, применительно для AVR Ваня Жуков прав. Писать на Си++ для тини13/26/2313 вряд ли кто будет
Таки да. Но дело в том, что (к счастью) Tiny13 на сегодняшний день не единственный процессор (и даже не самый мощный), к тому же далеко не все программы укладываются в килобайт кода, а крайне ценное мнение Вани высказано о языке в целом безотносительно области его применения. И опубликовано письмецо отнюдь не в разделе "Программировуем Tiny13", а, заметьте, "Языки программирования". Здесь весьма уместно мнение профессора Преображенского по аналогичному поводу:
вы в присутствии двух людей с университетским образованием позволяете себе с развязностью совершенно невыносимой подавать какие-то советы космического масштаба и космической же глупости
Да и вообще в качестве авторитетов в части программирования лучше ссылаться на Дейкстру, Вирта или Кнута, как-то весомее получается. Каждый должен заниматься своим делом:
Ванька покривил рот, потер своим черным кулаком глаза и всхлипнул.
"Я буду тебе табак тереть, -- продолжал он, -- богу молиться, а если что, то секи меня, как Сидорову козу. А ежели думаешь, должности мне нету, то я Христа ради попрошусь к приказчику сапоги чистить, али заместо Федьки в подпаски пойду."
Высечь и впрямь не мешало бы... Так, для порядку.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Goldsmith писал(а): Да и вообще в качестве авторитетов в части программирования лучше ссылаться на Дейкстру, Вирта или Кнута, как-то весомее получается. Каждый должен заниматься своим делом:
Да как-то это:
ArtDen писал(а): 1. Код проще читается. Не надо напрягать мозги при виде RST_PORT &= ~RST_PINMASK;. Выражение RST_Pin::Off(); гораздо понятнее.
2. Нереально допустить такое ошибки как RST_PORT &= RST_PINMASK;
С каких это пор знание ассемблера обязательно для программирования на МК? :shock:
не вяжется с этим:
Дейкстра многократно предостерегал от попыток превратить разработку программ в некий тривиальный процесс; по его мнению, программирование, в сути своей — чрезвычайно сложная научная и инженерная деятельность, и никакие новые методы и инструменты не смогут кардинально изменить это положение — они лишь освобождают программиста от части рутинной работы. Попытки же превратить программирование в простое занятие, доступное каждому, обречены на провал.
"Я не даю готовых решений, я заставляю думать!"(С)
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

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

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

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

Предлагаемое решение не идеально, но вовсе не по причинам, указанным в письме Вани Жукова Константину Макарычу.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

написал же off не для холивара:
мне, например, больше понравились комментарии к злосчастной статье Вани.
Тема С++ для микроконтроллеров мне интересна. Где бы посмотреть примеры на С++ для AVR (про ScmRTOS знаю).
(к счастью) Tiny13 на сегодняшний день не единственный процессор (и даже не самый мощный)
Получается С++ придется применять на жирных Mega (особенно если использовать STL и исключения), а по мнению профи, на этом форуме и не только на этом, вместо Mega надо применять ARM.
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Goldsmith писал(а): Отвергать решение на основании того, что некто тиснул невнятную статеечку в интернетах по предмету, в котором сам толком не разобрался и потому напрочь отрицает, крайне неконструктивно.

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

Сообщение HHIMERA »

oleg110592 писал(а): а по мнению профи, на этом форуме и не только на этом, вместо Mega надо применять ARM.
И толку будет больше, чем от Меги на С++...
"Я не даю готовых решений, я заставляю думать!"(С)
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

oleg110592 писал(а):Получается С++ придется применять на жирных Mega (особенно если использовать STL и исключения)
Тут вовсе не в жире дело. Языки общего назначения (как С и С++) создаются для решения определенных классов задач, а не под конкретные микросхемы.

Есть задачи, которые превосходно укладываются в рамки объектно-ориентированного анализа и проектирования. Для них использование С++ вполне органично. Есть задачи, которые более естественно решаются структурными методами. Туда тоже можно притянуть объекты за уши, но получится не слишком элегантно. Чтобы сделать правильный выбор, нужно достаточно хорошо знать и то, и другое. Чем знаний меньше, тем решение необоснованнее (и одновременно категоричнее, что мы и видели в злополучном письме дедушке).
HHIMERA писал(а):Так, всё таки... решение не идеально... отвергаем???
Я думаю, каждый должен решить это для себя сам.

Лично мне оно не слишком понравилось, поэтому лично я воздержусь от его копирования. Но набираться наглости и говорить от лица всего прогрессивного человечества, как Ваня, все-таки не стану, тем более что оно (человечество) меня на это не уполномочило. Если кому-то решение пришлось впору, это его осознанный выбор.

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

Сообщение 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>
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Не совсем в тему, но близко: http://www.microcontrollercentral.com/a ... _id=258378&
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Аналогичная заметка от гуру: James W. Grenning. Why are you Still Using C?

Мой реферат статьи и ее оригинал.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Опрос, проведенный Embedded.com, показал, что 68% респондентов используют для разработки встроенного ПО язык С. По какой причине они предпочитают C, а не C++? Частично это объясняется доступностью инструментальных средств. Но помимо этого многие разработчики даже не подозревают, какие возможности открывает перед ними объектно-ориентированный подход.
Угу... видать не все очки носят... не видят просто... :))
Подчас репутация C++ страдает из-за того, что он услужливо выполняет за вас некоторые весьма дорогостоящие операции (например. передачу громоздких объектов по значению). Есть способы надежно защититься от этой непрошенной помощи, например, объявив закрытый конструктор копирования для таких классов. Аналогично можно защититься от возврата объекта по значению.
Вот только "Бюро медвежьих услуг" и не хватало... :))
Резюме автора: программисты используют C++ для встроенных разработок намного реже, чем следовало бы, причем это связано не с объективными недостатками языка и/или компилятора, а скорее с незнанием и склонностью верить ничем не подтвержденным слухам.
Вообще смахивает на примитивный маркетинг... типа "Тогда мы идём к вам!"(С)... :))
А пытаться доказывать, что 68% респондентов "тупо ошибаются и просто верят слухам"... по крайней мере - глупо...

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

Сообщение 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(); // читаем выходное состояние пина
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение 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));
  }
}
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

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