Как заставить макрос .print () использовать F () по умолчанию (Arduino) - PullRequest
0 голосов
/ 09 марта 2019

Я обычно использую базовую (аппаратную UART) последовательную связь для отладки во время разработки.Это означает, что большая часть текста snend to print () не будет отправлена ​​в конечном продукте (ограничивается только сообщениями об уровне восстановления).из-за того, что мои отладочные сообщения содержат значительную информацию с множеством вкладок и указанных переменных (и их описаний), я обнаружил, что мой проект с линией 1K5 тратит в несколько раз больше оперативной памяти на сообщения отладки, чем на саму программу.С одной буквой, равной одному байту, 2000 букв - ничто.Большая часть моей не отладочной последовательной связи (в процессе разработки используется программное обеспечение последовательной передачи Tx) и с использованием функции записи, работает с самими байтами и не отправляет фактический текст.(в настоящее время моя рутинная функция и структура последовательной связи использует 6-байтовые блоки, включая адресацию).Кстати, я использую Streaming.h, чтобы ускорить добавление текста к последовательной отправке.Раздражает, что текстовые строки постоянно помещаются в F () каждый разФункция F () замедляет работу устройства, потому что вместо того, чтобы тратить оперативную память в глобальном масштабе, она читает ее из флэш-памяти каждый раз, когда она используется, и без нее мои отладочные сообщения используют слишком много SRAM (arduino загружает их как глобальные переменные) Есть ли способ заставить print () использовать функцию F () без редактирования библиотеки Wire.h? (что помешало бы мне автоматически обновлять файлы заголовков)

1 Ответ

0 голосов
/ 11 марта 2019

Вы должны использовать F() для хранения текста во флэш-памяти, вы не можете избежать этого.

Вы можете определить макрос:

#define FPRINT(x) print(F(x))

Serial.FPRINT("text");

Или даже так:

#define SFPRINT(x) Serial.print(F(x))

SFPRINT("test");

Конечно, вы можете заменить FPRINT на то, что вы хотите, это не предопределено (в этом случае вы получите предупреждение компилятора).

Вы также можете использовать функцию printf_P из <stdio.h> и PSTR макрос из <avr/pgmspace.h> (по умолчанию они должны быть включены в вашу программу в Arduino IDE) .

Типичное использование с текстом, хранящимся в ОЗУ:

int a = 5;
printf("This is my variable: %d", a);

Результат:

Sketch uses 1946 bytes (6%) of program storage space.
Global variables use 39 bytes (1%) of dynamic memory

Использовать с текстом, хранящимся во FLASH:

int a = 5;
printf_P(PSTR ("This is my variable: %d"), a);

Результат:

Sketch uses 1958 bytes (6%) of program storage space.
Global variables use 15 bytes (0%) of dynamic memory
...