Альтернатива SoftwareSerial с низким объемом памяти?

Я запускаю программу на ATtiny85 и сталкиваюсь с проблемами из-за нехватки доступной оперативной памяти. Когда я запустил avr-nm в своем файле ELF, я обнаружил, что SoftwareSerial занимает много оперативной памяти, хотя я просто использую его для установки скорости передачи данных с помощью mySerial.begin(9600); и нигде больше.

Поэтому мне интересно, есть ли другой способ сделать это, не используя так много памяти:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0,1);

mySerial.begin(9600);

, 👍4


2 ответа


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

6

Проще всего, вероятно, было бы отредактировать вашу копию SoftwareSerial.h и заменить <code>#define _SS_MAX_RX_BUFF 64</code> в строке 42 чем-то меньшим. Если ваш цикл () выполняется достаточно быстро (без задержек, без блокирующего кода), вам, вероятно, сойдет с рук буферизация всего нескольких байтов.

Или вы могли бы переписать библиотеку так, чтобы вместо буферизации входящих байтов она передавала их вам для обработки. Смотрите, например , Этот код UART только для приема, основанный на USI -порту, для иллюстрации подхода.

,

Куда мне пойти, чтобы отредактировать свой файл SoftwareSerial.h? Кроме того, моя программа работает с камерой, и я использую задержки для отправки тактового импульса, означает ли это, что снижение скорости буферизации не сработает для меня?, @Angel Lockhart

@AngelLockhart: Вероятно, это где-то вроде $ARDUINO_HOME/ hardware/ arduino/ avr / libraries/ SoftwareSerial/ src / SoftwareSerial.h, где $ARDUINO_HOME - это каталог установки Arduino. Вы можете использовать средства поиска вашей операционной системы. Если ваши тактовые импульсы очень короткие (несколько микросекунд или около того), задержки могут быть нормальными. В противном случае вам следует научиться [контролировать тайминги без delay()](https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay )., @Edgar Bonet


-1

Мой ESP8266 случайно зависал каждый раз, когда я использовал SoftwareSerial из framework-arduinoespressif8266 или https://github.com/plerup/espsoftwareserial, из-за слишком низкой памяти.

https://github.com/CrazyRobMiles/Esp8266EdgeSoftwareSerial исправлена эта проблема. Я все еще получаю данные от датчика через SoftwareSerial, и объем оперативной памяти на 4000 байт больше по сравнению с альтернативными реализациями.

,

как это должно помочь в решении проблемы, о которой идет речь?, @Juraj

@Juraj Ну, arduino SoftwareSerial.h каким-то образом требует больше 4000 байт оперативной памяти для передачи буфера в 64 байта (почему ???). Связанная библиотека может использоваться в качестве прямой замены SoftwareSerial и занимает гораздо меньшее место. Теперь я понимаю, что код называется Esp8266EdgeSoftwareSerial и может не выполняться на других архитектурах. Это ваш подразумеваемый вопрос?, @Eric Duminil

Я сомневаюсь, что стандартный SoftwareSerial имеет объем оперативной памяти в 4000 байт, это должно быть что-то другое. В любом случае, OP использует ATtiny85, поэтому ответы для Esp8266 не помогают., @the busybee

@thebusybee: Хорошо, я удалю свой ответ. SoftwareSerial.h, похоже, имеет * огромные * накладные расходы для проектов, над которыми я работаю. Если я включу его и использую, не изменяя никаких других параметров, ESP.getMaxFreeBlockSize () и ESP.getFreeHeap () оба получат огромный удар. Я продолжу расследование и отправлю отчет об ошибке (я не единственный, кто жалуется на использование памяти). Как бы то ни было, вопрос OP все еще нуждается в правильном ответе: принятый ответ ведет к 404 и указывает OP переписать библиотеку. :-/, @Eric Duminil