Я пишу специальную прошивку для SparkFun Logomatic V2, которая записывает двоичные данные в файл на карте памяти microSD объемом 2 ГБ. Размер файла данных будет варьироваться от 100 МБ до 1 ГБ.
Формат двоичных данных постоянно меняется по мере развития микропрограммы платы (фактически она будет динамически реконфигурируемой во время выполнения). Вместо того, чтобы создавать и поддерживать отдельную программу декодера / преобразователя для каждой версии прошивки / конфигурации, я бы предпочел сделать файлы данных автоматически конвертируемыми в формат CSV, запустив файл данных с помощью скрипта Bash, который записывается в файл данных. до начала записи данных.
Я знаю, как создать Here Document, но я подозреваю, что Bash не сможет быстро проанализировать и преобразовать гигабайт двоичных данных, поэтому я бы хотел, чтобы процесс выполнялся намного быстрее, если скрипт сначала скомпилирует немного C код (предположим, что GCC присутствует и находится в пути), затем запустите получившуюся программу, передав двоичные данные в стандартный ввод.
Чтобы конкретизировать проблему, предположим, что микропрограмма создаст двоичные данные, состоящие из 4 16-разрядных целочисленных значений: метка времени (без знака), за которой следуют 3 оси акселерометра (со знаком). Разделителя между записями нет (в основном потому, что я насыщаю интерфейс SPI для карты uSD).
Итак, я думаю, что мне нужен скрипт с ДВУМЯ документами: один для кода C (параметризованный расширенными переменными Bash), а другой для двоичных данных. Вот где я до сих пор:
#! env bash
# Produced by firmware version 0.0.0.0.0.1 alpha
# Configuration for this data run:
header_string = "Time, X, Y, Z"
column_count = 4
# Create the converter executable
# Use "<<-" to permit code to be indented for readability.
# Allow variable expansion/substitution.
gcc -xc /tmp/convertit - <<-THE_C_CODE
#include <stdio.h>
int main (int argc, char **argv) {
// Write ${header_string} to stdout
while (1) {
// Read $(column_count} shorts from stdin
// Break if EOF
// Write $(column_count} comma-delimited values to stdout
}
// Close stdout
return 0;
}
THE_C_CODE
# Pass the binary data to the converter
# Hard-quote the Here tag to prevent subsequent expansion/substitution
/tmp/convertit >./$1.csv <<'THE_BINARY_DATA'
...
... hundreds of megabytes of semi-random data ...
...
THE_BINARY_DATA
rm /tmp/convertit
exit 0
Это выглядит правильно? У меня пока нет реального файла данных, чтобы проверить это, но я хотел проверить идею, прежде чем идти дальше.
Будет ли Bash жаловаться на отсутствие пропущенных строк? Это может произойти, если захват данных неожиданно прекратится из-за удара током, который приведет к разрядке аккумулятора или карты USB. Или если прошивка не работает.
Есть ли более быстрый или лучший метод, который я должен рассмотреть? Например, мне интересно, будет ли Bash слишком медленно копировать двоичные данные так быстро, как их может использовать программа C: Должна ли программа C открывать файл данных напрямую?
ТИА
-BobC