Использование памяти в аналоговом логгере библиотеки SdFat
В файле AnalogBinLogger.ino библиотеки SdFat говорится следующее:
Каждый 512 - байтовый блок данных в файле имеет четырехбайтовый заголовок, за которым следует до 508 байтов данных. (508 значений в 8-разрядном режиме или 254 значения в 10-разрядном режиме). Каждый блок содержит целое число выборок с неиспользуемым пространством в конце блока.
Мне было интересно, почему в 10-битном режиме можно хранить только 254 значения вместо (508*8 бит/ 10 бит ~ 406 значений ).
- Связано ли это с тем, что память адресуется к байтам и, следовательно, 10-битное значение занимает 2 байта?
- Если да, то как средство чтения файлов будет различать 10-разрядное значение, занимающее 2 байта, и два 8-разрядных значения?
- AnalogBinLogger.ino говорит:
Регистратор будет использовать буфер SdFat плюс дополнительные буферы BUFFER_BLOCK_COUNT.
BUFFER_BLOCK_COUNT
равен 1 для Arduino Uno, так как у него 2 КБ оперативной памяти. Каждый буфер имеет длину 512 байт. Является ли внутренний буфер SdFat также в SRAM? Если я не ошибаюсь, библиотеки, используемые программой, и программный код находятся во флэш-памяти, может ли SdFat записывать данные в буфер во флэш-памяти?
@Harini, 👍0
Обсуждение1 ответ
как средство чтения файлов будет различать 10-битное значение, принимающее 2 байт и два 8-битных значения?
Файл AnalogBinLogger.h, который поставляется с упомянутым вами примером скетча , содержит следующее:
// First block of file.
struct metadata_t {
unsigned long adcFrequency; // ADC clock frequency
unsigned long cpuFrequency; // CPU clock frequency
unsigned long sampleInterval; // Sample interval in CPU cycles.
unsigned long recordEightBits; // Size of ADC values, nonzero for 8-bits.
unsigned long pinCount; // Number of analog pins in a sample.
unsigned long pinNumber[123]; // List of pin numbers in a sample.
};
Таким образом, читателю файлов просто необходимо знать формат этого первого
блока и прочитать поле recordEightBits, чтобы узнать, являются ли
это 8-битными данными или нет.
Буфер SdFat также находится в SRAM?
Да, это единственное разумное место, где у вас может быть буфер данных. Он
выделяется в стекетолько во время выполнения функции
LogData ()
.
Это "четырехбайтовый заголовок", упомянутый в AnalogBinLogger.ino, который я процитировал в своем вопросе? Но ясно, что этот заголовок составляет 24 байта., @Harini
@Harini: Нет, это первый блок файла. Он имеет длину 512 байт, а не 24. Четырехбайтовый заголовок, который вы упомянули, находится в каждом блоке, кроме первого., @Edgar Bonet
Вы правы, извините меня за то, что я не учел 123 элемента в pinNumber
. Было бы полезно, если бы вы могли прояснить третью часть вопроса об использовании SRAM и флэш-памяти., @Harini
Да, строка кода, выделенная в приведенной ссылке, является дополнительным буфером, используемым SdFat. В скетче упоминается использование [sdfat's internal buffer](https://github.com/greiman/SdFat/blob/3b79f38cb554809a45a0ccd6d9d6752b6ad948c2/examples/AnalogBinLogger/AnalogBinLogger.ino#L92) и мой вопрос в том, находится ли это тоже в SRAM., @Harini
- Глобальные переменные занимают много места в динамической памяти.
- Пытаюсь прошить ESP8266 с помощью Arduino UNO
- Arduino EEPROM сохраняет старые данные после прошивки новой программой
- Светодиод Arduino мигает одним нажатием кнопки
- Как уменьшить использование памяти в коде?
- Вспомогательный объект Flash String в качестве переменной
- Как функция/метод может определить, является ли передаваемый массив const PROGMEM (flash) или нет (RAM)?
- Выделение памяти указателя в функции
да, это потому, что он занимает 2 байта. "10-битный режим" - это 10-битный режим АЦП, источник данных, а не какой-то 10-битный режим файла, @Juraj
@Juraj Если АЦП преобразует аналоговые значения в 10-битное двоичное значение, то почему при записи в файл это значение принимает 16 бит?, @Harini
@Harini: Потому что вы не можете хранить биты в файле. Файл-это последовательность байтов., @Edgar Bonet
это всего лишь пример, а не упражнение в оптимизации или сжатии, @Juraj
@EdgarBonet Конечно, в таком случае, ссылаясь на вторую часть моего вопроса: как считыватель файлов различает 10-битное значение и два 8-битных значения? Вы можете опубликовать его как ответ, чтобы я мог отметить его принятым для этого вопроса., @Harini