Возможно ли использовать макрос F() с целыми и другими типами переменных?

У меня есть скетч, который использует очень много оперативной памяти моего Atmega2560 (это гигантский проект), и мне нужно использовать различные «println», потому что у меня TFT-экран, и мне нужно отображать данные на экране для просмотра пользователем. Итак, я использую макрос F(), чтобы использовать меньше оперативной памяти (пример: Serial.println("Привет, Наруто-кун") to Serial.println(F("Привет, Наруто-кун")). Но это работает, только если данные, введенные в F(), были в Const String, когда мне нужно, например, показать массив целых чисел, ничего не работает.

Пример:

tft.print(F(mediaTotPg[1]));

Это не работает, потому что mediaTotPg является целочисленным массивом и возвращаемые ошибки:

" #define F(string_literal) (reinterpret_cast(PSTR(string_literal))) "

Наконец, возможно ли показывать целые числа, не являющиеся константами, с помощью макроса F()?

, 👍0


2 ответа


Лучший ответ:

1

Для постоянного массива целых чисел необходимо использовать PROGMEM и различные функции pgm_read_*().

Подробнее и найти примеры можно в руководстве Arduino PROGMEM. страница.

,

Только константный массив?, @luke cross

Да. Вы не можете ничего изменить в PROGMEM, поэтому он должен быть константным. Это не обязательно должен быть массив, вы можете использовать одиночные значения, но это не имеет смысла, поскольку, если они константны, компилятор все равно оптимизирует их во встроенные литералы., @Majenko


1

F() помещает постоянный строковый литерал во флеш-часть вашего устройства. Таким образом, он не использует пространство ОЗУ, необходимое в противном случае.

Но ваш массив mediaTotPg, скорее всего, (вы ничего не сказали об этом) является переменной, отличной от const, и не может быть помещен во флэш-память.

Если отображаемые значения на самом деле являются const, вам необходимо поместить их во флэш-память. Как кратко указано в ответе Маженко, вам нужно использовать раздел PROGMEM для значений, как описано на страница PROGMEM Arduino.

Ответ на ваш вопрос: Нет, макрос F() нельзя использовать с любым типом переменной, отличной от const, и его нельзя использовать для любого другого типа, кроме строкового литерала.

,