|
Экономия RAM. |
|
|
|
 |
Ответов
(1 - 84)
|
Mar 8 2016, 11:19
|
Гуру
     
Группа: Свой
Сообщений: 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-файлу.
|
|
|
|
|
Mar 8 2016, 11:49
|

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

|
Цитата(Jenya7 @ Mar 8 2016, 09:38)  3. может есть какие нибудь трюки позволяющие экономить RAM? Стеки ужать. Обнулить память для HEAP. Перенести структуры в юнионы. Заменить printf и sprintf на свои версии. Укоротить циклические буфера. Заменить в операционке вытеснющие задачи на кооперативные. Использовать драйвера интерфейсов не одновременно, а с разделением во времени. ...
|
|
|
|
|
Mar 8 2016, 11:51
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 8 2016, 12:20
|
Гуру
     
Группа: Свой
Сообщений: 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, стеки, буферы.
|
|
|
|
|
Mar 8 2016, 12:34
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 8 2016, 13:47
|

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

|
QUOTE (aaarrr @ Mar 8 2016, 15:33)  но смысла в таком выравнивании не просматривается, так что сомневаюсь. Смысл прост - если для контролера естественной единицей являются 32 бита, то любые другие размертности приходится преобразовывать, что уже неестественно. Поскольку у конкретного 32bit команда могут быть навороченными - типа взять и сдвинуть за одну команду, то это может уже оказаться при размещении в структуре "беслатно" и в игру вступает оптимизация. Но по любому, если нужен ГАРАНТИРОВАННЫЙ результат, то только указания компилятору правил паковки, ну а для достижения лучшей оптимизации, это да - все элементы структуры стараться располагать в ней опять-же по границам слов. Ваш второй пример этому условию соответствует.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2016, 13:55
|

Гуру
     
Группа: Свой
Сообщений: 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 не храняться в принципе  QUOTE паковать структуры - тоже удар по быстродействию. Не больший, чем использовать без допиливания по месту всяких LwIP запимающих по 29K.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2016, 14:01
|
Гуру
     
Группа: Свой
Сообщений: 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)  просто не хочу пользоваться динамическим выделением памяти. Напрасно не хотите.
|
|
|
|
|
Mar 8 2016, 14:08
|

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

|
QUOTE (aaarrr @ Mar 8 2016, 16:01)  Мы, кажется, обсуждали вполне конкретную платформу, не испытывающую трудностей при доступе к переменным с малой разрядностью, так что эти утверждения - - не соответствуют действительности. Трудности таки ЕСТЬ, иначе и в первом Вашем примере все было-бы однобайтовым. Во втором "хорошем" примере Ваш конкретный компилятор просто смог соптимизировать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2016, 14:23
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Mar 8 2016, 17:08)  Трудности таки ЕСТЬ, иначе и в первом Вашем примере все было-бы однобайтовым. Это другого рода трудности, возникающие как раз при доступе к "естественной" 32-битной переменной, а не гипотетические трудности, возникающие при доступе к переменной с разрядностью менее естественной, и отсутствующие для данной платформы. Цитата(zltigo @ Mar 8 2016, 17:08)  Во втором "хорошем" примере Ваш конкретный компилятор просто смог соптимизировать. Так сделает любой вменяемый компилятор.
|
|
|
|
|
Mar 8 2016, 14:31
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Mar 8 2016, 14:48
|
Гуру
     
Группа: Свой
Сообщений: 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-битным? Как это указать компилятору и можно ли сделать в принципе?
|
|
|
|
|
Mar 8 2016, 15:39
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

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

Гуру
     
Группа: Свой
Сообщений: 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=1409464QUOTE (adnega @ Mar 8 2016, 16:48)  Можно ли в ней разместить структуру элементов с меньшим размером, но чтоб доступ был 32/16-битным? Как это указать компилятору и можно ли сделать в принципе? Играться с паковкой и ручным добавлением padding. QUOTE (zombi @ Mar 8 2016, 17:16)  Чем люди занимаются вместо алгоритма  Очевидно, что рукопашной возней с битами и байтами в низкоуровневых языках.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2016, 16:16
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 8 2016, 16:31
|

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

|
Цитата(zltigo @ Mar 8 2016, 19:07)  Очевидно, что рукопашной возней с битами и байтами в низкоуровневых языках. В низкоуровневых языках я как раз этой фигнёй и не занимаюсь. Выделил память под переменную, знаю какой она размерности и знаю как к ней обращаться. В отличие от СИшников ! Которые думают-гадают как там за них компилятор всё порешает и поразмещает  куда и как повыравнивает  Цитата(Jenya7 @ Mar 8 2016, 19:16)  я создаю массив структур с запасом не потому что я дурак (хотя это тоже) а потому что я не знаю сколько элементов понадобиться пользователю. представьте адресную книжку - появился новый друг - открыл новую запись. Нет, так нельзя. Представьте себе сто появился миллиардный пользователь и открыл новую запись а размер этой записи несколько гигабайт. Вы предусматриваете такую возможность?
|
|
|
|
|
Mar 8 2016, 17:15
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(adnega @ Mar 8 2016, 22:45)  Адресную книжку нужно хранить в энергонезависимой памяти, иначе сброс МК приведет к ее потере. Доступ к адресной книжке может быть довольно медленным, т.к. пользователь во много раз менее быстро способен воспринимать информацию. Т.е. адресную книжку можно и нужно хранить во flash. у меня не совсем адресная книжка но принцип тот же. я загружаю с внешнего носителя до десяти контактов. работаю с ними. если был рисет - они снова загрузяться с носителя. я думал считывать контакты с носителя поэлементно и работать с ними - но это время - считывание, парсинг. так я только один раз это сделал на стартапе. Цитата(HardEgor @ Mar 8 2016, 23:00)  Выложите свой map-файл, тогда все всё увидят и объяснят. А то получится безрезультатный флуд еще на 2 страницы. такой вот он мап-файл. Неудачная загрузка. Вам запрещено загружать такой тип файлова что собственно флудить. либо выделяем все глобальные переменные нужного размера либо все uint32_t, давайте решим наконец.
Сообщение отредактировал Jenya7 - Mar 8 2016, 17:31
|
|
|
|
|
Mar 8 2016, 18:32
|

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

|
QUOTE (zombi @ Mar 8 2016, 18:31)  В низкоуровневых языках я как раз этой фигнёй и не занимаюсь. Выделил память под переменную, знаю какой она размерности и знаю как к ней обращаться. В отличие от СИшников ! Это Вы по собственной дурости и незнанию обвиняете всех сишников огульно в неведомых грехах. А чем Вы занимаетесь в ассемблере и чем я занимался годы и частично в порядке сопровождения продолжаю в ассемблере заниматься, я знаю. Поскольку РАБОТАЮ в одном ассеблере виртуозно, в паре - хорошо, и в десятке терпимо. В отличие от Вас, который и в одном высокоуровневом языке ни уха ни рыла  . QUOTE (Jenya7 @ Mar 8 2016, 18:16)  я создаю массив структур с запасом не потому что я дурак (хотя это тоже) а потому что я не знаю сколько элементов понадобиться пользователю. Я хочу 22 миллиарда. Можно? Если НЕ знаете, то почему решили назвать конкретное максимальное число и забить его в качестве количества стуктур? Что Вы вообще делаете? Что это за стуктуры в непонятных количествах? QUOTE (jcxz @ Mar 8 2016, 19:32)  И абсолютно не соглашусь насчёт HEAP - стандартная HEAP в embedded - это зло. К тому-же совершенно не нужна. Слова "стандартная" это непонятно о чем, по причне того, что стандарта-то и нет. Ну и уж тем более не зло, если не пугаться и уметь хоть чуть-чуть готовить.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2016, 19:15
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(jcxz @ Mar 8 2016, 22:32)  Оптимизировать нужно там, где наибольший расход. 29К для TCP-стека это что-то уж слишком много. Поменяйте TCP-стек на более экономный. Для TCP-стека работающего поверх Ethernet-уровня, вполне достаточно очереди приёма в 3-5 ethernet-кадров и очереди передачи в 2-3 ethernet-кадров. Плюс - несколько десятков байт на информацию о состоянии сокетов и прочие переменные. Всё в сумме это будет около 10кБ (или меньше в зависимости от размера MTU для Ethernet и кол-ва кадров). Вся обработка всех уровней Ethernet-IP-TCP/UDP и т.п. - на колбэках на этих же кадрах без копирований.
И абсолютно не соглашусь насчёт HEAP - стандартная HEAP в embedded - это зло. К тому-же совершенно не нужна. до стэка еще руки не дотянулись. я с LWIP никогда не работал. менять вобщем то не на что. подходящей альтернативы ему нет, я имею в виду соотношение функциональность-вес. так что процесс будет трудный и медленный.  Цитата(zltigo @ Mar 8 2016, 23:32)  Я хочу 22 миллиарда. Можно? Если НЕ знаете, то почему решили назвать конкретное максимальное число и забить его в качестве количества стуктур? Что Вы вообще делаете? Что это за стуктуры в непонятных количествах? я выделил 10 элементов. пока это вполне разумно. скажем так - лайт версия. тот же компайлер в котором я работаю - лайт версия компилит 32 кило а не 22 милиарда. структура это пользовательская задача. malloc тут не подходит - пользователь начнет создавать/затирать элементы - хана куче.
|
|
|
|
|
Mar 8 2016, 20:33
|

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

|
QUOTE (zombi @ Mar 8 2016, 20:53)  Еще и тЭлЫпат ... Чего нет, того нет. Просто читать умею и написаное Вами, даже только в этой теиме, совершенно все о Вашем уровне говорит с предельной ясностью. QUOTE (Jenya7 @ Mar 8 2016, 21:15)  структура это пользовательская задача. malloc тут не подходит - пользователь начнет создвать/затирать элементы - хана куче.  C чего бы это, если элементы, например, одинаковые, то любому даже предельно убогому хана не грозит. Использование какого-то malloc так же совершенно не обязательно - менеджер может быть даже узкоспециализированый под уникальные объекты. Тут ведь дело в использовании самого принципа динамического использования памяти.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 9 2016, 07:27
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(ar__systems @ Mar 9 2016, 05:23)  Ставьте 16МБ SDRAM и не придется париться :-) идея не плохая но цена высокая. а как скорость доступа? нет. не пойдет. нет у меня столько ног для него. Цитата(zltigo @ Mar 9 2016, 02:33)  C чего бы это, если элементы, например, одинаковые, то любому даже предельно убогому хана не грозит. Использование какого-то malloc так же совершенно не обязательно - менеджер может быть даже узкоспециализированый под уникальные объекты. Тут ведь дело в использовании самого принципа динамического использования памяти. а я могу создать новый объект и положить его по адресу который я указал?
Сообщение отредактировал Jenya7 - Mar 9 2016, 07:50
|
|
|
|
|
Mar 9 2016, 14:51
|

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

|
QUOTE (Jenya7 @ Mar 9 2016, 09:27)  а я могу создать новый объект и положить его по адресу который я указал? Не понял зачем? То, что Вы сейчас восжелали есть принципиальная глупость. Если есть какой-то адрес, по по которому хочется что-то положить, то это значит, что сам "объект", пусть даже в качестве куска памяти УЖЕ СУЩЕСТВУЕТ, и "создать новый обьект" по этому адресу логичеси невозможно. QUOTE (amaora @ Mar 9 2016, 14:24)  Это уже может означать, что блоки будут разных размеров. Блоки БУДУТ таких размеров, каких пожелаете.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 10 2016, 07:21
|

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

|
QUOTE (adnega @ Mar 10 2016, 08:29)  А дикари научись различать "виртуальную память" и "кучу"? Увы, нет  , только "научились" слова, смысла которых не понимают, из "интеренету" в изобилии таскать. QUOTE (zombi @ Mar 10 2016, 01:14)  А не морочили людям голову! Пытаетесь морочить голову именно Вы. Тема называется "Экономия RAM" а не извлечение ее из эфира. Один их эффективых путей экономии это многократное и повторное использование ресурсов. Для этого можно использовать менеджеры памяти, или в чистом виде, или узкспециализированые решения постороенные на том же принципе динамического выделения памяти.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 10 2016, 07:32
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(zltigo @ Mar 10 2016, 10:21)  Один их эффективых путей экономии это многократное и повторное использование ресурсов. Для этого можно использовать менеджеры памяти, или в чистом виде, или узкспециализированые решения постороенные на том же принципе динамического выделения памяти. Лет 10 назад я разрабатывал устройство на AVR + asm. ОЗУ в наличии было мало, и для работы со статическим распределением всем бы не хватило. Сделал так: выделил большой кусок, в котором хранил таблицу при штатной работе. А в режиме обновления ПО, когда штатная работа прекращалась и таблицы были не нужны - использовал этот кусок для буфера связи с внешним миром и обновления ПО. Все работало, но про параллельное использование памяти нужно было помнить. На C с динамической памятью все куда прозрачнее, хотя смысл тот же - разделяемый по времени ресурс в виде ОЗУ.
|
|
|
|
|
Mar 10 2016, 07:58
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(zltigo @ Mar 10 2016, 10:46)  Но упаковался и еще осталость чуток. Видимо, для эффективной экономии ОЗУ нужно не только знать размеры переменных, но и знать архитектуру своего ПО. Хотя сейчас напрягаться не принято и проще поставить внешнюю SDRAM и/или выбрать МК с большим количеством набортного ОЗУ. В приложениях с таким функционалом, что приходится использовать TCP/IP, обсуждение размера переменной (1 или 4 байта) вызывает у меня определенные подозрения (что что-то не так).
|
|
|
|
|
Mar 10 2016, 08:19
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(zombi @ Mar 10 2016, 11:01)  Америку открыли Главное обеспечить невозможность одновременного выполнения процессов использующих эту общую область. Вроде, все не так. Никакой блокировки процессов нет. Процесс просит память, менеджер может выделить память или отказать в выделении. С выделенной памятью процесс может делать все что угодно, и другие процессы тут вообще никакой роли не играют. Отказ в выделении памяти процессу нужно как-то обработать. Цитата(zombi @ Mar 10 2016, 11:01)  И если такой возможности нет то и никакой мыныджер не поможет. Обсуждается ситуация, когда такая возможность есть. Может, вам стоит побольше вдумчивее читать и поменьше язвительно писать?
|
|
|
|
|
Mar 10 2016, 10:17
|

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

|
QUOTE (adnega @ Mar 10 2016, 10:19)  Обсуждается ситуация, когда такая возможность есть. Навязываемое Вами "обсуждение", откуда взять память, которой нет, абсолютно бессмысленно. Посему речь идет о памяти, котороая есть и которую надо пытаться использовать в разные моменты времени для разных целей. Если такой возможности нет, что практически НЕВЕРОЯТНО, или лениво думать как такое обеспечить, то и разговоров нет. Только Ваш треп ни о чем. QUOTE (adnega @ Mar 10 2016, 09:58)  Видимо, для эффективной экономии ОЗУ нужно не только знать размеры переменных, но и знать архитектуру своего ПО. Для вытягивания последних байтов надо знать уже все  . Но это уже на самом деле большая редкость. Я вот тоже на в работе о которой писал, тоже уже для M8C контроллера последние байты вытягивал, вытянул, плюнул, переделал принципиально, и стало 64 свободных байта. Ну придет серверу отказ на исполнение одной редкой команды, если звезды не так лягут, ну переспросит. QUOTE В приложениях с таким функционалом, что приходится использовать TCP/IP, обсуждение размера переменной (1 или 4 байта) вызывает у меня определенные подозрения (что что-то не так). Одиночной переменной - несомненно, но бывают и солидные массивы данных, где уже счет идет на тысячи таких переменных за каждым из тысяч процессов. При этом слово тысячи не должно особо пугать - на одном из проектов еще на i8085 у меня в свое время было 256 процессов. На первом из опробованных ARM LPC2114 - 1280 процессов. В обоих случаях прикол был в том, что процессы находились в разных состояниях и в статических состояниях обходились достаточно небольшим количеством данных. На переходных режимах процессам добавлялся блок памяти для обслуживания "развития" процесса.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 13 2016, 11:54
|

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

|
Цитата(adnega @ Mar 13 2016, 14:31)  Почитайте сообщение №51. Не имею возражений к Вашему сообщению №51 И мне кажется что ТС сам же и ответил на свой вопрос написав: Цитата(Jenya7 @ Mar 8 2016, 10:38)  ...закончился RAM. а я еще даже не начал писать. Т.е. на этапе проектирования количество необходимой памяти не определено даже приблизительно. О каких менеджерах вообще может идти речь?
|
|
|
|
|
Mar 13 2016, 12:17
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(zombi @ Mar 13 2016, 14:54)  Т.е. на этапе проектирования количество необходимой памяти не определено даже приблизительно. О каких менеджерах вообще может идти речь?  Мы с zltigo привели реальные примеры, когда пересмотр архитектуры позволил "найти" нужное количество памяти. Если ТС не способен ухитриться (или задача не позволяет), то для него путь - тупо увеличить объем ОЗУ. Отрицать на вашем месте вообще подход с использованием менеджеров памяти - не профессионально.
|
|
|
|
|
Mar 13 2016, 12:20
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(ViKo @ Mar 13 2016, 17:06)  В однозадачном режиме использовать кучу безопасно. Выделил фрагмент, попользовался, освободил. Сложнее, когда задач несколько, и каждая может попросить памяти. Как определить худший случай, когда требуется максимальный объем? тут нужно решать концептуально. есть 10 задач. либо загрузить их в RAM и проходить итерацией , либо брать по одной - загрузил-освободил - тогда можно и с malloc/free. но во втором случае возникает вопрос - где держать задачи. хорошо. я написал код для PLC. В Ladder Diagram или мнемоник. где хранится пограмма которую PLC исполняет? идея.положу во флеш..если останется место. он что то тоже стремительно убывает.
Сообщение отредактировал Jenya7 - Mar 13 2016, 13:35
|
|
|
|
|
Mar 13 2016, 14:14
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(zombi @ Mar 13 2016, 15:25)  Обвинять кого либо в том чего он не говорил - не порядочно. Значит менеджеры памяти в некоторых задачах нужны. Пригодность задачи для использования динамического выделения памяти определяет разработчик. Если задача непригодна (пусть даже по причине отсутствия опыта у исполнителя) - наращиваем ОЗУ. Все - конфликт исчерпан. Я прошу меня простить, если с кем-то поступил не порядочно.
|
|
|
|
|
Mar 13 2016, 21:19
|

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

|
Цитата(adnega @ Mar 14 2016, 00:40)  Тема исчерпана - неплохо бы закрыть и последнее почистить. Ну значит так и есть  Удалил, мне не сложно. А насчёт "закрыть" это лучше к ТС писать Цитата(adnega @ Mar 13 2016, 17:14)  Значит менеджеры памяти в некоторых задачах нужны. Может СИшникам и нужны, мне точно не нужны. Для меня это просто часть алгоритма и как его обозвать не имеет значения.
|
|
|
|
|
Mar 14 2016, 08:24
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Mar 14 2016, 10:48)  Создать глобальное объединение (union) из массивов всех нужных типов, максимально необходимого размера, и пользоваться им по мере необходимости вместо кучи. Годится? Хочу понять, как куча может помочь сэкономить память? Никак. Может привести только к бОльшему расходу памяти. Куча полезна только если нужно запускать различные задачи, заранее не известные (когда и какую), с заранее неизвестными требованиями к памяти. Но и то - нужна обработка случая нехватки памяти. Да и дефрагментация периодическая или после завершения каждой задачи. Это случай Linux-а и подобных ему систем. Обычно для ембеддед достаточно: union MemShare { struct MemMode1 { int member1, member2; ... } memMode1; struct MemMode2 { int member1, member2; ... } memMode2; ... } memShare; где Mode1, Mode2, ... - состояния работы устройства с неперекрывающимися структурами данных; которые в свою очередь могут быть union и делиться дальше.
|
|
|
|
|
Mar 14 2016, 22:38
|

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

|
ТС вопрошает Цитата(Jenya7 @ Mar 8 2016, 11:38)  закончился RAM. а я еще даже не начал писать. "вЫртуоз" пишет: Цитата(zltigo @ Mar 9 2016, 00:33)  менеджер может быть даже узкоспециализированый под уникальные объекты. Тут ведь дело в использовании самого принципа динамического использования памяти. Цитата(zltigo @ Mar 9 2016, 21:17)  Что то дикие у Вас представления о менеджерах памяти и программировании Просто прохожий - Цитата(zombi @ Mar 10 2016, 03:14)  Ну так рассказали бы дикарям про менеджеры памяти "вЫртуоз"- Цитата(zltigo @ Mar 9 2016, 21:17)  - этим менеджер заниматеся - Вам то зачем что то знать? и тд и тп Цитата(zltigo @ Mar 14 2016, 18:57)  "полезно" и "полезно ТОЛЬКО"."полезна ТОЛЬКО если нужно Внимание, ВОПРОС!!! Помог ли "вЫртуоз" освободить память вопрошающему? И если помог, то представляю как сейчас TC "купается" в огромном количестве свободной памяти которая так и просит его - ну возьми ну используй меня...
|
|
|
|
|
Mar 14 2016, 23:19
|

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

|
QUOTE (zombi @ Mar 15 2016, 00:38)  Внимание, ВОПРОС!!! Будьте внимательнее. Ответ уже был http://electronix.ru/forum/index.php?showt...t&p=1410271Мне описанный мной подход к делу помогает. По причине того, то я понимаю, что и как делаю. Вам, по причине полной неспособности понять, соответственно - нет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 16 2016, 07:22
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата А помогли ли ТС ваши советы? И где конкретно советы? один сплошной трёп! Да ладно? Нормально тема раскрыта. Или вы хотели чтоб тут за ТС прям все исправили и отладили? Направление для изучения дано, варианты расшарить память между задачам/подсистемами/etc даны. Техники от полу-кустарных, ручных вариантов с union до более правильных менеджеров памяти в общих чертах описаны.... Дальше человек уже должен маленько по гуглить и найти всё что ему нужно. Тут как-бы получается умному достаточно, а дурак все равно не поймет. P.S. Честно не понимаю чего у нескольких людей на форуме так бомбит пукан от советов zltigo? Это такой способ отомстить за курс Евро или что? Потому что это уже явно какая-то не адекватная реакция часто начинается.. Объяснения приходят только в стиле теории заговоров или борьбы с империализмом и ненависти к буржуазии ))) Но убирает он вас всех здорово! Порой тему читаю только чтоб по улыбаться со всего этого ))))
--------------------
The truth is out there...
|
|
|
|
|
Mar 18 2016, 10:17
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(zombi @ Mar 18 2016, 03:16)  Вы либо курите что-то запрещённое , либо zltigo Ваш работодатедь как и для adnega? Скоро вы всех СИ-шников припишете к наемникам zltigo... Есть профи, которые на жизнь электроникой зарабатывают (и при этом любят электронику). Им виднее, что и как надо делать, а что и как не надо делать - поэтому они готовы давать советы для решения конкретной задачи в конкретных условиях. А есть любители, которые считают только свой подход правильным в любых условиях. Вроде, вопрос топика закрыли несколько страниц назад. Хочется поговорить о бесполезности СИ, о ненужности абстракций программирования и о "любимом" ASM? - открывайте свою тему. Да, zltigo довольно прямолинеен, но по информации из его постов можно судить о таком опыте (в том числе и asm-разработок) и таком объеме созданного полезного, до которого вам еще очень далеко. Завязываете: а то очень басню о Моське и Слоне напоминает.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|