Работа с буферами по прерываниям в реальном времени

прием, с помощью которого можно превращать любые данные в любые другие, только неизвестно, в какие
 
1 2 3 4

AXT

инженер вольнодумец


SashaMaks> Скачки - это ожидание записи буфера на флешку, размер которого, как известно для файловой системы FAT, не может быть меньше 512 байт.

Ну так сделай пинг-понг: два буфера, один заполняется, второй на флешку. Классика же.
 13.0.782.22013.0.782.220
+
-
edit
 

SashaMaks
SashaPro

аксакал

SashaMaks>> Скачки - это ожидание записи буфера на флешку, размер которого, как известно для файловой системы FAT, не может быть меньше 512 байт.
AXT> Ну так сделай пинг-понг: два буфера, один заполняется, второй на флешку. Классика же.

Так не получится. Не хватает именно ресурсов процессора, чтобы так быстро записывать информацию. Идеально было бы применить DMA, но для XMega я пока не умею этого делать, да и не хочу. Можно было бы попробовать переписать драйвер записи данных на флеш носитель под себя и даже закрутить от него алгоритм работы всей программы, но это долго и много кода нужно переворотить, что тоже неохота делать.

Пока оценил лишь возможности записи на флешку от XMega, тянет примерно на 4МБайта/сек, что соответствует предельной скорости процессора в 32МГц. Т.е это только примерно 4000Гц данных в 2-х байтовом типе можно сейчас позволить себе, чего мне пока и хватит. Остальное буду делать уже на STMе...

AXT

инженер вольнодумец

SashaMaks> 4МБайта/сек, ...примерно 4000Гц данных в 2-х байтовом типе

Немыслимо мало. Такого просто не должно быть. Разница в 500 раз :eek:
Код посмотреть можно?
 13.0.782.22013.0.782.220
+
-
edit
 

SashaMaks
SashaPro

аксакал

AXT> Немыслимо мало. Такого просто не должно быть. Разница в 500 раз :eek:

Так это и есть разница в 512 байт записи буфера. Так работает драйвер. Переписывать его я не собираюсь, так как на STMe буду делать через DMA, проц мне ещё будет для другого нужен там.

AXT

инженер вольнодумец

SashaMaks> Так это и есть разница в 512 байт записи буфера. Так работает драйвер.

То есть, всё, весь код в общем цикле? А что мешает запускать запись в общем, а цифровать в прерываниях, например? Или наоборот? Или вообще всё в прерываниях, кроме математики?
 13.0.782.22013.0.782.220
+
-
edit
 

SashaMaks
SashaPro

аксакал

AXT> То есть, всё, весь код в общем цикле?
AXT> А что мешает запускать запись в общем, а цифровать в прерываниях, например? Или наоборот? Или вообще всё в прерываниях, кроме математики?

Не важно в каком цикле, считает только один проц, другого нет.
Прерывания в этом случае не помогут. Это делается с помощью DMA и только его прерываний. Это и есть что-то вроде 2-го проца, который только одно умеет делать - копировать память, не обременяя ядро.
+
+1
-
edit
 

AXT

инженер вольнодумец

SashaMaks> Не важно в каком цикле, считает только один проц, другого нет.

И что? Каким тобразом это мешает одновременно цифровать и писать на карту? Программный SPI что ли? У атмеги он вроде аппаратный есть.

SashaMaks> Прерывания в этом случае не помогут.

Тут я ещё меньше понимаю ситуацию, поскольку сам такое писал (на другм проце, правда), и у меня они замечательно помогали.

SashaMaks> Это делается с помощью DMA и только его прерываний. Это и есть что-то вроде 2-го проца, который только одно умеет делать - копировать память, не обременяя ядро.

Я знаю, что такое DMA. Более того, на моей совести есть многоканальный (x8 с системой приоритетов) контроллер DMA, сделанный в кремнии. Успешно.
 13.0.782.22013.0.782.220
+
+1
-
edit
 

AXT

инженер вольнодумец

SashaMaks> Так не получится. Не хватает именно ресурсов процессора, чтобы так быстро записывать информацию.

И вообще, некоторым почему-то хватает. Вот примерчик: древняя ATMega88, 8 бит, 20 МГц. Чисто программный синтез звука и изображения, ни видеоадаптера, ни аудиоадаптера просто нет.
Наслаждайся:
 13.0.782.22013.0.782.220
+
-
edit
 

SashaMaks
SashaPro

аксакал

AXT> И что? Каким тобразом это мешает одновременно цифровать и писать на карту? Программный SPI что ли? У атмеги он вроде аппаратный есть.

Ты значения пишешь из памяти в некий ISP. Тут могут быть только два пути: через проц или через DMA. Аппаратный ISP ничего не даст без работы DMA для разгрузки проца, так как только DMA (контроллер прямого доступа к памяти) имеет прямой доступ к памяти, всё остальное только через проц.

AXT> Тут я ещё меньше понимаю ситуацию, поскольку сам такое писал (на другм проце, правда), и у меня они замечательно помогали.

Чего помогали? Прерывания помогают только избавиться собственного программного цикла опроса, а не разгрузить проц. У меня сейчас всё и так на прерываниях работает и проц на 100% загружен если пишет на 4МБ/с.

Прерывание - это всего лишь прерывание работы проца по команде с переферии и все. Если ты будешь 4000 раз прерывать работу XMega, а потом писать 512 значений 2-х байтового типа, то каждый раз после прерывания где-то 8192 такта процессора будет уходить на отправку данных из памяти в ISP. Быстрей просто частоты не хватит. Итого где-то 32 000 000 такта в сек.
+
-
edit
 

SashaMaks
SashaPro

аксакал

AXT> Успешно.

Надеюсь, ты ещё не забыл, что вопрос не в успешности и не в работоспособности, а в том, чтобы были равные промежутки времени без задержек полученных записанных данных с АЦП?

AXT

инженер вольнодумец

SashaMaks> Чего помогали?

Прерывания позволяют делать полезную работу, а не сидеть в цикле.

SashaMaks> ... а потом писать 512 значений 2-х байтового типа, то каждый раз после прерывания где-то 8192 такта процессора будет уходить на отправку данных из памяти в ISP.

Да почему после-то? Я не понимаю. В фоне, а не после. Или ты в прерывании посылаешь весь блок чтоли???
 13.0.782.22013.0.782.220
+
-
edit
 

SashaMaks
SashaPro

аксакал

AXT> В фоне, а не после.

Что такое "в фоне"? Аппаратно расскажи мне?

Xan

координатор

AXT>> В фоне, а не после.
SashaMaks> Что такое "в фоне"?

В потоке заднего плана.

Background thread.
 

SashaMaks
SashaPro

аксакал

Xan> В потоке заднего плана.
Xan> Background thread.

Аппаратно это как выглядит? Какое устройство отвечает за это?
+
+1
-
edit
 

Xan

координатор

SashaMaks> Аппаратно это как выглядит? Какое устройство отвечает за это?

Это не про "аппаратно", это про устройство операционной системы реального времени.

По прерываниям от таймера надо брать значение из АЦП и совать его в софтовый буфер FIFO.
И запускать новое измерение.
Получится всего десяток команд.
Это будет foreground.

А в фоне брать из буфера и записывать во флешку.

Буфер достаточной ёмкости, кольцевой, с указателями на первый и последний байты в буфере.
Ну и прерывания и таймер правильно настроить.

Это всё классика из учебника.
 

SashaMaks
SashaPro

аксакал

Xan> Это не про "аппаратно", это про устройство операционной системы реального времени.

Нет никакой операционной системы у МК.

Xan> По прерываниям от таймера надо брать значение из АЦП и совать его в софтовый буфер FIFO.

Что такое "софтовый буфер" в аппаратном выражении? Где он находится?

Xan> А в фоне брать из буфера и записывать во флешку.

А где буфер находится?

Xan> Ну и прерывания и таймер правильно настроить.

Какие прерывания?

Xan> Это всё классика из учебника.

Ну почти уже, ещё чуть-чуть осталось, только назвать необходимое для работы всего этого одно устройство.

Xan

координатор

SashaMaks> Нет никакой операционной системы у МК.

Это ты мне рассказываешь?

Это у тебя в голове нет операционки для МК.
Отсюда твои проблемы.

Ты слишком агрессивно настроен ко всему чужому.
Всегда.
Как думаешь, приятно для тебя что-нибудь рассказывать?

Возьми какой-нибудь древний учебник по операционным системам и вникни.
Самостоятельно.
 

SashaMaks
SashaPro

аксакал

Xan>> По прерываниям от таймера надо брать значение из АЦП и совать его в софтовый буфер FIFO.
Что такое "софтовый буфер" в аппаратном выражении? Где он находится?
Xan>> А в фоне брать из буфера и записывать во флешку.
А где буфер находится?
Xan>> Ну и прерывания и таймер правильно настроить.
Какие прерывания?
Xan>> Это всё классика из учебника.
Ну почти уже, ещё чуть-чуть осталось, только назвать необходимое для работы всего этого одно устройство.

SashaMaks
SashaPro

аксакал

Xan> А в фоне брать из буфера и записывать во флешку.

Какое устройство будет выполнять запись во флешку?
RU SashaMaks #18.12.2014 22:24  @SashaMaks#17.12.2014 15:13
+
-
edit
 

SashaMaks
SashaPro

аксакал

SashaMaks> Пока оценил лишь возможности записи на флешку от XMega, тянет примерно на 4МБайта/сек, что соответствует предельной скорости процессора в 32МГц. Т.е это только примерно 4000Гц данных в 2-х байтовом типе можно сейчас позволить себе, чего мне пока и хватит. Остальное буду делать уже на STMе...

Немного ошибся, запамятовал тут Топлива на нитрате натрия. [SashaMaks#03.12.14 14:41] результаты своего тестирования: "Всё ещё усугубляется 8 битностью XMegи, ей для этого нужно в общем случае где-то до 6000 тактов!"

4000Гц записанных данных - то, что примерно получилось по факту при последовательной равномерной записи одного не суммированного измерения с АЦП. Поскольку на флешку отсылается буфер объёмом 512 байт (2 байта - измеренное значение с АЦП и 510 пустых байт), то максимально возможная скорость записи на флешкарту на ATXMega составляет где-то 2МБ/с. Другие 2МБ/с съедаются 8-битностью контроллера.

Невозможность реализации большей частоты записи данных на флешкарту, чем 4000Гц обусловлена недостаточной скоростью работы ЦП. Чтобы записывать все 200кГц данных с АЦП в таком режиме без DMA нужна частота ЦП равная примерно 1600МГц. В противном случае возникнут задержки во времени, как это было видно на приведенных мной графиках. Именно 1600МГц будет достаточно, чтобы между каждым измерением АЦП проходило 8000 тактов, необходимых для осуществления записи буфера данных на флешку.

Прошу не путать потребные частоты 32МГц и 1600МГц. Им соответсвуют разные условия записи данных с помощью ЦП.

Запись с частотой 32МГц может дать скорость записи до 2МБ/с, но данные будут записаны с неравными временными промежутками. Это абсолютно не важно для просто записи файловых данных.

Запись с частотой 1600МГц даёт запись данных всех 200кГц значений АЦП с равными промежутками времени. Это абсолютно важно для записи измеренных во времени данных с равными промежутками времени.

AXT

инженер вольнодумец

SashaMaks> Поскольку на флешку отсылается буфер объёмом 512 байт (2 байта - измеренное значение с АЦП и 510 пустых байт), ...

А надо отсылать буфер на 512 байт с 512 байтами данных. И тогда всё будет хорошо.

SashaMaks> Другие 2МБ/с съедаются 8-битностью контроллера.

Как это? Почему это?

SashaMaks> Запись с частотой 1600МГц даёт запись данных всех 200кГц значений АЦП с равными промежутками времени. Это абсолютно важно для записи измеренных во времени данных с равными промежутками времени.

Не важно. Подумай, почему. Подсказка: попробуй построить контраргумент. С доказательством.
Ещё одна подсказка: [показать]
 13.0.782.22013.0.782.220

AXT

инженер вольнодумец

SashaMaks> Какое устройство будет выполнять запись во флешку?

Атмега, кто же ещё. Точнее, её программа с помощью аппаратных ресурсов атмеги..
 13.0.782.22013.0.782.220
+
+1
-
edit
 

AXT

инженер вольнодумец

Xan>> А в фоне брать из буфера и записывать во флешку.
SashaMaks> А где буфер находится?

В оперативной памяти. unsigned short PingPongBuffer[256*2];

SashaMaks> Xan>> Ну и прерывания и таймер правильно настроить.
SashaMaks> Какие прерывания?

По которым ты читаешь АЦП.

SashaMaks> Ну почти уже, ещё чуть-чуть осталось, только назвать необходимое для работы всего этого одно устройство.

Процессор.
 13.0.782.22013.0.782.220
+
-
edit
 

SashaMaks
SashaPro

аксакал

AXT> А надо отсылать буфер на 512 байт с 512 байтами данных. И тогда всё будет хорошо.

Не будет. Будет то, что было на вот этих графиках:

Топлива на нитрате натрия. [SashaMaks#02.12.14 00:26]

Такого в книжках не напишут! ))) Поскольку сейчас оверсэмплинг снят, есть куча данных, которые раньше пропадали безвозвратно. Незначительное повышение точности по оси Y стоило большой потери точности по оси X, в итоговой сумме точность измерения в двумерной системе измерений X-Y уменьшалась. Но теперь данных стало куда больше, чем раньше и наконец-то удалось увидеть что-то новое и очень интересное в работе двигателя. Наибольший интерес представляют скоротечные процессы воспламенения топлива.…// Ракетомодельный
 

Периодически будет возникать задержка, пока записывается буфер, так как для его записи нужно по факту почти 8000 тактов, а у нас при равенстве интервалов времени получаемых измерений только 160 тактов максимум.

SashaMaks>> Другие 2МБ/с съедаются 8-битностью контроллера.
AXT> Как это? Почему это?

Потому, что адресация и вся работа с флешкартой идёт в 32-х битной среде. Это плохо почти, как деление для 8-битного контроллера.

SashaMaks>> Запись с частотой 1600МГц даёт запись данных всех 200кГц значений АЦП с равными промежутками времени. Это абсолютно важно для записи измеренных во времени данных с равными промежутками времени.
AXT> Не важно. Подумай, почему. Подсказка: попробуй построить контраргумент. С доказательством.
AXT> Ещё одна подсказка: [показать]


Нет там никакого чтения. Идёт только запись буфера в 512 байт. Так работает FAT и флешкарта - это аппаратно заложено в неё, так как в пределах данного блока памяти эти байты не адресуются, поэтому всегда читаются или пишутся всей кучей от и до.
+
-
edit
 

SashaMaks
SashaPro

аксакал

AXT> Атмега, кто же ещё. Точнее, её программа с помощью аппаратных ресурсов атмеги..

SashaMaks>> Ну почти уже, ещё чуть-чуть осталось, только назвать необходимое для работы всего этого одно устройство.
AXT> Процессор.

Значит будет-таки использоваться ЦП. А при 2МБ/с он будет загружен на все 100%, как и при записи 4000Гц данных с АЦП с равными промежутками времени.
1 2 3 4

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru