Альтернатива SoftwareSerial с низким объемом памяти?
Я запускаю программу на ATtiny85 и сталкиваюсь с проблемами из-за нехватки доступной оперативной памяти. Когда я запустил avr-nm
в своем файле ELF, я обнаружил, что SoftwareSerial занимает много оперативной памяти, хотя я просто использую его для установки скорости передачи данных с помощью mySerial.begin(9600);
и нигде больше.
Поэтому мне интересно, есть ли другой способ сделать это, не используя так много памяти:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(0,1);
mySerial.begin(9600);
@Angel Lockhart, 👍4
2 ответа
Лучший ответ:
Проще всего, вероятно, было бы отредактировать вашу копию SoftwareSerial.h
и заменить <code>#define _SS_MAX_RX_BUFF 64</code> в строке
42
чем-то меньшим. Если ваш цикл ()
выполняется достаточно быстро (без задержек, без
блокирующего кода), вам, вероятно, сойдет с рук буферизация всего
нескольких байтов.
Или вы могли бы переписать библиотеку так, чтобы вместо буферизации входящих байтов она передавала их вам для обработки. Смотрите, например , Этот код UART только для приема, основанный на USI -порту, для иллюстрации подхода.
Мой 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
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Выделение строковой памяти Arduino
- Как очистить кучу памяти в esp32
- Есть ли способ подключить оперативную память компьютера к Arduino?
- Последовательная печать из флэш-памяти (F() macro, PROGMEM, sprintf_P, SPTR)
- Как функция/метод может определить, является ли передаваемый массив const PROGMEM (flash) или нет (RAM)?
- Связь AtTiny44 и AtTiny 85
- Считывание байтов из массива PROGMEM
Куда мне пойти, чтобы отредактировать свой файл 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