Путаница в отношении 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?

, 👍9


1 ответ


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

12

почему вы должны помещать свои переменные во флэш-память вместо SRAM

Потому что Arduino имеет только очень небольшой объем памяти. Если у вас есть данные, которые никогда не изменятся, лучше сохранить их во флэш-памяти (которых гораздо больше), чтобы оставить SRAM свободным для данных, которые действительно изменяются.

Кроме того, я не мог понять определение R"====()====", что подразумевается под этим в arduino?

R означает "Обрабатывать все, что находится между этими разделителями, как необработанную строку". То есть все, что находится между "===== (и ) =====". Это не Arduino, а обычная вещь C ++ (см. Здесь). ===== может быть любым, что вам нравится (в определенных пределах), если оно одинаково как в начале, так и в конце строки. Таким образом, вы могли бы использовать R"-=(это "текст")=-", который присвоил бы строке Это "текст". Это отличный способ работы с длинными строками, которые могут содержать " as в противном случае вам пришлось бы экранировать каждое " as \". Таким образом, строка, которую я только что показал, в противном случае должна была бы быть записана как: "Это "текст"", что может стать очень запутанным, если там много ". Важно помнить, что )===== нигде не должно появляться в вашем тексте, поэтому убедитесь, что это что-то действительно непонятное.

,

Большое вам спасибо за терпение, с которым вы помогаете новичкам!, @Mark Estrada

Это относится к более старым архитектурам AVR. Более новые (например, ATmega4809) отображают флэш-память и другие памяти в пространство данных, и нет необходимости в использовании PROGMEM. То же самое относится и к архитектуре ARM - здесь нет PROGMEM, так как нет необходимости копировать переменные const в оперативную память для прямого доступа., @KIIV

В вашем примере, разве R"-= (это "текст") =-" на самом деле не должно быть R"-= (это "текст") - ="? Или я неправильно это понимаю? Это почти как синтаксис HEREDOC, верно?, @bPratik