Эффективная запись значений ADC в файл в скрипте Bash

Я создал небольшой скрипт BASH, чтобы прочитать значение АЦП in0_input и записать его в текстовый файл. Скрипт работает, но мне нужно быть более эффективным.

В настоящее время я могу регистрировать около 100 значений в секунду с моей настройкой.
Что мне нужно, это что-то ближе к 1.000-10.000 значений в секунду.

Если я просто выведу «1» в файл журнала, у меня будет около 3000 значений в секунду, что лучше, но все же не оптимально.
Существуют ли какие-либо возможности для более эффективной реализации сценария путем непосредственного доступа к регистру или исключения операций открытия / закрытия / сохранения файлов и использования каких-либо буферных переменных, или мне нужно C-приложение вместо Bash.

Большое спасибо.

#!/bin/bash
# script to read values
LOG_FILE=/tmp/test_log.txt
exec 3>>${LOG_FILE};

echo "Read ADC in0_input"
while true; do

echo "$(</sys/devices/platform/i2c-gpio.0/i2c-0/0-0049/in0_input)" >&3;
#echo 1 >&3;
done

Поэтому я создал короткую программу на C ++ для этой задачи. К сожалению, у меня все еще есть проблемы с производительностью из-за необходимости открытия и закрытия ADC-файла для чтения новых значений. Значение, сохраненное в файле, меняется с каждым новым образцом, но для получения нового значения мне нужно открыть и закрыть istream в цикле, иначе он примет значение (кэшированное), которое присутствовало при открытии файла перед циклом и сохранить его я раз.
Я пробовал изменчивый, флеш и т. Д., Но не нашел решения.

Открывать и закрывать файл каждый раз, по-видимому, медленно.

Как я могу улучшить это? Спасибо!

#include <iostream>
#include <fstream>
using namespace std;

int values = 0;
unsigned long miliseconds = 0;
//char c;
string value;

int msleep(unsigned long milisec)
{
struct timespec req={0};
time_t sec=(int)(milisec/1000);
milisec=milisec-(sec*1000);
req.tv_sec=sec;
req.tv_nsec=milisec*1000000L;
while(nanosleep(&req,&req)==-1)
continue;
return 1;
}int main () {

cout << "Start logging" << endl;
cout << "Enter number of log values:" << endl;

cin >> values;

cout << "Enter delay between values [ms]:" << endl;

cin >> miliseconds;

ofstream buffer;
buffer.open ("/tmp/test_pilot_out.txt");

ifstream input;for(int i = 1; i <= values; i++) {
input.open ("/tmp/test_pilot_in.txt");
input >> value;
buffer << value << endl;

//other possibility
//     while (input.get(c)) {
//        buffer.put(c);
//      }
input.close();
msleep(miliseconds);
}buffer.close();

cout << "Values saved" << endl;
return 0;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector