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

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


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

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



Камень STM32f107VC. получил неприятный сюрприз – закончился RAM. а я еще даже не начал писать.
в связи с этим хотел задать несколько вопросов.
1. если я объявил глобальную переменную uint8_t под нее все равно выделиться регистр?
2. если я засунул стринг или какую нибудь переменную во флэш - при обращении к нему он копируется в RAM или я обращаюсь в область text?
3. может есть какие нибудь трюки позволяющие экономить RAM?

Сообщение отредактировал Jenya7 - Mar 8 2016, 11:13
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 8 2016, 11:19
Сообщение #2


Гуру
******

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



Цитата(Jenya7 @ Mar 8 2016, 10:38) *
1. если я объявил глобальную переменную uint8_t под нее все равно выделиться регистр?

Какой же регистр для глобальной переменной? Если речь о количестве выделенной памяти, то для такой переменной оно составит 1 байт.

Цитата(Jenya7 @ Mar 8 2016, 10:38) *
2. если я засунул стринг или какую нибудь переменную во флэш - при обращении к нему он копируется в RAM или я обращаюсь в область text?

Нет, ничего никуда копироваться не будет. Если есть сомнения, проконтролируйте размещение по map-файлу.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 8 2016, 11:46
Сообщение #3


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

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



Цитата(aaarrr @ Mar 8 2016, 17:19) *
Какой же регистр для глобальной переменной? Если речь о количестве выделенной памяти, то для такой переменной оно составит 1 байт.


Нет, ничего никуда копироваться не будет. Если есть сомнения, проконтролируйте размещение по map-файлу.

я понял. а я тут все глобальные переменные определяю uint32_t - вычитал что операции с ними происходят быстрее.

а если я создал в глобальной структуре переменную uint8_t? без выравниания она займет 4 байта?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Mar 8 2016, 11:49
Сообщение #4


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Jenya7 @ Mar 8 2016, 09:38) *
3. может есть какие нибудь трюки позволяющие экономить RAM?


Стеки ужать.
Обнулить память для HEAP.
Перенести структуры в юнионы.
Заменить printf и sprintf на свои версии.
Укоротить циклические буфера.
Заменить в операционке вытеснющие задачи на кооперативные.
Использовать драйвера интерфейсов не одновременно, а с разделением во времени.
...

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 8 2016, 11:51
Сообщение #5


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

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



Цитата(AlexandrY @ Mar 8 2016, 17:49) *
Перенести структуры в юнионы.

а если мне нужно хранить несколько членов одновременно?

Цитата(AlexandrY @ Mar 8 2016, 17:49) *
Использовать драйвера интерфейсов не одновременно, а с разделением во времени.

а как это экономит RAM?
так вроде и так они разделены по времени.

Сообщение отредактировал Jenya7 - Mar 8 2016, 11:54
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 8 2016, 12:20
Сообщение #6


Гуру
******

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



Цитата(Jenya7 @ Mar 8 2016, 14:46) *
а если я создал в глобальной структуре переменную uint8_t? без выравниания она займет 4 байта?

Зависит от окружения:
Код
struct
{
     uint8_t    v1;
     uint32_t   v2;
}

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

Код
struct
{
     uint8_t    v1;
     uint8_t    v2;
     uint16_t   v3;
}

А в этом - 1 байт.

Но как-то сомнительно, чтобы память была выбрана одиночными переменными.
Основные потребители выше перечислены: heap, стеки, буферы.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 8 2016, 12:34
Сообщение #7


Гуру
******

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



QUOTE (aaarrr @ Mar 8 2016, 13:19) *
Какой же регистр для глобальной переменной? Если речь о количестве выделенной памяти, то для такой переменной оно составит 1 байт.

Вообще-то 4 байта на этой платформе. Если не паковать в структуры.


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

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

CODE
struct
{
     uint8_t    v1;
     uint8_t    v2;
     uint16_t   v3;
}

А в этом - 1 байт.

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




QUOTE (Jenya7 @ Mar 8 2016, 13:51) *
а если мне нужно хранить несколько членов одновременно?

А если нет?


QUOTE (AlexandrY @ Mar 8 2016, 13:49) *
Стеки ужать.

Обязательно.
QUOTE
Обнулить память для HEAP.

Ну так уж и обнулить, а если она нужна? А вот вместо тупого выделения статического куска, отдавать Heap всю оставшуюся нераспределеной память,
это дело святое. Общая тенденция прямо противоположная - ИСПОЛЬЗОВАТЬ Heap.
QUOTE
Перенести структуры в юнионы.

Ну не тупо и бездумно, конечно.
QUOTE
Заменить printf и sprintf на свои версии.

Да.
QUOTE
Укоротить циклические буфера.

Лобовой совет, но в общем да.
QUOTE
Заменить в операционке вытеснющие задачи на кооперативные.

Или да, или нет.
QUOTE
Использовать драйвера интерфейсов не одновременно, а с разделением во времени.

Это уже следствие совета структуры в юнионы сложить.


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


Гуру
******

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



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

Компилятор считает иначе.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 8 2016, 13:26
Сообщение #9


Гуру
******

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



QUOTE (aaarrr @ Mar 8 2016, 15:19) *
Компилятор считает иначе.

Конкретный компилятор руководствуясь конкретными глобальными стратегиями может считать, как ему приказали. В общем случае выравнивение у жестко 32bit платформ идет по границе разрядности.


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


Гуру
******

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



Цитата(zltigo @ Mar 8 2016, 16:26) *
Конкретный компилятор руководствуясь конкретными глобальными установками может считать, как ему приказали. В общем случае выравнивение у жестко 32bit платформ идет по границе разрядности.

Без каких-либо специальных установок. Насчет "общего случая" не скажу, но смысла в таком выравнивании не просматривается, так что сомневаюсь.
Go to the top of the page
 
+Quote Post
adnega
сообщение Mar 8 2016, 13:39
Сообщение #11


Гуру
******

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



А посмотреть листинг и понять куда RAM ушла можно?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 8 2016, 13:40
Сообщение #12


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

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



и все таки? To byte or not to byte? 1 байт или 4 байта?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 8 2016, 13:41
Сообщение #13


Гуру
******

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



1 байт. Что легко можно проверить самостоятельно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 8 2016, 13:47
Сообщение #14


Гуру
******

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



QUOTE (aaarrr @ Mar 8 2016, 15:33) *
но смысла в таком выравнивании не просматривается, так что сомневаюсь.

Смысл прост - если для контролера естественной единицей являются 32 бита, то любые другие размертности приходится преобразовывать, что уже неестественно. Поскольку у конкретного 32bit команда могут быть навороченными - типа взять и сдвинуть за одну команду, то это может уже оказаться при размещении в структуре "беслатно" и в игру вступает оптимизация.
Но по любому, если нужен ГАРАНТИРОВАННЫЙ результат, то только указания компилятору правил паковки, ну а для достижения лучшей оптимизации, это да - все элементы структуры стараться располагать в ней опять-же по границам слов. Ваш второй пример этому условию соответствует.


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


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

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



Цитата(adnega @ Mar 8 2016, 19:39) *
А посмотреть листинг и понять куда RAM ушла можно?

ну у меня там есть проблемное место - я выделяю массив структур конечного размера. он отжирает 10 кило. если даже я потом создал один элемент все поле занято под массив. просто не хочу пользоваться динамическим выделением памяти. к тому же LWIP отжирает 29 кило.
вот рассматриваю варианты экономии. хранить переменные во флеше - медленный доступ. паковать структуры - тоже удар по быстродействию.

Go to the top of the page
 
+Quote Post

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

 


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


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