Использование макроса F
- Войдите на сайт для отправки комментариев
Чт, 10/05/2018 - 17:56
Всем добрый день. Не могу найти ответ, как использовать макрос F с переменной.
Возможно ли это вообще ?
F("Строка") помещается в память, а вот строка + переменная не работает.
int value = 1; lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("Какой-то текст")); // Это работает lcd.setCursor(0, 1); lcd.print("Значение: " + value); // Как сюда засунуть F не понятно, если это вообще возможно
ну вот сами-то подумайте... макрос F() размещает строку во флеш. Во флеше по определению не может быть переменных, только константы.
Во-втором случае просто разбейте оператор на два вывода lcd.print
Во-втором случае просто разбейте оператор на два вывода lcd.print
А вот тут я как-то не догадался сразу. Спасибо.
А если обернуть в F только саму строку и к этому конкатенировать переменную?
А если обернуть в F только саму строку и к этому конкатенировать переменную?
Если мы бьемся за экономию оперативной памяти, то так поступать не следует, а если оперативную память экономить не нужно, то и целесообразность использования макроса F() вызывает сомнения.
если оперативную память экономить не нужно, то и целесообразность использования макроса F() вызывает сомнения.
Очень хочется понять аргументацию ? Что по вашему жрет озу, временный буфер для вывода сообщения ?
Да. Стек и куча расположены в одном и том же (весьма незначительном) объеме памяти. Соответственно, когда памяти в обрез, "размашистое" использование стека способно привести к краху программы.
А если обернуть в F только саму строку и к этому конкатенировать переменную?
Такой вариант работать не будет. Ошибка компиляци.
Очень хочется понять аргументацию ? Что по вашему жрет озу, временный буфер для вывода сообщения ?
Использование F() где-то в 15 строках освободило около 200 байт оперативки на Nano, где суммарный размер оперативной памяти 2048 байт. Очень не плохо, если программа большая, если просто мигать светодиодом, то использовать F() или PROGMEM смысла не имеет.
А если обернуть в F только саму строку и к этому конкатенировать переменную?
Это шутка?
На самом деле компилятор пишет объем памяти занимаемый глобальными переменными. А есть еще локальные, которые в какие то моменты времени занимают память, а в какие то - нет. Но могу однозначно утверждать, что хранение текстовых массивов во флеше, при правильном использовали, однозначно улучшают ситуацию с использованием оперативки.
brokly, Вы сами ответили на свой вопрос в посте №5: под константы из PROGMEM надо использовать на месте, не следует создавать в ОЗУ объектов, хотя бы частично дублирующих константы из PROGMEM.