Прогемем

Миссис
Чт, 07 января 2016 г., 21:30
Может ли кто -нибудь сказать мне, можно ли использовать Progmem, известную из проекта ESP8266 (ESP8266Webserver)?

const char page_networkconfiguration [] progmem = r "===== (
<!Doctype html>
<HTML>
<голова>

</голова>
<тело>
привет!
</тело>

</html>
) ===== ";

Martinayotte
Чт, 07 января 2016 г., 22:47
Да, если вы имеете в виду на ESP8266, но вам нужно отправить его, используя правильные функции, send_p () или sendcontent_p (), а не варианты без _p, потому что Progmem необходимо обрабатывать правильно.
Для STM32 я никогда не пробовал.

Mrburnette
Пт 08 января 2016 12:40
Martinayotte написал:Да, если вы имеете в виду на ESP8266, но вам нужно отправить его, используя правильные функции, send_p () или sendcontent_p (), а не варианты без _p, потому что Progmem необходимо обрабатывать правильно.

Для STM32 я никогда не пробовал.

Стевех
Пт 08 января 2016 г. 3:00 утра
Сегодняшний ARM GCC, и, вероятно, вариант для CPU ESP8266 ', не являющегося ARM, и с AVRS вы можете сделать портативный C-код

вместо char* msg1[] PROGMEM = {"~Maple Mini~> Serial Mon> SD Check ~> I2C Scan ` Press AnyKey"

Martinayotte
Пт 08 января 2016 г. 3:03
@Ray, вероятно, вы не знаете, что Send_P () и sendContent_p () делает для передачи огромных строк ProgMem по TCP с помощью ESP8266Webserver ...
Основная проблема - Ram ! Если у вас есть Progmem, которая, скажем, JPG с размером 64 тыс. Вы не хотите иметь все эти байты, скопированные в Ram, чтобы сделать передачу TCP (либо HTTP, либо что -то еще). Он должен передаваться кусочками, такими как размер пакета ESP MTU 1640, но непосредственно от Flash.
Итак, когда я сказал: «Для STM32, я никогда не пробовал."Это потому, что мне никогда не нужно делать такие вещи, особенно что ESP82666Webserver никогда не переносился на STM32 ;) . Хотя это может быть хорошей идеей для нового проекта ... :)

Миссис
Пт 08 января 2016 г., 9:35 утра
Конструкция ниже отличается от Arduino Standard Progmem, потому что контент может быть записан без кавычек.
const char page_networkconfiguration [] progmem = r "===== (
<!Doctype html>
<HTML>
<голова>

</голова>
<Body Class = "Bodyclass">
привет!
</тело>

</html>
) ===== ";

Это стандартная конструкция Arduino (содержание должно быть завернуто в цитаты):

const char page_networkconfiguration [] progmem = {"
<!Doctype html>
<HTML>
<голова>

</голова>
<Body Class = \ "Bodyclass \">
привет!
</тело>

</html>
"};

Итак, вопрос в том, что если можно сделать аналогичную конструкцию Progmem, как в ESP8266: длинная строка без кавычек.

Mrburnette
Пт 08 января 2016 г., 13:09
Mrsupe написала:Конструкция ниже отличается от Arduino Standard Progmem, потому что контент может быть записан без кавычек.
const char page_networkconfiguration [] progmem = r "=====(
...
)=====";

Итак, вопрос в том, что если можно сделать аналогичную конструкцию Progmem, как в ESP8266: длинная строка без кавычек.

Миссис
Пт 08 января 2016 г. 13:57
Я говорю об этой конструкции в ардуиноиде. Я использую Arduinoide с ESP8266...

Rogerclark
Пт 08 января 2016 г., 19:58
Глупый вопрос... Но как это относится к STM32.

Если это вопрос ESP8266, вам, вероятно, было бы лучше отправить на форум для ESP8266

В общем, я больше не использую директивы Progmem или F/ макросы, так как я почти не использую устройства AVR.

На самом деле я нахожу в ESP8266, что у меня возникают странные проблемы при использовании макроса F при отправке данных через TCP, поэтому, когда недавно перенес код AVR в ESP8266, я удалил все макросы F.

Миссис
Пт 08 января 2016 г., 8:19 вечера
это общий вопрос...
Я пытаюсь перенести ESP8266Webserver в ST32. Я хотел бы быть как можно более совместимым.
Более того, я думаю, это отличная идея, чтобы PROGMEM работал, как указано выше (не нужно использовать Quotation).

Еще один вопрос: какие большие куски я могу использовать для передачи строк через TCP с ST32?

Martinayotte
Пт 08 января 2016 г., 21:49
Я не эксперт по сети, но магическое число 1460, которое я написал выше, не связан с каким -либо ЦП, но является довольно стандартным значением на любых платформах.

Стевех
Сб 09 января 2016 12:47
Mrsupe написала:это общий вопрос...
Я пытаюсь перенести ESP8266Webserver в ST32. Я хотел бы быть как можно более совместимым.
Более того, я думаю, это отличная идея, чтобы PROGMEM работал, как указано выше (не нужно использовать Quotation).

Еще один вопрос: какие большие куски я могу использовать для передачи строк через TCP с ST32?

Rogerclark
Сб 09 января 2016 г. 2:44
Стевех написал:Но Progmem - это N/A для ESP8266 и STM32. Это применимо только к архитектурам Гарвард, как AVR.

Martinayotte
Сб 09 января 2016 г. 14:16
Простой поиск с Progmem не раскрывает все под капюшоном.
Я не знаю всех механиков в деталях, но все о использовании Flash напрямую, не вводя ее в кеш ОЗУ, что полезно в случае огромных данных.
Поскольку Flash является внешним SPI на ESP8266, существуют такие функции, как memcpy_p (), strcpy_p (), strlen_p и т. Д. Чтобы получить доступ к байтам, словам и т. Д. Thru Macros pgm_read_byte (), pgm_read_word () и т. д. который заботится о решении выравниваний.

Конечно, на STM32 все то, что механики могут быть удалены, но, возможно, это хорошая идея, чтобы сохранить некоторые макросы просто иметь совместимый код приложения.

Стевех
Сб 09 января 2016 г., 19:05
На основанной на руке командная строка компилятора GCC и .H файлы и так далее, причина макрос F (x) - NOP, а все xxx_p () также кодируются в N/A.ESP8266 и STM32F могут/должны сделать то же самое.

Конечно, чтобы избежать постоянных копий в Flash, скопированной в RAM в качестве инициализированных переменных, вы должны объявить такие переменные с помощью атрибута «const», а не Progmem. Текущий Arduino для AVR также будет работать, с этим изменением.

Mrburnette
Солнце 10 января 2016 г., 19:19
Стевех написал: <...>
Электрический ток Arduino для AVR Также будет работать с этим изменением.

Стевех
Пн 11 января 2016 г., 8:54 вечера
Поиск на этой странице для упоминания макроса f (). https: // www.PJRC.com/teensy/arduino_contrib.HTML

Для рук и других традиционных MCUS Space Space Space и процессоров, это не нужно, но для ARM есть «NOP», как макрос
#define f (x) x

Так что компиляция для целей ARM может игнорировать макрос f ()

Эта веб-страница наполовину неверно говорит "...Потому что компилятор по умолчанию распределяет строки в ОЗУ ..."
Более правильно, инициализированная переменная, которая нет объявлен как констант (или то же самое с использованием макроса ProgMem или F () для строк) хранится во флэш -памяти и копируется в RAM кодом запуска C.

На Гарвардской архитектуре, таких как AVR (и PIC), Flash и RAM являются отдельными адресными пространствами, а для чтения данных необходимы специальное код в Flash.

Меню Arduino 3.0