|
Как писать на С++ при создание приложений под ARM, Примеры |
|
|
|
 |
Ответов
|
Sep 22 2011, 12:11
|
Профессионал
    
Группа: Свой
Сообщений: 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(); Думаю понятно изложил  Цитата Необходимость в множественном наследовании зависит не от объёмов программы, а от её концепции и задач. Например, когда надо объединить функционал двух объектов, удобно отнаследоваться от них обоих. Кода это не добавляет. Ну мож иногда и надо, я пока применению ему не нашел. а про 256кб упомянул с намеком на относительную простоту програм с данным обьемом  Цитата Не, обработка исключений точно не катит в embedded - это самый тяжёлый механизм С++. Там при выбросе исключения происходит так называемая "раскрутка стека", это длительный процесс со слабопредсказуемыми времянками и значительным потреблением ресурсов - процессорного времени. При выбросе исключения явно(путем возврата кода ошибки) тоже происходит раскрутка стека - мы же вернемся в самую первую функцию по цепочке из кодов ошибок: типа ошибка вылезла в недрах uartRead, выходим uartRead->SysCall->GsmModemMuxRead->GsmModemCommand->GprsWrapper->TermRead->main... Хотя с вами соглашусь, "обработка исключений точно не катит в embedded" Цитата Полезная фишка там есть - rvalue reference (обозначается оператором &&). Позволяет избежать ненужного копирования в ряде случаев. Я привык руцями управлять перегонкой данных, ссылки использую в очень редких случаях, в основном только указатели. при паре сотен байт стека, имхо, это дело надо контролировать самому... Цитата При embedded программировании надо, для начала, понять, как устроен конкретный компилятор и его startup файл Привязыватся к компилятору - плохая идея. Мой код дожен компилится любым нормальным компилятором и работать. Компилятор для меня - это именно КОМПИЛЯТОР, тобышь генератор кода, а не набор библиотек и прочей несовместимой хрени. startup у меня свой равно как и ОС. Там и MPU задействован, и куча всяких вкусностей типа lock-free фишек итп, все это не совместимо ни с стандартной библиотекой ни с стартапами(которые тоже являются частью стдлиб), но зато очень удобно в ислопользовании. Цитата где и в каком порядке что должно инициализироваться как я уже писал - компилятор никак не может знать что за чем должно инициализироватся, в сучаи одновременного создания обьектов,тобышь в статической памяыти, ни я не могу быть 100% уверен,что компиллер вдруг запустит конструктор не там, где нужно. Если обьект создается в стеке - тогда да, там можно запросто юзать конструкторы/деструкторы,да и выделение глобальных системных ресурсов для обьекта в стеке конкретного треда/прерывания не целесобразно.
|
|
|
|
|
Sep 22 2011, 13:03
|

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

|
Цитата(brag @ Sep 22 2011, 19:11)  НО. Некоторые обьекты нужно проинициализировать сразу после ресета(до старта ОС). Некоторые после старта ОС но до старта конкретных драйверов периферии. почему - потому что в их конструкторах есть вызовы функций ОС, если их вызвать до старта ОС - будет креш. А некоторые после старта всех драйверов и до выполнения первого юзерского треда(приложения). Аналогично - там могут быть обращения к дровам, выделение системных ресурсов(создание тредов, мютексов итд). В итоге как мне знать когда вызвать ту или иную функцию(конструктор) из init_array ? Ну, объекты, которые "завязаны" на аппаратуру, организовывать соответствующим образом, но все подряд-то ни к чему под одну гребёнку гладить. Большинство объектов в программе, как правило, не привязаны к аппаратуре, для них можно спокойно использовать конструкторы без ограничений. Цитата(brag @ Sep 22 2011, 19:11)  Ну мож иногда и надо, я пока применению ему не нашел. а про 256кб упомянул с намеком на относительную простоту програм с данным обьемом  256 кБ - весьма приличный объём, если писать код своими руками (а не забить его библиотечными функциями). А по меркам embedded так даже и нифига себе.  Цитата(brag @ Sep 22 2011, 19:11)  При выбросе исключения явно(путем возврата кода ошибки) тоже происходит раскрутка стека - мы же вернемся в самую первую функцию по цепочке из кодов ошибок: типа ошибка вылезла в недрах uartRead, выходим uartRead->SysCall->GsmModemMuxRead->GsmModemCommand->GprsWrapper->TermRead->main... Ну, некоторое сходство есть, но при исключениях там генерируется гора служебного кода, что тащит неслабый оверхед, при организации программы через возврат кода ошибки всё получается на пару порядков скромнее (хотя и не так удобно и красиво внешне). Цитата(brag @ Sep 22 2011, 19:11)  Я привык руцями управлять перегонкой данных, ссылки использую в очень редких случаях, в основном только указатели. при паре сотен байт стека, имхо, это дело надо контролировать самому... Rvalue reference - это совсем не те ссылки, которые в нынешнем С++. Это совсем другая штука.  Обычные ссылки, кстати, тоже, имхо, зря обделяете вниманием - они в ряде случаев дают более простую семантику и более безопасный код. Цитата(brag @ Sep 22 2011, 19:47)  по моему init() гораздо красивее этой конструкции... init() обладает одним существенным недостатком - нужно не забывать корректировать его при изменениях в совсем других частях программы. В общем, это в значительной степени отказ от идеи абстракции (и инкапсуляции) данных в виде законченных объектов, т.е. в некотором роде даунгрейд в С. По мере роста сложности программ, это не добавляет радости.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
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 страниц
1 2 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|