Манипулирование портами

У моего UNO возникли некоторые проблемы со стабильностью из-за интенсивного использования памяти, поэтому сейчас я оптимизирую код , стремясь уменьшить использование памяти для цифрового чтения с помощью манипуляций с портами. Я получил код для "цифровой записи", но не знаю, как использовать pinMode цифрового чтения (PowerStatus, ВВОД); digitalRead (PowerStatus) Спасибо

, 👍-1

Обсуждение

как прямое управление портом вместо digitalWrite / Read может уменьшить использование динамической памяти?, @Juraj

Вы читали [учебник Arduino по этому предмету] (https://www.arduino.cc/en/Reference/PortManipulation )?, @Edgar Bonet

для оптимизации моего кода, @user2037091

@EdgarBonet да, @user2037091

Итак, вы уже прочитали ответ на свой вопрос. Если вы сообщите нам, какая конкретная часть этого руководства показалась вам непонятной (возможно, добавьте цитату), мы могли бы попытаться помочь устранить путаницу., @Edgar Bonet

меньшее количество кода освободит flash, но не SRAM. даже 100% использование flash не создаст проблем со стабильностью, @Juraj

"Интенсивное использование памяти", как вы выразились, НЕ вызывает "проблем со стабильностью". Что ИМЕННО вы подразумеваете здесь под "проблемами стабильности"? Если вы имеете в виду, что деталь работает ненадежно и перезагружается сама, то, скорее всего, у вас проблема с источником питания. Если бы это действительно помогло, если бы вы отредактировали свой вопрос и точно указали, что вы делаете, какую проблему вы видите и т.д. Общие термины, такие как "стабильность" и "интенсивное использование", на самом деле ничего не значат., @jwh20

Прекратите использовать Строку в своем коде. Это устранит 99% всех проблем со стабильностью памяти., @Majenko


1 ответ


2

Чтобы прочитать контакт, вы просто считываете порт, частью которого является номер pin, а затем маскируете, какой контакт в этом порту вы хотите прочитать.

Например, чтобы прочитать вывод D11, вам нужно прочитать бит 3 порта B.

if (PINB & (1 << 3)) { 
    // HIGH
} else {
    // LOW
}

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

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

Вместо этого вам нужно оптимизировать использование SRAM путем:

  • Убедитесь, что все строковые литералы хранятся в PROGMEM, используя макрос F(), где это уместно
  • Избегайте использования String и вместо этого придерживайтесь char * с предварительно выделенными буферами.
  • Не используйте new и delete или malloc и free, так как это приведет к фрагментации вашей кучи и вызовет нестабильность (это основная проблема со строкой).
,