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

 
 
6 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Экономия RAM.
zltigo
сообщение Mar 8 2016, 13:55
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Jenya7 @ Mar 8 2016, 15:40) *
и все таки? To byte or not to byte? 1 байт или 4 байта?

Если указать паковать структуру побайтно типа
#pragma pack( push, 1 )
....
#pragma pack( pop )

, то тогда ГАРАНТИРОВАННО 1 бай. Если НЕ указать, то на усмотрение компилятора.

QUOTE (Jenya7 @ Mar 8 2016, 15:47) *
просто не хочу пользоваться динамическим выделением памяти

Тогда не жалуйтесь.
QUOTE
хранить переменные во флеше - медленный доступ.

Переменные во Flash не храняться в принципе sm.gif
QUOTE
паковать структуры - тоже удар по быстродействию.

Не больший, чем использовать без допиливания по месту всяких LwIP запимающих по 29K.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 8 2016, 14:01
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zltigo @ Mar 8 2016, 16:47) *
Смысл прост - если для контролера естественной единицей являются 32 бита, то любые другие размертности приходится преобразовывать, что уже неестественно. Поскольку у конкретного 32bit команда могут быть навороченными - типа взять и сдвинуть за одну команду, то это может уже оказаться при размещении в структуре "беслатно" и в игру вступает оптимизация.

Мы, кажется, обсуждали вполне конкретную платформу, не испытывающую трудностей при доступе к переменным с малой разрядностью, так что эти утверждения -
Цитата(zltigo @ Mar 8 2016, 15:34) *
Вообще-то 4 байта на этой платформе. Если не паковать в структуры.
...
Всегда по 4, если так или иначе не указывать компилятороу индивидуальные правила паковки, но и в этом случае структура без паковки будет кратна 4 байтам.

- не соответствуют действительности.

Цитата(zltigo @ Mar 8 2016, 16:47) *
Но по любому, если нужен ГАРАНТИРОВАННЫЙ результат, то только указания компилятору правил паковки, ну а для достижения лучшей оптимизации, это да - все элементы структуры стараться располагать в ней опять-же по границам слов. Ваш второй пример этому условию соответствует.

С этим никто не спорит, но специально добавлять padding там, где в нем ни малейшей нужды нет, компилятор не станет.

Цитата(Jenya7 @ Mar 8 2016, 16:47) *
просто не хочу пользоваться динамическим выделением памяти.

Напрасно не хотите.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 8 2016, 14:08
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (aaarrr @ Mar 8 2016, 16:01) *
Мы, кажется, обсуждали вполне конкретную платформу, не испытывающую трудностей при доступе к переменным с малой разрядностью, так что эти утверждения -
- не соответствуют действительности.

Трудности таки ЕСТЬ, иначе и в первом Вашем примере все было-бы однобайтовым. Во втором "хорошем" примере Ваш конкретный компилятор просто смог соптимизировать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 8 2016, 14:23
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zltigo @ Mar 8 2016, 17:08) *
Трудности таки ЕСТЬ, иначе и в первом Вашем примере все было-бы однобайтовым.

Это другого рода трудности, возникающие как раз при доступе к "естественной" 32-битной переменной,
а не гипотетические трудности, возникающие при доступе к переменной с разрядностью менее естественной,
и отсутствующие для данной платформы.

Цитата(zltigo @ Mar 8 2016, 17:08) *
Во втором "хорошем" примере Ваш конкретный компилятор просто смог соптимизировать.

Так сделает любой вменяемый компилятор.
Go to the top of the page
 
+Quote Post
adnega
сообщение Mar 8 2016, 14:31
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(aaarrr @ Mar 8 2016, 15:20) *
Зависит от окружения:
Код
struct
{
     uint8_t    v1;
     uint32_t   v2;
}

В этом случае v1 займет 4 байта.

Неужели?
v1 = 256;
v2 = v1;
Сколько будет в v2?
Я думаю 0.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 8 2016, 14:33
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(adnega @ Mar 8 2016, 17:31) *
Я думаю 0.

Я тоже так думаю, и что?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 8 2016, 14:37
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (aaarrr @ Mar 8 2016, 16:23) *
Это другого рода трудности, возникающие как раз при доступе к "естественной" 32-битной переменной,

Естественные 32bit переменные являются естественными не только по причине разрядности, сколько по причине их расположения по адресам кратрым их разрядности. Соответственно для любой переменной малой разрядности и ее расположение по адресу кратному разрядности вызывает минимум или вообще не вызывает проблем.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
adnega
сообщение Mar 8 2016, 14:48
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Есть версия, что v1 займет 1 байт (sizeof(v1) = 1), но после v1 будет размещено 3 неиспользуемых байта.
sizeof для такой структуры будет равен 8.

Нужно ли обсуждать такой момент в доступе к невыровненным данным, как сборка многобайтового числа побайтово?
Как известно CM3 может обращаться к невыровненным данным за счет штрафных тактов без генерации исключения.
А, например, CM0 не допускает обращения к невыровненным данным с генерацией исключения.
В этом случае собирать 32-битное невыровненное число нужно по байтам. А это лишние такты и память в случае CM3.

Можно ли компилятору принудительно разрешить или запретить сборку побайтово? Видимо, ответ: RTFM на компилятор.

Второй момент (все наоборот). Есть память с 32/16-битным доступом (например, батареечная память в STM32).
Можно ли в ней разместить структуру элементов с меньшим размером, но чтоб доступ был 32/16-битным?
Как это указать компилятору и можно ли сделать в принципе?
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 8 2016, 15:16
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Даже прочитать всё это сложно! не говоря уже о том что бы понять!
Пипец какой!!!
Для программиста на ассемблере это всё просто дико!
Чем люди занимаются вместо алгоритма blink.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 8 2016, 15:39
Сообщение #25


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(zombi @ Mar 8 2016, 21:16) *
Даже прочитать всё это сложно! не говоря уже о том что бы понять!
Пипец какой!!!
Для программиста на ассемблере это всё просто дико!
Чем люди занимаются вместо алгоритма blink.gif

как говорил Форест Гамп - алгоритм алгоритму рознь.


товарищи а вы как поступаете?
как выделяете глобальные переменные и члены глобальных структур?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 8 2016, 16:07
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Jenya7 @ Mar 8 2016, 17:39) *
как выделяете глобальные переменные и члены глобальных структур?

Какая разница КАК? Как не выделяй, если они НУЖНЫ, то они нужны. В Вашем случае, если хоть как то попытаться понять написанное, одна из проблем растраты памяти, это ее выделение оптом под всякие структуры, хоть используемые, хоть нет. На такие действия ответ один - НЕ выделяйте. А Вы какого ожидали? Если общие советы, то тут уже тоже перечислены: http://electronix.ru/forum/index.php?showt...t&p=1409464


QUOTE (adnega @ Mar 8 2016, 16:48) *
Можно ли в ней разместить структуру элементов с меньшим размером, но чтоб доступ был 32/16-битным?
Как это указать компилятору и можно ли сделать в принципе?

Играться с паковкой и ручным добавлением padding.


QUOTE (zombi @ Mar 8 2016, 17:16) *
Чем люди занимаются вместо алгоритма blink.gif

Очевидно, что рукопашной возней с битами и байтами в низкоуровневых языках.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 8 2016, 16:16
Сообщение #27


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(zltigo @ Mar 8 2016, 22:07) *
Какая разница КАК? Как не выделяй, если они НУЖНЫ, то они нужны. В Вашем случае, если хоть как то попытаться понять написанное, одна из проблем растраты памяти, это ее выделение оптом под всякие структуры, хоть используемые, хоть нет. На такие действия ответ один - НЕ выделяйте. А Вы какого ожидали? Если общие советы, то тут уже тоже перечислены: http://electronix.ru/forum/index.php?showt...t&p=1409464



Играться с паковкой и ручным добавлением padding.



Очевидно, что рукопашной возней с битами и байтами в низкоуровневых языках.

ну что значит - как не выделяй. можно создать переменную uint8_t а можно uint32_t.
Перенести структуры в юнионы. - я не понял как это возможно.
Использовать драйвера интерфейсов не одновременно, а с разделением во времени. - то же непонятно. (мне).
я создаю массив структур с запасом не потому что я дурак (хотя это тоже) а потому что я не знаю сколько элементов понадобиться пользователю.
представьте адресную книжку - появился новый друг - открыл новую запись.

Сообщение отредактировал Jenya7 - Mar 8 2016, 16:18
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 8 2016, 16:31
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(zltigo @ Mar 8 2016, 19:07) *
Очевидно, что рукопашной возней с битами и байтами в низкоуровневых языках.

В низкоуровневых языках я как раз этой фигнёй и не занимаюсь.
Выделил память под переменную, знаю какой она размерности и знаю как к ней обращаться.
В отличие от СИшников !
Которые думают-гадают как там за них компилятор всё порешает и поразмещает biggrin.gif куда и как повыравнивает biggrin.gif

Цитата(Jenya7 @ Mar 8 2016, 19:16) *
я создаю массив структур с запасом не потому что я дурак (хотя это тоже) а потому что я не знаю сколько элементов понадобиться пользователю.
представьте адресную книжку - появился новый друг - открыл новую запись.

Нет, так нельзя.
Представьте себе сто появился миллиардный пользователь и открыл новую запись а размер этой записи несколько гигабайт.
Вы предусматриваете такую возможность?
Go to the top of the page
 
+Quote Post
adnega
сообщение Mar 8 2016, 16:45
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Mar 8 2016, 19:16) *
представьте адресную книжку - появился новый друг - открыл новую запись.

Адресную книжку нужно хранить в энергонезависимой памяти, иначе сброс МК приведет к ее потере.
Доступ к адресной книжке может быть довольно медленным, т.к. пользователь во много раз менее быстро способен воспринимать информацию.
Т.е. адресную книжку можно и нужно хранить во flash.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Mar 8 2016, 17:00
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Jenya7 @ Mar 8 2016, 22:16) *
ну что значит - как не выделяй. можно создать переменную uint8_t а можно uint32_t.

Выложите свой map-файл, тогда все всё увидят и объяснят. А то получится безрезультатный флуд еще на 2 страницы.
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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