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

 
 
> Как писать на С++ при создание приложений под ARM, Примеры
Hellper
сообщение Jun 18 2011, 20:15
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



Посоветуйте примеры использование С++ при создание программ под архитектуру ARM микроконтроллеров. Такие примеры, чтобы показывали удобство и силу использование ООП, и тянуло сразу садится, вникать и кодить.
спасибо
пс желательно под компилятор от keil-а или gcc

ПС извините за дублирование. неполадки связи.


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
brag
сообщение Sep 22 2011, 12:11
Сообщение #2


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Чем же так конструкторы не угодили? Это просто удобно и безопасно - автоматическая инициализация при создании объектов. А с отдельным init'ом обычное дело забыть сунуть туда инициализатор (люди постоянно ошибаются ).

Да, это удобно и на PC я их использую во всю. а вот конкретно на моей платформе с ними проблеммы...
Кога обьект размещен в статической памяти(у меня это только bss забиваемый при старте нулями), gcc создает:
1. константную таблицу init_array с указателями на функции(те самые конструкторы/инициализаторы указателей на vtables). Ессно, если в классе есть виртуальные функции, то GCC по любом создаст конструктор либо дополнит существующий кодом инициализации указателя на vtable
2. саму констнтую vtable
пример
Код
class A{
public:
    virtual int a()=0;
};

class B :public A{
public:
    B(){z=0x12345;};
    int a(){return z++;};
private:
    int z;
};

B bcc;

Код
Disassembly of section .text:
00008004 <_GLOBAL__sub_I_bcc>:
    8004:    f240 034c     movw    r3, #76; 0x4c
    8008:    f242 3245     movw    r2, #9029; 0x2345
    800c:    4903          ldr    r1, [pc, #12]; (801c <_GLOBAL__sub_I_bcc+0x18>)
    800e:    f2c0 0301     movt    r3, #1
    8012:    f2c0 0201     movt    r2, #1
    8016:    e883 0006     stmia.w    r3, {r1, r2}
    801a:    4770          bx    lr
    801c:    00008038     andeq    r8, r0, r8, lsr r0
00008020 <_ZN1B1aEv>:
    8020:    6843          ldr    r3, [r0, #4]
    8022:    1c5a          adds    r2, r3, #1
    8024:    6042          str    r2, [r0, #4]
    8026:    4618          mov    r0, r3
    8028:    4770          bx    lr
    802a:    bf00          nop
Disassembly of section .rodata:
00008030 <_ZTV1B>:
    8038:    00008021     andeq    r8, r0, r1, lsr #32
Disassembly of section .init_array:
00010048 <__data_start-0x4>:
   10048:    00008005     andeq    r8, r0, r5

В итоге, функции по указателям в .init_array должны буть когда-то вызваны до использования обьекта.
НО. Некоторые обьекты нужно проинициализировать сразу после ресета(до старта ОС).
Некоторые после старта ОС но до старта конкретных драйверов периферии. почему - потому что в их конструкторах есть вызовы функций ОС, если их вызвать до старта ОС - будет креш.
А некоторые после старта всех драйверов и до выполнения первого юзерского треда(приложения). Аналогично - там могут быть обращения к дровам, выделение системных ресурсов(создание тредов, мютексов итд).
В итоге как мне знать когда вызвать ту или иную функцию(конструктор) из init_array ?
Потому я пошел по простому пути - отказался от конструкторов; обрабатываю init_array(туда компиллер кидает код инициализации указателей на vtable) еще до старта системы, что есть безопасно, тк в конструкторах нету системозависимого кода; А уже инициализацию обьектов провожу явно в нужном месте в нужное время посредством вызова init();
Думаю понятно изложил wink.gif

Цитата
Необходимость в множественном наследовании зависит не от объёмов программы, а от её концепции и задач. Например, когда надо объединить функционал двух объектов, удобно отнаследоваться от них обоих. Кода это не добавляет.

Ну мож иногда и надо, я пока применению ему не нашел. а про 256кб упомянул с намеком на относительную простоту програм с данным обьемом sm.gif

Цитата
Не, обработка исключений точно не катит в embedded - это самый тяжёлый механизм С++. Там при выбросе исключения происходит так называемая "раскрутка стека", это длительный процесс со слабопредсказуемыми времянками и значительным потреблением ресурсов - процессорного времени.

При выбросе исключения явно(путем возврата кода ошибки) тоже происходит раскрутка стека - мы же вернемся в самую первую функцию по цепочке из кодов ошибок: типа ошибка вылезла в недрах uartRead, выходим uartRead->SysCall->GsmModemMuxRead->GsmModemCommand->GprsWrapper->TermRead->main...
Хотя с вами соглашусь, "обработка исключений точно не катит в embedded"

Цитата
Полезная фишка там есть - rvalue reference (обозначается оператором &&). Позволяет избежать ненужного копирования в ряде случаев.

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

Цитата
При embedded программировании надо, для начала, понять, как устроен конкретный компилятор и его startup файл

Привязыватся к компилятору - плохая идея. Мой код дожен компилится любым нормальным компилятором и работать.
Компилятор для меня - это именно КОМПИЛЯТОР, тобышь генератор кода, а не набор библиотек и прочей несовместимой хрени.
startup у меня свой равно как и ОС. Там и MPU задействован, и куча всяких вкусностей типа lock-free фишек итп, все это не совместимо ни с стандартной библиотекой ни с стартапами(которые тоже являются частью стдлиб), но зато очень удобно в ислопользовании.

Цитата
где и в каком порядке что должно инициализироваться

как я уже писал - компилятор никак не может знать что за чем должно инициализироватся, в сучаи одновременного создания обьектов,тобышь в статической памяыти, ни я не могу быть 100% уверен,что компиллер вдруг запустит конструктор не там, где нужно.
Если обьект создается в стеке - тогда да, там можно запросто юзать конструкторы/деструкторы,да и выделение глобальных системных ресурсов для обьекта в стеке конкретного треда/прерывания не целесобразно.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 22 2011, 13:03
Сообщение #3


Adept
******

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



Цитата(brag @ Sep 22 2011, 19:11) *
НО. Некоторые обьекты нужно проинициализировать сразу после ресета(до старта ОС).
Некоторые после старта ОС но до старта конкретных драйверов периферии. почему - потому что в их конструкторах есть вызовы функций ОС, если их вызвать до старта ОС - будет креш.
А некоторые после старта всех драйверов и до выполнения первого юзерского треда(приложения). Аналогично - там могут быть обращения к дровам, выделение системных ресурсов(создание тредов, мютексов итд).
В итоге как мне знать когда вызвать ту или иную функцию(конструктор) из init_array ?

Ну, объекты, которые "завязаны" на аппаратуру, организовывать соответствующим образом, но все подряд-то ни к чему под одну гребёнку гладить. Большинство объектов в программе, как правило, не привязаны к аппаратуре, для них можно спокойно использовать конструкторы без ограничений.

Цитата(brag @ Sep 22 2011, 19:11) *
Ну мож иногда и надо, я пока применению ему не нашел. а про 256кб упомянул с намеком на относительную простоту програм с данным обьемом sm.gif

256 кБ - весьма приличный объём, если писать код своими руками (а не забить его библиотечными функциями). А по меркам embedded так даже и нифига себе. sm.gif

Цитата(brag @ Sep 22 2011, 19:11) *
При выбросе исключения явно(путем возврата кода ошибки) тоже происходит раскрутка стека - мы же вернемся в самую первую функцию по цепочке из кодов ошибок: типа ошибка вылезла в недрах uartRead, выходим uartRead->SysCall->GsmModemMuxRead->GsmModemCommand->GprsWrapper->TermRead->main...

Ну, некоторое сходство есть, но при исключениях там генерируется гора служебного кода, что тащит неслабый оверхед, при организации программы через возврат кода ошибки всё получается на пару порядков скромнее (хотя и не так удобно и красиво внешне).

Цитата(brag @ Sep 22 2011, 19:11) *
Я привык руцями управлять перегонкой данных, ссылки использую в очень редких случаях, в основном только указатели. при паре сотен байт стека, имхо, это дело надо контролировать самому...

Rvalue reference - это совсем не те ссылки, которые в нынешнем С++. Это совсем другая штука. sm.gif Обычные ссылки, кстати, тоже, имхо, зря обделяете вниманием - они в ряде случаев дают более простую семантику и более безопасный код.



Цитата(brag @ Sep 22 2011, 19:47) *
по моему init() гораздо красивее этой конструкции...

init() обладает одним существенным недостатком - нужно не забывать корректировать его при изменениях в совсем других частях программы. В общем, это в значительной степени отказ от идеи абстракции (и инкапсуляции) данных в виде законченных объектов, т.е. в некотором роде даунгрейд в С. По мере роста сложности программ, это не добавляет радости.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Hellper   Как писать на С++ при создание приложений под ARM   Jun 18 2011, 20:15
- - Danis   Цитата(Hellper @ Jun 19 2011, 00:15) Посо...   Jun 18 2011, 20:21
|- - scifi   Цитата(Danis @ Jun 19 2011, 00:21) Доволь...   Jun 18 2011, 20:53
- - zltigo   QUOTE (Hellper @ Jun 18 2011, 23:15) тяну...   Jun 18 2011, 20:36
- - haker_fox   QUOTE (Hellper @ Jun 19 2011, 05:15) и тя...   Jun 19 2011, 03:03
- - gladov   Цитата(Hellper @ Jun 19 2011, 00:15) Посо...   Jun 20 2011, 04:34
|- - dxp   Цитата(gladov @ Jun 20 2011, 11:34) С++ п...   Jun 20 2011, 07:32
||- - gladov   Цитата(dxp @ Jun 20 2011, 11:32) Два, нет...   Jun 21 2011, 06:40
|||- - dxp   Вынужден категорически не согласиться по всем пунк...   Jun 21 2011, 08:47
|||- - scifi   Цитата(dxp @ Jun 21 2011, 12:47) Если вы ...   Jun 21 2011, 09:21
||- - 777777   Цитата(dxp @ Jun 20 2011, 11:32) Почему в...   Sep 22 2011, 04:49
||- - andrewlekar   Цитата(777777 @ Sep 22 2011, 10:49) О как...   Sep 23 2011, 04:49
||- - 777777   Цитата(andrewlekar @ Sep 23 2011, 08:49) ...   Sep 23 2011, 05:52
||- - dxp   Цитата(777777 @ Sep 23 2011, 12:52) Во-вт...   Sep 23 2011, 07:02
|- - haker_fox   QUOTE (gladov @ Jun 20 2011, 13:34) и еще...   Jun 20 2011, 08:07
||- - MrYuran   Цитата(haker_fox @ Jun 20 2011, 12:07) 3....   Jun 20 2011, 09:54
|- - klen   Цитата(gladov @ Jun 20 2011, 08:34) С++ п...   Jun 20 2011, 10:45
|- - Axel   Цитата(gladov @ Jun 20 2011, 07:34) ...пр...   Jun 20 2011, 11:22
- - demiurg_spb   Цитата(Hellper @ Jun 19 2011, 00:15) Посо...   Jun 20 2011, 11:35
- - Danis   ТС, позвольте не большой, скромный вопрос к Вам. З...   Jun 20 2011, 12:15
- - GDI   ringbuffer-dlya-embedded - пример кода, и даже не ...   Jun 20 2011, 13:11
|- - Hellper   Цитата(GDI @ Jun 20 2011, 17:11) ringbuff...   Jun 20 2011, 16:05
- - brag   Да, стоит сделать new, как c++ тянет библиотечный ...   Jun 21 2011, 08:09
- - brag   согласен, обзор полностью верный. и применять тот ...   Jun 21 2011, 09:33
|- - scifi   Цитата(brag @ Jun 21 2011, 13:33) пример ...   Jun 21 2011, 09:39
|- - Axel   Цитата(scifi @ Jun 21 2011, 12:39) ...где...   Jun 21 2011, 10:14
|- - dxp   Цитата(scifi @ Jun 21 2011, 16:39) При вс...   Jun 21 2011, 11:58
|- - scifi   Цитата(dxp @ Jun 21 2011, 15:58) В общем,...   Jun 21 2011, 14:37
|- - Danis   Цитата(scifi @ Jun 21 2011, 17:37) Другим...   Jun 21 2011, 15:55
- - brag   ЦитатаПри всём уважении, это голословное утвержден...   Jun 21 2011, 10:30
- - Danis   dxp, как у вас терпения хватает писать такие длинн...   Jun 21 2011, 13:27
- - brag   dxp, спасибо большое за обзорчик, вроде все и так ...   Jun 21 2011, 22:18
- - haker_fox   dxp, спасибо за шикарные ответы!!! Н...   Jun 22 2011, 01:05
- - andrewlekar   Расказ про ООП конечно увлекательный, но стоит учи...   Jun 22 2011, 04:57
|- - MrYuran   Цитата(andrewlekar @ Jun 22 2011, 08:57) ...   Jun 22 2011, 06:38
|- - dxp   Цитата(andrewlekar @ Jun 22 2011, 11:57) ...   Jun 22 2011, 06:40
||- - andrewlekar   ЦитатаПоясните? И причём тут множественное наследо...   Jun 22 2011, 07:38
||- - Danis   Цитата(andrewlekar @ Jun 22 2011, 11:38) ...   Jun 22 2011, 08:28
||- - haker_fox   По сравнению с уважаемым dxp, я вообще не программ...   Jun 22 2011, 08:32
|||- - andrewlekar   Цитата(haker_fox @ Jun 22 2011, 14:32) А ...   Jun 22 2011, 09:00
|||- - MrYuran   Цитата(andrewlekar @ Jun 22 2011, 13:00) ...   Jun 22 2011, 09:32
|||- - shreck   Цитата(andrewlekar @ Jun 22 2011, 16:00) ...   Jun 22 2011, 10:34
|||- - SergeyDDD   Цитата(andrewlekar @ Jun 22 2011, 12:00) ...   Jun 22 2011, 11:22
|||- - haker_fox   QUOTE (andrewlekar @ Jun 22 2011, 18:00) ...   Jun 22 2011, 11:30
|||- - zltigo   QUOTE (haker_fox @ Jun 22 2011, 14:30) Я ...   Jun 22 2011, 12:33
||- - Danis   Цитата(andrewlekar @ Jun 22 2011, 11:38) ...   Jun 22 2011, 08:37
||- - sergeeff   Цитата(andrewlekar @ Jun 22 2011, 10:38) ...   Jun 22 2011, 08:44
|- - Danis   Цитата(andrewlekar @ Jun 22 2011, 08:57) ...   Jun 22 2011, 06:53
|- - haker_fox   QUOTE (andrewlekar @ Jun 22 2011, 13:57) ...   Jun 22 2011, 08:13
- - dxp   .   Jun 22 2011, 06:29
- - dxp   Цитата(haker_fox @ Jun 22 2011, 08:05) Не...   Jun 22 2011, 07:37
- - Dima_G   Цитата(Hellper @ Jun 19 2011, 03:15) Таки...   Jun 22 2011, 08:35
- - zltigo   История моей жизни. Когда-то очень давно, когда ко...   Jun 22 2011, 11:14
- - Danis   Кстати, прорабатывается новая версия стандарта С++...   Jun 22 2011, 11:31
|- - MrYuran   Цитата(Danis @ Jun 22 2011, 15:31) Кстати...   Jun 22 2011, 11:45
- - brag   Пописал немного кода на С++ использованием динамич...   Sep 21 2011, 22:05
- - dxp   Цитата(brag @ Sep 22 2011, 05:05) Про кон...   Sep 22 2011, 07:25
|- - 777777   Цитата(dxp @ Sep 22 2011, 11:25) Правда? ...   Sep 22 2011, 15:40
- - sergeeff   КодПро конструкторы и деструкторы правда пришлось ...   Sep 22 2011, 09:51
- - ReAl   Насколько я понимаю, вот тут конструктор object бу...   Sep 22 2011, 12:32
- - brag   ЦитатаНасколько я понимаю, вот тут конструктор obj...   Sep 22 2011, 12:47
- - brag   ЦитатаObject& GetObject() { static Object ...   Sep 22 2011, 13:13
|- - dxp   Цитата(brag @ Sep 22 2011, 20:13) Хе, еще...   Sep 22 2011, 13:19
- - brag   ЦитатаБольшинство объектов в программе, как правил...   Sep 22 2011, 13:32
|- - sergeeff   Цитата(brag @ Sep 22 2011, 16:32) init ни...   Sep 22 2011, 13:37
- - brag   ЦитатаЕстественно, это стандартная реализация иниц...   Sep 22 2011, 13:41
|- - Dima_G   Компилятор ничего не знает о потоках, процессах и ...   Sep 22 2011, 14:38
- - brag   ЦитатаКомпилятор ничего не знает о потоках, процес...   Sep 22 2011, 15:05
|- - Dima_G   Цитата(brag @ Sep 22 2011, 22:05) Qt+gcc ...   Sep 22 2011, 15:16
|- - sergeeff   Цитата(brag @ Sep 22 2011, 18:05) Qt+gcc ...   Sep 22 2011, 15:21
- - brag   ЦитатаЛично налетал на гонки в синглтоне. Компилят...   Sep 22 2011, 16:09
|- - Dima_G   Цитата(brag @ Sep 22 2011, 23:09) а реали...   Sep 23 2011, 04:30
- - brag   еще вопрос по поводу реюза кода. Как, на пример, в...   Sep 22 2011, 17:45
|- - AHTOXA   Цитата(brag @ Sep 22 2011, 23:45) Нужно, ...   Sep 22 2011, 18:32
- - brag   а код? -ffunction-sections , а потом это все вручн...   Sep 22 2011, 18:44
- - brag   Реализовал через манипуляцию ld -r, линкер-скрипты...   Sep 22 2011, 22:54
- - dxp   Цитата(777777 @ Sep 22 2011, 22:40) Что з...   Sep 23 2011, 04:50
- - brag   Цитатаочитайте про "Placement new". Это ...   Sep 23 2011, 10:15
- - MALLOY2   Ссылка в тему С++ & Cortex   Sep 23 2011, 11:35
- - brag   Хe, и множественному наследованию (по крайней мере...   Sep 23 2011, 16:25
- - andrewlekar   Множественное наследование от интерфейсов разумеет...   Sep 23 2011, 17:22
- - BlackHead   Вот набрёл на библиотеку С++ http://xpcc.sourcefor...   Oct 5 2011, 10:21
- - kikos   Лет 20 назад один из заказчиков (пожилой американс...   Oct 31 2011, 13:32
|- - Сергей Борщ   QUOTE (kikos @ Oct 31 2011, 16:32) На воп...   Oct 31 2011, 13:49
||- - Forger   Цитата(Сергей Борщ @ Oct 31 2011, 17:49) ...   Oct 31 2011, 18:14
|- - ReAl   Цитата(kikos @ Oct 31 2011, 15:32) Более ...   Nov 1 2011, 06:27
- - IgorKossak   Господа критикующие, напоминаю, тема звучит Как пи...   Nov 1 2011, 08:32
- - brag   Как можно реализовать такую вещ без кривоты, rtti,...   Dec 10 2011, 02:55
|- - Forger   Цитата(brag @ Dec 10 2011, 06:55) Как мож...   Dec 10 2011, 07:09
|- - alx2   Цитата(brag @ Dec 10 2011, 07:55) Как мож...   Dec 11 2011, 10:37
- - neiver   Массив указателей на объекты базового класса - это...   Dec 10 2011, 07:29
- - brag   ЦитатаДля полноты картины, расскажите, для чего ва...   Dec 10 2011, 15:37
|- - dxp   Цитата(brag @ Dec 10 2011, 22:37) массив ...   Dec 10 2011, 17:39
- - brag   ЦитатаЕсли я правильно понял, что требуется работа...   Dec 10 2011, 18:11
|- - dxp   Цитата(brag @ Dec 11 2011, 01:11) stl не ...   Dec 10 2011, 21:44
- - brag   да просто проект такой, что проще свое написать, ч...   Dec 10 2011, 22:59
- - kan35   Писать на С++ под ARM точно так же как на любую др...   Dec 11 2011, 09:52
- - brag   Спасибо. но это тоже не то, массив указателей все ...   Dec 11 2011, 13:32
2 страниц V   1 2 >


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

 


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


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