Не могу понять почему фокус с выносом во флеш не получается при формировании строки смс
statusText = "F(I am here )"; // + String (date)+ String (time) +String (lat)+String (lng));
Как правильно оформить синтаксис в таком случае, чтобы "подтягивались" значения из скетча к фразам из флеши?
Блин, слушайте внимательно:
Вам не надо ничего "подтягивать". Константы из флеша печатайте прямо, а переменные части отдельно.
Как только Вы начинаете "подтягивать", т.е. формировать единую строку, Вы напрочь убиваете саму идею хранения во флеше, т.к. Вы вытаскиваете строку из флеша и формируете результирующую строку уже в оперативной памяти. За что боролись-то?
Можно, клнечно, сделать так. чтобы она формировалась в опреативке и сразу же после печати оперативка освобождалась. Но, Вы умеете это?
Не выпендирвайтесь и не формируйте единую строку. Константные части выводите отдельными print'ами прямо из флеша. Нафига Вам всё в одну строку формировать? Чем плохо выводить по частям?
У меня есть пример случая, в котором по частям выводить плохо (если интересно). Но он очень специфический и, конечно, может быть обойдён всякими методами.
Но в данном случае, конечно, овчинка выделки не стоит, соглашусь с ЕвгенийП.
то для однократного вызова это будет аналогично использованию F(), но зато если эта строка нужна нам в несколькиз местах программы - последний способ будет много экономичнее, чем несколько F() с одинаковым содержимым
Вообще-то, я просто не стал делать String allText = String(FSH_P(text_elapsedTime))+String(огроменное_число), что пытался сделать вопрошающий - подумал что и так будет понятно, как в String PGM засунуть.
Беда только в том, что ТС не понимает, что как только он пихает PGM в String, он получает копию в RAM (см. конструктор String). А если делать копию в RAM, то за что боролись?
Вам же уже раз пять сказали - как только вы преобразуете строку в String - вся экономия памяти идет коту под хвост. Избавьтесь от класса String совсем.
Она создаёт копию "I am here " в оперативной памяти!
Сдаётся мне, что все эти разные названия памятей для Вас тёмный лес, поэтому давайте, чтобы не путаться, я объясню Вам проще.
Всё, что Вы имеете право делать со строками из прогмем - это их печатать и ничего (совсем ничего, просто нихера) больше.
Т.е. Вы пишете примерно так.
float tempC = getTemperature();
Serial. priint(F"Temperature');
Serial.println(tempC );
// и НИКОГДА не пишете
String msg = F"Temperature'; // вот здесь Вы проср@ли свою экономию памяти!
msg += getTemperature();
Serial.println(msg);
И никак по-другому! Строки, начинающиеся с F имеют право встречаться ТОЛЬКО в виде аргумента print и быть там в одиночестве - безо всяких плюсов и любой другой херни.
Ни в каком другом месте эти строки не используйте.
То, что во флеш можно только набор символов поместить и оттуда их печатать я понял. Благодаря этому уже почти 15% сэкономлено по результатам компиляции. Спасибо, это даже больше, чем я ожидал.
Цитата:
Строки, начинающиеся с F имеют право встречаться ТОЛЬКО в виде аргумента print и быть там в одиночестве - безо всяких плюсов и любой другой херни.
Сдаётся мне, что все эти разные названия памятей для Вас тёмный лес
Так и есть, не скрываю.
Я тотально запутался.
b707 пишет:
Вам же уже раз пять сказали - как только вы преобразуете строку в String - вся экономия памяти идет коту под хвост. Избавьтесь от класса String совсем.
Не пойму никак, как я могу уйти от string вообще, если мне надо выводить для передачи в смс переменные? Переменные же не могу быть во флеши, если я верно понял.
Если можно построчно выводить в порт данные то из флеши то из скетча для реализации print, не смешивая их при этом по месту хранения и экономя при этом память, то (вот тут я спотыкаюсь) как аналогично сделать для statusText, если это вообще реально. Вывести и отправить "заготовки" текста из флеш и между ними данные из скетча. Вот тут я запнулся.
Значения переменных, которые не отмечены клеймом PROGMEM на старте перегружаются из ROM в RAM. Таким образом, они одновременно существуют и в Progmem Space (ROM) и RAM. F() намекает функции, что всё, что внутри ея - нужно специальными методами читать из ROM. Т.е. println() чует, что ей передали адрес ячейки во ROM, а не в RAM и последовательно читает байтики из ячеек и отправляет куда сказано - в Serial, например. String же создаётся в RAM, засасывает туда все байты из ROM и существует до уничтожения. Т.е. получается то же самое, что и без F().
Вопрос формирования "заготовки" имеет более одного ответа и рассмотрен, например, тут. Однако, если Вы начинающий, то можете вполне себе продолжить выводит вперемешку текст и переменные. Для принимающей стороны нет особой разницы: 4 раза по 50 грамм или один раз по 200.
Не могу понять почему фокус с выносом во флеш не получается при формировании строки смс
Как правильно оформить синтаксис в таком случае, чтобы "подтягивались" значения из скетча к фразам из флеши?
Блин, слушайте внимательно:
Вам не надо ничего "подтягивать". Константы из флеша печатайте прямо, а переменные части отдельно.
Как только Вы начинаете "подтягивать", т.е. формировать единую строку, Вы напрочь убиваете саму идею хранения во флеше, т.к. Вы вытаскиваете строку из флеша и формируете результирующую строку уже в оперативной памяти. За что боролись-то?
Можно, клнечно, сделать так. чтобы она формировалась в опреативке и сразу же после печати оперативка освобождалась. Но, Вы умеете это?
Не выпендирвайтесь и не формируйте единую строку. Константные части выводите отдельными print'ами прямо из флеша. Нафига Вам всё в одну строку формировать? Чем плохо выводить по частям?
У меня есть пример случая, в котором по частям выводить плохо (если интересно). Но он очень специфический и, конечно, может быть обойдён всякими методами.
Но в данном случае, конечно, овчинка выделки не стоит, соглашусь с ЕвгенийП.
Только всё равно это сравнимо с ударом сковородкой по голове. Гораздо "дешевле" по ресурсам сразу в Serial.print() передавать указатель на PGM-строку.
если заранее положить строчку в ПРОГМЕМ, а потом вывести двумя отдельными принтами -
то для однократного вызова это будет аналогично использованию F(), но зато если эта строка нужна нам в несколькиз местах программы - последний способ будет много экономичнее, чем несколько F() с одинаковым содержимым
Вообще-то, я просто не стал делать String allText = String(FSH_P(text_elapsedTime))+String(огроменное_число), что пытался сделать вопрошающий - подумал что и так будет понятно, как в String PGM засунуть.
String PGM засунуть.
Беда только в том, что ТС не понимает, что как только он пихает PGM в String, он получает копию в RAM (см. конструктор String). А если делать копию в RAM, то за что боролись?
Cпасибо. Кажется дошло.
serial.Print поделил построчно.
Не могу осилить как это же проделать для строки смс statusText
Вот так по моему представлению оно должно было работать на начальном этапе.
Если пробовать по аналогии с serial.Print, то
Это тождественно? или опять напутал?
Спасибо
что ж вы так тупите....
Вам же уже раз пять сказали - как только вы преобразуете строку в String - вся экономия памяти идет коту под хвост. Избавьтесь от класса String совсем.
Что у Вас делает строка
???
Она создаёт копию "I am here " в оперативной памяти!
Сдаётся мне, что все эти разные названия памятей для Вас тёмный лес, поэтому давайте, чтобы не путаться, я объясню Вам проще.
Всё, что Вы имеете право делать со строками из прогмем - это их печатать и ничего (совсем ничего, просто нихера) больше.
Т.е. Вы пишете примерно так.
И никак по-другому! Строки, начинающиеся с F имеют право встречаться ТОЛЬКО в виде аргумента print и быть там в одиночестве - безо всяких плюсов и любой другой херни.
Ни в каком другом месте эти строки не используйте.
То, что во флеш можно только набор символов поместить и оттуда их печатать я понял. Благодаря этому уже почти 15% сэкономлено по результатам компиляции. Спасибо, это даже больше, чем я ожидал.
Я так и сделал уже.
Работает. Процент загруженности меньше. Спасибо.
Я тотально запутался.
Не пойму никак, как я могу уйти от string вообще, если мне надо выводить для передачи в смс переменные? Переменные же не могу быть во флеши, если я верно понял.
Значения переменных, которые не отмечены клеймом PROGMEM на старте перегружаются из ROM в RAM. Таким образом, они одновременно существуют и в Progmem Space (ROM) и RAM. F() намекает функции, что всё, что внутри ея - нужно специальными методами читать из ROM. Т.е. println() чует, что ей передали адрес ячейки во ROM, а не в RAM и последовательно читает байтики из ячеек и отправляет куда сказано - в Serial, например. String же создаётся в RAM, засасывает туда все байты из ROM и существует до уничтожения. Т.е. получается то же самое, что и без F().
Вопрос формирования "заготовки" имеет более одного ответа и рассмотрен, например, тут. Однако, если Вы начинающий, то можете вполне себе продолжить выводит вперемешку текст и переменные. Для принимающей стороны нет особой разницы: 4 раза по 50 грамм или один раз по 200.