Путаница в отношении PROGMEM и R"====()===="
Я видел следующий код из https://circuits4you.com/2018/03/10/esp8266-jquery-and-ajax-web-server / но я не мог понять это до конца ...
Я просмотрел документацию PROGMEM из этого https://www.arduino.cc/reference/en/language/variables/utilities/progmem / но не смог понять важность в коде того, почему вы должны помещать свои переменные во флэш-память вместо SRAM (обычная память?)?
const char MAIN_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("p").click(function(){
$(this).hide();
});
});
</script>
</head>
<body>
<p>If you click on me, I will disappear.</p>
<p>Click me away!</p>
<p>Click me too!</p>
<br><hr>
<a href="https://circuits4you.com">circuits4you.com</a>
</body>
</html>
)=====";
Кроме того, я не мог понять определение R"====()====", что подразумевается под этим в arduino?
@Mark Estrada, 👍9
1 ответ
Лучший ответ:
почему вы должны помещать свои переменные во флэш-память вместо SRAM
Потому что Arduino имеет только очень небольшой объем памяти. Если у вас есть данные, которые никогда не изменятся, лучше сохранить их во флэш-памяти (которых гораздо больше), чтобы оставить SRAM свободным для данных, которые действительно изменяются.
Кроме того, я не мог понять определение R"====()====", что подразумевается под этим в arduino?
R
означает "Обрабатывать все, что находится между этими разделителями, как необработанную строку". То есть все, что находится между "===== (
и ) ====="
. Это не Arduino, а обычная вещь C ++ (см. Здесь). =====
может быть любым, что вам нравится (в определенных пределах), если оно одинаково как в начале, так и в конце строки. Таким образом, вы могли бы использовать R"-=(это "текст")=-"
, который присвоил бы строке Это "текст"
. Это отличный способ работы с длинными строками, которые могут содержать "
as в противном случае вам пришлось бы экранировать каждое "
as \"
. Таким образом, строка, которую я только что показал, в противном случае должна была бы быть записана как: "Это "текст""
, что может стать очень запутанным, если там много "
. Важно помнить, что )=====
нигде не должно появляться в вашем тексте, поэтому убедитесь, что это что-то действительно непонятное.
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- Связь Arduino master/slave с использованием RS485
Большое вам спасибо за терпение, с которым вы помогаете новичкам!, @Mark Estrada
Это относится к более старым архитектурам AVR. Более новые (например, ATmega4809) отображают флэш-память и другие памяти в пространство данных, и нет необходимости в использовании PROGMEM. То же самое относится и к архитектуре ARM - здесь нет PROGMEM, так как нет необходимости копировать переменные const в оперативную память для прямого доступа., @KIIV
В вашем примере, разве
R"-= (это "текст") =-"
на самом деле не должно бытьR"-= (это "текст") - ="
? Или я неправильно это понимаю? Это почти как синтаксис HEREDOC, верно?, @bPratik