|
Как ПРАВИЛЬНО программировать на С++, Вопросы по программированию на С++ для микроконтроллеров. |
|
|
|
 |
Ответов
|
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, 12:11
|

Профессионал
    
Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072

|
Цитата(MrYuran @ Sep 11 2010, 11:39)  Ну так представьте народу второй бок, в виде контр-статьи. Чтобы можно было пользоваться, а не голословно. Была такая идея, но все сильно завязано на нашу внутреннюю инфраструктуру на экспозицию которой никто добро не даст. Со временем попробую отделить мух от котлет. Цитата(dxp @ Sep 11 2010, 14:49)  То, о чем вы говорите, - это ортогональная вещь. Нативный код - это нативный код, и он обладает такими свойствами, которые не заменят никакие кодогенераторы. Есть отличный кодогенератор COG, который позволяет писать определения прямо в исходном коде. И в ряде случаев это действительно удобная и мощная штука. Позволю себе еще раз выразить свою точку зрения на подобные вещи требующие хорошего владения всеми элементами C++: какими-бы навороченными не были возможности шаблонов они все равно остаются в рамках языка. Они не генерируют мэйкфайлы, не делают выжимки для документации, не проверяют на корректность совокупность параметров конфигурации МК, не генерирует код который приходится писать на ассемблере. Все это позволяют делать высокоуровневые надстройки, которые видят не пару портов, а весь комплекс в целом. Конечно, для одного небольшого проекта в год вариант описанный в статье закрывает почти все нужды, но для больших объемов, как показывает практика, что описанный мной подход, ИМХО конечно, оказался гораздо удобнее. Замечание насчет нативного кода не ясно - код созданный на базе описателей является нативным и даже оптимизированным под конкретный МК или компилятор.
|
|
|
|
Сообщений в этой теме
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     dxp Цитата(halfdoom @ Sep 11 2010, 12:54) Поз... Sep 11 2010, 11:49 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
|
|
|