Увеличить частоту выполнения цикла

segriv
Offline
Зарегистрирован: 26.04.2022

Всем привет.

Собираю логгер, на основе Arduino DUE и нескольких датчиков.

Сначала разобрался с приёмом данных с датчиков и несложных расчётов. На эти манипуляции цикл программы тратит 800-1000 мкс. 

Потом из примеров я прикрутил логгирование этих данных на SD карту и временные затраты увеличились до немыслимых 26000-30000 мкс. Оставил запись на ночь и ,с ростом файла, увеличивалось и время выполнения вплоть до 60000 мкс. 

 

Подскажите, как правильно записывать данные на карту, чтобы время основного цикла не увеличивалось так быстро ? Я так понимаю, что записывать нужно данные не каждый цикл, а через какое-то количество циклов или нет ?

b707
Offline
Зарегистрирован: 26.05.2017

Код показывайте.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

segriv пишет:

Потом из примеров я прикрутил логгирование этих данных на SD карту и временные затраты увеличились до немыслимых 26000-30000 мкс. Оставил запись на ночь и ,с ростом файла, увеличивалось и время выполнения вплоть до 60000 мкс. 

0.06 секунды на запись?

Это нормально.

Цитата:

Подскажите, как правильно записывать данные на карту, чтобы время основного цикла не увеличивалось так быстро ? Я так понимаю, что записывать нужно данные не каждый цикл, а через какое-то количество циклов или нет ?

Только отказываться от FAT и разрабатывать специально для своего случая собственную файловую систему.

Но для начала можете попробовать накапливать данные в буфере ровно по 512 байт и писать исключительно такими порциями.

rkit
Offline
Зарегистрирован: 23.11.2016

Очевидно нужен процессор значитеьно быстрее, если хочишь писать логи за десятки мкс.

segriv
Offline
Зарегистрирован: 26.04.2022

В лог писать мне и 10Гц хватит, а вот выполнение основного цикла получения данных с датчиков и простые расчеты хотелось бы 1кГц

b707
Offline
Зарегистрирован: 26.05.2017

segriv пишет:
В лог писать мне и 10Гц хватит, а вот выполнение основного цикла получения данных с датчиков и простые расчеты хотелось бы 1кГц

значит надо так переписывать программу. чтобы запись на карту не блокировала считывание датчиков

segriv
Offline
Зарегистрирован: 26.04.2022

Как это можно сделать, если все процессы в одном цикле происходят?

b707
Offline
Зарегистрирован: 26.05.2017

segriv пишет:
Как это можно сделать, если все процессы в одном цикле происходят?

очевидно, писать на карту не в каждом "обороте" цикла, а, например, раз в сто оборотов... а еще правильнее - по времени. Изучайте миллис

segriv
Offline
Зарегистрирован: 26.04.2022

Это прерывания? Или считаем итерации и на каждую 100-ю кидаю данные на карту?

b707
Offline
Зарегистрирован: 26.05.2017

Считайте данные, как набралось 512 байт - пишите

rkit
Offline
Зарегистрирован: 23.11.2016

segriv пишет:
В лог писать мне и 10Гц хватит, а вот выполнение основного цикла получения данных с датчиков и простые расчеты хотелось бы 1кГц

И чего ты тогда страдаешь, вместо того, чтобы делать так, как написал?

segriv
Offline
Зарегистрирован: 26.04.2022

Боюсь, что цикл, в котором будет производиться запись, выполнится не за 1 мс, а за 25 мм. Как сделать, чтобы такого не происходило не знаю, опыта мало(

b707
Offline
Зарегистрирован: 26.05.2017

segriv пишет:
Как сделать, чтобы такого не происходило не знаю, опыта мало(

для этого надо использовать неблокирующую запись на карту. Но тут надо разбираться - умеет ли так библиотека SD и возможно ли это в принципе.  Может оказаться. что это вообще невозможно - тогда придется смирится с тем, что запись занимает сколько занимает

rkit
Offline
Зарегистрирован: 23.11.2016

b707 пишет:

тогда придется смирится с тем, что запись занимает сколько занимает

тогда придется делать #3

segriv
Offline
Зарегистрирован: 26.04.2022

Понял, спасибо, попробую.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

segriv пишет:
Как это можно сделать, если все процессы в одном цикле происходят?

ESP32, там два ядра, запись перенести на 0 ядро видимо, да и частота там 240mhz