помогите избавится от "string"
- Войдите на сайт для отправки комментариев
Пнд, 29/01/2018 - 14:43
Здравствуйте, не знаю пока нужен скетч или нет, нужен выложу, но он более 2500 строк... проблемма такая, программа работает хорошо, но хочу оптимизацию и дополнительное место для будущей можернизации устройства... и для этого хочу отказатся от стрингов :) жмут заразы. скетч без них занимает 1060 динамической памяти а с ними 1526...
что делаю с этими строками:
1) забиваю строку с модема m590e
2) проверяю совпадают ли строки
3) отправляю смс
понимаю надо использховать массивы char[] но каким образом пока не могу понять
У Вас полно статичных строк может сначала от них избавиться с помощью F или прогмем, а там видно будет
не понимаю о чем вы сможете ссылку привести где можно почитать об "F"
понял на счет F, супер, ноо большой ущерб памяти флеш... у меня и так флеша 76% на 328p-au
не понимаю о чем вы сможете ссылку привести где можно почитать об "F"
http://atmel.ucoz.ru/publ/progmem/1-1-0-64
понял на счет F, супер, ноо большой ущерб памяти флеш... у меня и так флеша 76% на 328p-au
флеш можно использовать хоть на 100% - лишь бы хватило. А вот оперативку нежелательно забивать более 60-70% - иначе могут начаться глюки.
на счет F просто супер))) все работает!! спасибо большое! и теперь освободил с 74% до 42% отлично вообще!
да, все таки полезно скетч выкладывать... думал будет бесполезный
может еще элементарные способы оптимизации подскажите? на ваш взгляд
жесть... уже до 38% снизил... вот это я косяяяяяяяяяяк
наверное я такой криворукий, но у меня весь скетч на char[] и тоже занимает более 80 % динамической памяти,
250 байт входящий буфер от модема, 250 байт исходящий буфер для отправки SMS в PDU формате,
и даже учитывая что я максимально многократно стараюсь использовать одни и те же переменные,
и без этих двух буферов все равно много памяти съедается :(
не знаю как на УНО умудряются мегапроекты строить....
наверное я такой криворукий, но у меня весь скетч на char[] и тоже занимает более 80 % динамической памяти,
250 байт входящий буфер от модема, 250 байт исходящий буфер для отправки SMS в PDU формате,
и даже учитывая что я максимально многократно стараюсь использовать одни и те же переменные,
и без этих двух буферов все равно много памяти съедается :(
не знаю как на УНО умудряются мегапроекты строить....
80% это на каком чипе?
328 чип
328 чип
а можешь скинуть скетч? посмотрим почему так много
я себе сократил на 700байт
у меня щас этот скетч занимает:
да пожалуйста,
но мне не надо ничего сокращать :) - меня все устраивает,
потому не тратьте свое время на ковыряние чужого кода.
наверное я такой криворукий, но у меня весь скетч на char[] и тоже занимает более 80 % динамической памяти,
250 байт входящий буфер от модема, 250 байт исходящий буфер для отправки SMS в PDU формате,
А нельзя использовать один буфер и для приема и для отправки? по-моему они не нужны одновременно...
наверное я такой криворукий, но у меня весь скетч на char[] и тоже занимает более 80 % динамической памяти,
250 байт входящий буфер от модема, 250 байт исходящий буфер для отправки SMS в PDU формате,
А нельзя использовать один буфер и для приема и для отправки? по-моему они не нужны одновременно...
Можно, но сразу сходу не получилось, так как отправка смс идёт двумя AT командами, а скетч универсальный под любые команды и передача смс самой идёт сразу после ответа на первую команду, т е в памяти желательно все держать и отправку и приём.
Как вариант использовать различную размер массивов и динамическое выделение памяти, но тогда теряется универсальность библиотеки которую я для А6 модема написал.
Короче все реально, нужно просто сесть и сделать, а на работе я иногда и работу работаю....лень доделывать - работает стабильно и хорошо.
понял на счет F, супер, ноо большой ущерб памяти флеш... у меня и так флеша 76% на 328p-au
Не будет никакого ущерба. От слова совсем.
Если у Вас используются константные строки, то, когда МК выключен, они должны где-то храниться? Кроме как во flash, больше негде. Вопрос только в том, будут ли они перед применением копироваться в оперативную память или нет. А места занимают ровно столько же.
Не будет никакого ущерба. От слова совсем.
Если у Вас используются константные строки, то, когда МК выключен, они должны где-то храниться? Кроме как во flash, больше негде. Вопрос только в том, будут ли они перед применением копироваться в оперативную память или нет. А места занимают ровно столько же.
Вы ошибаетесь и весьма сильно. Макрос F() вообще ОЧЕНЬ НЕЭФФЕКТИВНО тратит флеш - он тратит флеша куда больше, чем экономит ОЗУ. Особенно это касается повторяющихся строк.
например, код
сохранит в ОЗУ только одну копию строки и потратит на это всего 12 байт, а такой же код с макросом F(), сэкономив 12 байт - положит во флеш пять одинаковых строк по 12 байт, не считая накладных расходов.
Можете легко убедится, компилируя коды в Ардуино ИДЕ.
b707, Вы это серьезно?
Да, действительно, способ размещения констант в оперативной памяти и во флеш различается. Именно способ. Из этого следует, что в каких-то случаях оптимальнее окажется одно, в каких-то - другое. Вашь пример явно искусственный, поэтому ориентироваться на него как на правило, вряд ли следует.
В среднем при нормальном коде разницы практически нет. В частности, разница может быть как в плюс, так и в минус.
Но можно придумать частный случай, в котором разница окажется существенной.
В любом случае, ничто не отменаяет того положения, что любая уникальная строка, которая должна появиться в ОЗУ после включения питания, занимает место во flash памяти.
b707, Вы это серьезно?
В среднем при нормальном коде разницы практически нет. В частности, разница может быть как в плюс, так и в минус. Вашь пример явно искусственный, поэтому ориентироваться на него как на правило, вряд ли следует.
В любом случае, ничто не отменаяет того положения, что любая уникальная строка, которая должна появиться в ОЗУ после включения питания, занимает место во flash памяти.
Что, интересно, в этом коде искусственного? То, что строки повторяются?
Вы бы, вместо того, чтобы лозунгами писать - взяли бы и сначала убедились на практике. Возьмем максимально простой пример -одна уникальная строка.
Далее меняем только строчку, поэтому буду указывать только оператор вывода и цифры:
Пока все логично - дополнительные 2 символа заняли 2 лишних байта и в ОЗУ и в во флеш
Добавляем F()
Ну что, вы все еще считаете, что "разницы практически нет"? Чтобы освободить 4 байта ОЗУ, макрос F() потратил аж 22 байта флеш.
Хотите дальше? - извольте! добавим еще одну строку, опять уникальную:
чтобы сравнение было корректным, тот же код без F()
Опять "разницы нет", правда? Тут уже экономия 8 байт обошлась аж в 50 байт флеша...
Можно продолжать и дальше. При каждом использовании F() потери флеша будут разными. Но они всегда больше , чем экономия оперативки. Иногда разница в разы, как в примере выше - иногда почти то на то - но всегда НЕ МЕНЬШЕ.
Ну что, скажете, пример опять неудачен?
Приведите свой.
Ну что, скажете, пример опять неудачен? Приведите свой.
При выключении и включении питания строки без F() продолжают выводиться, значит они сохранены в флеш-памяти. Вопрос в том: почему с F() увеличивается расход флеша?
Вопрос в том: почему с F() увеличивается расход флеша?
нуу... порой исходники макроса F() - видимо они и занимают место на флеше.
При выключении и включении питания строки без F() продолжают выводиться, значит они сохранены в флеш-памяти. Вопрос в том: почему с F() увеличивается расход флеша?
вопрос скорее надо ставить так - если это жестко кодированая строковая константа, зачем она вообще занимает место в оперативке?
А ответ на вопрос, почему макрос F() расходует столько флеша - это как раз просто. Этот макрос не является специализированным именно для констант, это "обертка" для типа FlashStringHelper. который работает не только с контантами, но и с переменными. Поэтому конструкция F("SSS") трактует "SSS" как переменную, которую надо перенести во флеш, оставив на месте ее вызова код, извлекающий строку из флеш-памяти. Поэтому F() не только занимает 4 байта во флеш под строку, но и добавляет в код программы инструкции обратного извлечения этих байт в ОЗУ.
И, снова про повторяющиеся строки - если макросу встречается пять одинаковых строк - он положит во флеш каждую отдельно, не анализируя. что такая строка уже там есть. Это, как я понимаю, тоже следствие того, что F() считает строки переменными.