|
Как ПРАВИЛЬНО программировать на С++, Вопросы по программированию на С++ для микроконтроллеров. |
|
|
|
 |
Ответов
|
Sep 9 2010, 15:30
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Sep 10 2010, 11:43
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Сергей Борщ @ Sep 10 2010, 12:57)  Подход замечательный. Обязательно использую в ближайшем проекте - надо будет крутить несколько шаговиков. +1 Нутром чуял, что что-то такое реально сделать, но всё страшно за Александреску взяться :-) Точнее, за глубокое влезание в шаблоны. Увы, у меня С++ больше как «С с классами» идёт, хоть я и понимаю, что этого мало. p.s[0] Отличная иллюстрация того, что программисты на С борятся с аппаратурой (вручную маски битов собирают), а программисты на С++ борятся с компилятором (заставляют его делать тупую работу). p.s[1] По поводу лицензии. scmRTOS тоже поначалу была (L)GPL, но там не совсем понятно с использованием в проектах с закрытыми исходниками вот таких библиотек уровня исходников. И Гарри перевёл её на нечто MIT/BSD-подобное.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 11 2010, 05:54
|

Профессионал
    
Группа: Свой
Сообщений: 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. Значительным преимуществом данного подхода является и то, что вся конфигурация собрана в один или несколько однородных файлов, что резко снижает вероятность непреднамеренных ошибок.
|
|
|
|
|
Sep 11 2010, 11:49
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(halfdoom @ Sep 11 2010, 12:54)  Позволю себе добавить, что отличная, но однобокая иллюстрация. Автор абсолютно не упоминает о возможности описания проекта на языках с гораздо более гибкими и удобными конструкциями. Ведь никто не обязывает втискивать себя в прокрустово ложе препроцессора C или шаблонов C++. То, о чем вы говорите, - это ортогональная вещь. Нативный код - это нативный код, и он обладает такими свойствами, которые не заменят никакие кодогенераторы. Есть отличный кодогенератор COG, который позволяет писать определения прямо в исходном коде. И в ряде случаев это действительно удобная и мощная штука. Но пример использования С++, приведенный в обсуждаемой статье, не нуждается ни в каких кодогенераторах - он предельно лаконичен, полон, прост в использовании и эффективен. Да, он сложен в реализации. Все эти трюки тов. Александреску - это высший пилотаж плюсового программирования, они требуют глубокого понимания концепций языка, а это приходит только с опытом его использования. Вот это и есть главная проблема для эмбеддеров - такого опыта у них, как правило, нет (по вполне объективным причинам). Поэтому этот код с шаблонами, списками типов и прочим для большинства - китайская грамота. Хотя при наличии отлаженной библиотеки можно использовать и не страдать. Необходимость вникать потребуется в случае портирования ее на другую платформу. Но в любом случае есть мотив осваивать подобные средства. А автору статьи - большущий респект: очень нетипично для эмбеддера поднять такой уровень понимания С++! В статье навести корректуру (поправить опечатки, ошибки) и однозначно поместить в библиотеку форума.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
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 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|