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

 
 
> Как ПРАВИЛЬНО программировать на С++, Вопросы по программированию на С++ для микроконтроллеров.
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
 
Start new topic
Ответов
neiver
сообщение Sep 9 2010, 15:30
Сообщение #2


Местный
***

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



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

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


Гуру
******

Группа: Модераторы
Сообщений: 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
Сергей Борщ
сообщение Sep 10 2010, 09:57
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #5


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

Группа: Свой
Сообщений: 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
Сообщение #6


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

Группа: Свой
Сообщений: 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
dxp
сообщение Sep 11 2010, 11:49
Сообщение #7


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

Сообщений в этой теме
- Serega Doc   Как ПРАВИЛЬНО программировать на С++   Jul 26 2010, 14:25
- - Serega Doc   Это глупый вопрос который обсуждали миллион раз?   Jul 27 2010, 06:43
- - Mahagam   нет. как-то це-крест-крест не сильно прижился у эм...   Jul 27 2010, 08:41
|- - Dima_G   Цитата(Mahagam @ Jul 27 2010, 15:41) нет....   Jul 27 2010, 08:48
- - AHTOXA   Цитата(Serega Doc @ Jul 26 2010, 20:25) Г...   Jul 27 2010, 08:53
|- - Ink   Цитата(AHTOXA @ Jul 27 2010, 12:53) Насле...   Jul 29 2010, 12:50
|- - Dima_G   Цитата(Ink @ Jul 29 2010, 19:50) А не пок...   Jul 29 2010, 13:15
- - Serega Doc   Спасибо все заработало. Что бы не плодить тем буду...   Jul 27 2010, 13:29
|- - ReAl   Ну оно "так и надо по теории". Сама флеш...   Jul 27 2010, 17:31
- - neiver   У меня есть некоторые интересные наработки на Си п...   Jul 29 2010, 15:03
|- - demiurg_spb   Приведите для интереса asm листинг того, во что э...   Jul 29 2010, 16:51
|- - Dima_G   Цитата(neiver @ Jul 29 2010, 22:03) У мен...   Jul 30 2010, 05:56
- - neiver   Для Кодtypedef PinList<Pa1, Pa2, Pa3, Pb3, Pb...   Jul 30 2010, 09:21
- - Ink   ЦитатаОбъекты от статических членов не будут дубли...   Aug 2 2010, 07:43
- - sergeeff   ЦитатаНифига не понял. Если вы посмотрите на sizeo...   Aug 2 2010, 08:03
- - Mahagam   программисты на Си обсуждают и решают проблемы кон...   Aug 2 2010, 09:51
|- - MrYuran   Цитата(Mahagam @ Aug 2 2010, 13:51) прогр...   Aug 2 2010, 09:57
|- - sergeeff   Цитата(Mahagam @ Aug 2 2010, 12:51) прогр...   Aug 3 2010, 10:03
- - Ink   ЦитатаЕсли вы посмотрите на sizeof(A) и наследуемы...   Aug 3 2010, 07:08
|- - Dima_G   Цитата(Ink @ Aug 3 2010, 14:08) Это как т...   Aug 3 2010, 13:16
|- - halfdoom   Цитата(Ink @ Aug 3 2010, 10:08) но когда ...   Sep 7 2010, 09:21
|- - Dima_G   Цитата(halfdoom @ Sep 7 2010, 16:21) Вот ...   Sep 7 2010, 09:40
|- - halfdoom   Цитата(Dima_G @ Sep 7 2010, 12:40) А в че...   Sep 7 2010, 11:39
- - Mahagam   я и смотрю широко. война с конструкциями языка (и ...   Aug 3 2010, 07:53
|- - sergeeff   Цитата(Mahagam @ Aug 3 2010, 10:53) я и с...   Aug 3 2010, 08:26
- - Mahagam   где вы ратование за ассемблер увидели????   Aug 3 2010, 09:59
- - Mahagam   и где я упоминал ассемблер??? поясняю - программер...   Aug 3 2010, 11:15
|- - sergeeff   Цитата(Mahagam @ Aug 3 2010, 14:15) и где...   Aug 3 2010, 11:48
|- - Ink   Цитата(Mahagam @ Aug 3 2010, 15:15) прогр...   Aug 3 2010, 12:24
- - neiver   Вы, видимо мало на С++ программировали... На С++ ...   Aug 3 2010, 11:29
- - Mahagam   во налетели. ещё раз. чисто наблюдения показывают...   Aug 3 2010, 12:50
|- - sergeeff   Цитата(Mahagam @ Aug 3 2010, 15:50) во на...   Aug 3 2010, 12:59
||- - Mahagam   QUOTE (sergeeff @ Aug 3 2010, 15:59) Учит...   Aug 3 2010, 14:51
|- - MrYuran   Цитата(Mahagam @ Aug 3 2010, 16:50) во на...   Aug 3 2010, 13:05
|- - ReAl   Цитата(Mahagam @ Aug 3 2010, 15:50) ещё р...   Aug 3 2010, 14:54
- - Mahagam   стандартов на языки понаделали давно. с появлением...   Aug 3 2010, 16:13
|- - MrYuran   Цитата(Mahagam @ Aug 3 2010, 20:13) на пл...   Aug 3 2010, 17:05
||- - sergeeff   Цитата(MrYuran @ Aug 3 2010, 20:05) Поэто...   Aug 3 2010, 17:44
||- - MrYuran   Цитата(sergeeff @ Aug 3 2010, 21:44) С ег...   Aug 3 2010, 18:12
||- - sergeeff   Цитата(MrYuran @ Aug 3 2010, 21:12) А что...   Aug 3 2010, 18:32
|- - ReAl   Цитата(Mahagam @ Aug 3 2010, 19:13) станд...   Aug 3 2010, 17:10
- - Savrik   Управляеймый код, конечно, хорошо в своей области,...   Aug 3 2010, 19:09
- - Mahagam   ReAl при чём тут ниша и контроллеры? если обсуждаю...   Aug 4 2010, 07:49
|- - sergeeff   Цитата(Mahagam @ Aug 4 2010, 10:49) ReAl ...   Aug 4 2010, 08:06
|- - XVR   Цитата(Mahagam @ Aug 4 2010, 11:49) ReAl ...   Aug 11 2010, 09:20
|- - alexvok   Посоветуйте пажалуйста книгу С++ с примерами для ...   Aug 19 2010, 10:32
|- - demiurg_spb   Цитата(alexvok @ Aug 19 2010, 14:32) Посо...   Aug 19 2010, 14:11
|- - MrYuran   Цитата(alexvok @ Aug 19 2010, 14:32) С++ ...   Aug 23 2010, 07:33
|- - xelax   Цитата(MrYuran @ Aug 23 2010, 11:33) У ...   Aug 25 2010, 08:38
|- - MrYuran   Цитата(xelax @ Aug 25 2010, 12:38) Я то н...   Aug 25 2010, 08:48
|- - DRUID3   Цитата(xelax @ Aug 25 2010, 11:38) Этап п...   Sep 5 2010, 18:11
|- - MrYuran   Цитата(DRUID3 @ Sep 5 2010, 22:11) Хороша...   Sep 6 2010, 11:34
- - Rst7   QUOTE (хотя я удивлялся — почему на "ДВК-2...   Aug 4 2010, 08:15
- - Serega Doc   Добрый день. Неожиданно был удивлен что здесь из-з...   Aug 5 2010, 04:10
|- - Ink   Цитата(Serega Doc @ Aug 5 2010, 08:10) Мо...   Aug 5 2010, 06:34
- - neiver   А чем собственно call не угодил? Хотите пару такто...   Aug 5 2010, 07:21
- - Serega Doc   Спасибо за рекомендации. inline я активно использ...   Aug 5 2010, 08:37
- - neiver   Примеры есть у меня, есть и свой подход к программ...   Aug 19 2010, 14:40
|- - 777777   Цитата(neiver @ Aug 19 2010, 18:40) А так...   Aug 20 2010, 08:32
|- - MrYuran   Цитата(777777 @ Aug 20 2010, 12:32) Я, в ...   Aug 20 2010, 08:37
|- - 777777   Цитата(MrYuran @ Aug 20 2010, 12:37) Да х...   Aug 20 2010, 11:15
|- - MrYuran   Цитата(777777 @ Aug 20 2010, 15:15) Это л...   Aug 20 2010, 11:39
|- - dxp   Цитата(777777 @ Aug 20 2010, 18:15) Нет, ...   Aug 20 2010, 12:43
|- - MrYuran   Цитата(dxp @ Aug 20 2010, 16:43) Кстати, ...   Aug 21 2010, 16:37
- - ReAl   Ну вот как раз сегодняшний пример. ATmega48. Прог...   Aug 21 2010, 18:24
|- - 777777   Цитата(ReAl @ Aug 21 2010, 22:24) Кстати,...   Aug 24 2010, 11:21
|- - ReAl   Цитата(777777 @ Aug 24 2010, 14:21) Да эт...   Aug 24 2010, 15:15
- - neiver   Идея интересная. Я статью по этой теме пишу - ника...   Aug 23 2010, 08:33
- - Andron_   по осени начал писать проект для сигнальника TI, р...   Aug 24 2010, 14:10
- - ReAl   Я бы сказал так — по сравнению с С язык С++ более ...   Aug 25 2010, 11:19
|- - dxp   Цитата(ReAl @ Aug 25 2010, 18:19) Я бы ск...   Aug 26 2010, 05:54
- - Waso   Цитата(neiver @ Aug 19 2010, 21:40) Приме...   Sep 3 2010, 05:35
|- - sergeeff   Цитата(Waso @ Sep 3 2010, 09:35) А как на...   Sep 3 2010, 14:58
- - Waso   В чем же она заключается, наивность-то?   Sep 3 2010, 15:07
|- - Harvester   Цитата(Waso @ Sep 3 2010, 19:07) В чем же...   Sep 7 2010, 11:27
|- - MrYuran   Цитата(Harvester @ Sep 7 2010, 15:27) А ...   Sep 7 2010, 11:44
- - sigmaN   ЦитатаХорошая статья что-бы задуматься - а туда ли...   Sep 6 2010, 20:52
|- - neiver   Цитата(sigmaN @ Sep 7 2010, 00:52) А вы н...   Sep 7 2010, 08:32
|- - DRUID3   offtop Цитата(sigmaN @ Sep 6 2010, 23:52...   Sep 7 2010, 14:57
- - SasaVitebsk   Мне кажется, всётаки, что сравнение переходов ASM...   Sep 7 2010, 10:20
- - one_man_show   В своей практике стараюсь сделать примеры применен...   Sep 7 2010, 10:54
- - sigmaN   Блни, а зря оффтоп прикрыли. Вот щас про Торвальд...   Sep 7 2010, 23:01
|- - Сергей Борщ   Цитата(sigmaN @ Sep 8 2010, 02:01) Один м...   Sep 8 2010, 06:16
|- - halfdoom   Цитата(sigmaN @ Sep 8 2010, 02:01) Прям 3...   Sep 8 2010, 14:50
- - sigmaN   Нет, точно пора завязывать, оффтоп же!   Sep 8 2010, 09:13
|- - MrYuran   Цитата(neiver @ Sep 9 2010, 19:30) Господ...   Sep 10 2010, 06:03
|- - ReAl   Цитата(halfdoom @ Sep 11 2010, 08:54) Поз...   Sep 11 2010, 07:27
||- - halfdoom   Цитата(ReAl @ Sep 11 2010, 10:27) Если бы...   Sep 11 2010, 11:46
|- - MrYuran   Цитата(halfdoom @ Sep 11 2010, 09:54) Поз...   Sep 11 2010, 08:39
||- - halfdoom   Цитата(MrYuran @ Sep 11 2010, 11:39) Ну т...   Sep 11 2010, 12:11
- - WHALE   Кодvoid LCDwrite4(uint8_t value) { LDP ...   Sep 10 2010, 09:55
- - BSVi   Уже некоторое время пишу на плюсах в эмбеддед-прое...   Sep 12 2010, 06:58
- - neiver   Я исправил высказынные замечания и некоторые опеча...   Sep 12 2010, 08:14
- - sigmaN   Великолепная статья! Самому очень понравилась...   Sep 12 2010, 23:05
2 страниц V   1 2 >


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:04
Рейтинг@Mail.ru


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