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

 
 
 
Reply to this topicStart new topic
> C++ в микроконтроллерах, посветите безграмотного.
-=Sergei=-
сообщение Mar 17 2008, 09:20
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



Имеем ARM Cortex-M3.

Ядро за командами лазит в флеш через шину Icode, за данными через system в ОЗУ. Конфликтов нет, работаем быстро.

я создаю некий объект обладающий свойствами и функциями. Он создается в ОЗУ. Т.е. теперь если я начну выполнять некую функцию объекта, то теперь и за командами и за данными ядро будет лазить в ОЗУ, возникают конфликты и их разрешение снижает производительность. Или я не праивльно понимаю создание объекта? Код функций объекта все так же будет распалагаться во Флеш а свойства в ОЗУ?
Go to the top of the page
 
+Quote Post
Kirill Frolov
сообщение Mar 17 2008, 09:47
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



Цитата(-=Sergei=- @ Mar 17 2008, 12:20) *
Имеем ARM Cortex-M3.

Ядро за командами лазит в флеш через шину Icode, за данными через system в ОЗУ. Конфликтов нет, работаем быстро.

я создаю некий объект обладающий свойствами и функциями. Он создается в ОЗУ. Т.е. теперь если я начну выполнять некую функцию объекта, то теперь и за командами и за данными ядро будет лазить в ОЗУ, возникают конфликты и их разрешение снижает производительность. Или я не праивльно понимаю создание объекта? Код функций объекта все так же будет распалагаться во Флеш а свойства в ОЗУ?


Не знаю куда послать. Но советую почитать где-нибудь о процессе компоновки и загрузки программ. В частности при работе с мелкими MCU секции кода и константных данных попадают в ПЗУ (flash), секции изменяемых данных и неинициализированных данных -- в ОЗУ. В некоторых экзотических случаях (ЭВМ с раздельными адресными пространствамим для кода, данных и другими...) все данные попадают в ОЗУ (AVR) или же используются указатели специального типа (x51).


--------------------
[ZX]
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 17 2008, 10:06
Сообщение #3


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(-=Sergei=- @ Mar 17 2008, 12:20) *
я создаю некий объект обладающий свойствами и функциями. Он создается в ОЗУ. Т.е. теперь если я начну выполнять некую функцию объекта, то теперь и за командами и за данными ядро будет лазить в ОЗУ, возникают конфликты и их разрешение снижает производительность. Или я не праивльно понимаю создание объекта? Код функций объекта все так же будет распалагаться во Флеш а свойства в ОЗУ?

объект создается не в ОЗУ, а в определенном сегменте/секции. Причем там располагаются исключительно данные и указатель на VMT, а все функции (они в одном экземпляре для каждого класса) остаются в сегменте/секции кода.
Go to the top of the page
 
+Quote Post
-=Sergei=-
сообщение Mar 17 2008, 10:43
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



Цитата(KRS @ Mar 17 2008, 13:06) *
объект создается не в ОЗУ, а в определенном сегменте/секции. Причем там располагаются исключительно данные и указатель на VMT, а все функции (они в одном экземпляре для каждого класса) остаются в сегменте/секции кода.


Благадарю... все ясно.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 17 2008, 12:21
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(KRS @ Mar 17 2008, 12:06) *
объект создается не в ОЗУ, а в определенном сегменте/секции

, который/которая должны находиться таки в ОЗУ, т. к. в read-only памяти объект не может быть сконструирован
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 17 2008, 12:44
Сообщение #6


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(IgorKossak @ Mar 17 2008, 15:21) *
, который/которая должны находиться таки в ОЗУ, т. к. в read-only памяти объект не может быть сконструирован

который объявлен глобально и как const может.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 18 2008, 06:37
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(KRS @ Mar 17 2008, 14:44) *
который объявлен глобально и как const может.

Именно так и объявленный объект создаётся In section .bss, а также создаются конструкторы, пишущие в эту область памяти.
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 18 2008, 07:39
Сообщение #8


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(IgorKossak @ Mar 18 2008, 09:37) *
Именно так и объявленный объект создаётся In section .bss, а также создаются конструкторы, пишущие в эту область памяти.

Объект может не иметь конструктора. и все методы могут быть конст. Вот пример который кидает данные в скецию .rodata
Это конечно простой объект без VMT - реально просто структура с методами. Но такой подход может быть полезен никакого оверхида
Код
class cls {
    public:
        int a;
        int b;
        int foo(void) const;
};

extern const cls a;
extern const cls b;

const cls a = {4,5};
const cls b = {6,7};

int cls::foo(void) const
{
    return a + b;
}

а вот листинг
Код
   \                                 In section .rodata, align 4
     11          const cls a = {4,5};
   \                     a:
   \   00000000   040000000500       DC32 4, 5
   \              0000        

   \                                 In section .rodata, align 4
     12          const cls b = {6,7};
   \                     `b`:
   \   00000000   060000000700       DC32 6, 7
   \              0000        
     13          

   \                                 In section .text, align 4, keep-with-next
     14          int cls::foo(void) const
     15          {
     16              return a + b;
   \                     _ZNK3cls3fooEv:
   \   00000000   0168               LDR      R1,[R0, #+0]
   \   00000002   4068               LDR      R0,[R0, #+4]
   \   00000004   0818               ADDS     R0,R1,R0
   \   00000006   7047               BX       LR              ;; return
     17          }
     18
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 18 2008, 08:08
Сообщение #9


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Точно, всё дело было в инициализации.
Я создавал класс с одним членом.
Если делать
Код
const cls a = 30;
то потребует конструктора, если сделать иначе
Код
const cls a = {30};
то всё работает.
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 18 2008, 08:36
Сообщение #10


Adept
******

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



Цитата(KRS @ Mar 18 2008, 13:39) *
Объект может не иметь конструктора. и все методы могут быть конст. Вот пример который кидает данные в скецию .rodata
Это конечно простой объект без VMT - реально просто структура с методами. Но такой подход может быть полезен никакого оверхида
Код
class cls {
    public:
        int a;
        int b;
        int foo(void) const;
};

Тут у вас объявлен POD тип. На самом деле это просто обычная С-структура. POD типы могут лежать в RO памяти без проблем, как и подобает обычным С-типам. Правильнее было бы просто написать:

struct cls { ... };

Заведите хотя бы одно не public поле, все станет не так шоколадно. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 18 2008, 08:42
Сообщение #11


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



С объектами производных классов тоже не просто.
Даже если нет private членов как проинициализировать следующий объект?
Код
class cls
{
    public:
        virtual int foo(void) const = 0;
};

class boo : public cls
{
    public:
        int a;
        int b;
        int foo(void) const;
};

extern const boo b;

const boo b =????;
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 18 2008, 09:02
Сообщение #12


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(dxp @ Mar 18 2008, 11:36) *
Тут у вас объявлен POD тип. На самом деле это просто обычная С-структура. POD типы могут лежать в RO памяти без проблем, как и подобает обычным С-типам.

Так я и написал что реально просто структура с методами. Но я предпочитаю писать как class что бы отличать от просто структур, которые не имеют методов. К тому же это не совсем POD - потому что метод foo там есть и совместимости с С уже нет.

Цитата(IgorKossak @ Mar 18 2008, 11:42) *
С объектами производных классов тоже не просто.


Это да, и к тому же если есть VMT, даже без производных классов, IAR почему то не может заранее положить указатель на VMT, обязательно вызывается функция, которая туда его кладет.
Но остается возможность использовать template.

Сообщение отредактировал KRS - Mar 18 2008, 09:09
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 18 2008, 12:58
Сообщение #13


Adept
******

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



Цитата(IgorKossak @ Mar 18 2008, 14:42) *
С объектами производных классов тоже не просто.

Если класс производный, он уже не POD со всеми вытекающими - агрегатные инициализаторы к нему нельзя применять.

Цитата(KRS @ Mar 18 2008, 15:02) *
Так я и написал что реально просто структура с методами. Но я предпочитаю писать как class что бы отличать от просто структур, которые не имеют методов. К тому же это не совсем POD - потому что метод foo там есть и совместимости с С уже нет.

POD - это не совместимость с С, это типы, которые попадают под ряд правил и их поведение и применимость наболее близки к С-типам. Например, объекты POD типов можно копировать с помощью memcpy, а не-POD типов - нельзя и т.д. Но совместимость тут не причем. Наличие функции-члена (не метода, кстати) не мешает типу оставаться POD. А вот наличе метода (виртуальной функции) как раз делает его (тип) не POD.


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

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

 


RSS Текстовая версия Сейчас: 17th July 2025 - 22:15
Рейтинг@Mail.ru


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