Использование памяти в аналоговом логгере библиотеки SdFat

В файле AnalogBinLogger.ino библиотеки SdFat говорится следующее:

Каждый 512 - байтовый блок данных в файле имеет четырехбайтовый заголовок, за которым следует до 508 байтов данных. (508 значений в 8-разрядном режиме или 254 значения в 10-разрядном режиме). Каждый блок содержит целое число выборок с неиспользуемым пространством в конце блока.

Мне было интересно, почему в 10-битном режиме можно хранить только 254 значения вместо (508*8 бит/ 10 бит ~ 406 значений ).

  1. Связано ли это с тем, что память адресуется к байтам и, следовательно, 10-битное значение занимает 2 байта?
  2. Если да, то как средство чтения файлов будет различать 10-разрядное значение, занимающее 2 байта, и два 8-разрядных значения?
  3. AnalogBinLogger.ino говорит:

Регистратор будет использовать буфер SdFat плюс дополнительные буферы BUFFER_BLOCK_COUNT.

BUFFER_BLOCK_COUNT равен 1 для Arduino Uno, так как у него 2 КБ оперативной памяти. Каждый буфер имеет длину 512 байт. Является ли внутренний буфер SdFat также в SRAM? Если я не ошибаюсь, библиотеки, используемые программой, и программный код находятся во флэш-памяти, может ли SdFat записывать данные в буфер во флэш-памяти?

, 👍0

Обсуждение

да, это потому, что он занимает 2 байта. "10-битный режим" - это 10-битный режим АЦП, источник данных, а не какой-то 10-битный режим файла, @Juraj

@Juraj Если АЦП преобразует аналоговые значения в 10-битное двоичное значение, то почему при записи в файл это значение принимает 16 бит?, @Harini

@Harini: Потому что вы не можете хранить биты в файле. Файл-это последовательность байтов., @Edgar Bonet

это всего лишь пример, а не упражнение в оптимизации или сжатии, @Juraj

@EdgarBonet Конечно, в таком случае, ссылаясь на вторую часть моего вопроса: как считыватель файлов различает 10-битное значение и два 8-битных значения? Вы можете опубликовать его как ответ, чтобы я мог отметить его принятым для этого вопроса., @Harini


1 ответ


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