реклама на сайте
подробности

 
 
> Как правильно синхронизировать SGDMA?
smersh
сообщение Mar 8 2016, 14:33
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 33
Регистрация: 19-06-04
Пользователь №: 64



Здравствуйте, коллеги!
Вот такая связка:

АЦП-----ОБРАБОТКА-----FIFO-----SGDMA----NIOSII

Вопрос не по реализации, с ней все нормально, а по алгоритму. Дело в том, что здесь АЦП производит 256 измерений последовательно от 256 разных каналов и т.д. по кругу. Важен порядковый номер каждого байта, принятого в буфер ДМА.

Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере.

Как с этим бороться? Нужно придумать механизм самосинхронизации.

Дополнительно нумеровать байты очень не хочется (например, можно добавить один бит и выставлять его только для нулевого канала). Сбрасывать фифо не получается, т.к. оно заполняется непрерывно; в прерывании, возникающем по окончании ДМА трансфера этого делать нельзя, потому что фифа уже начала заполняться новыми данными.

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

Спасибо!
NJ
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sprutkmv
сообщение Mar 9 2016, 07:02
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 17-09-08
Пользователь №: 40 284



Цитата(smersh @ Mar 8 2016, 18:33) *
Здравствуйте, коллеги!
Вот такая связка:

АЦП-----ОБРАБОТКА-----FIFO-----SGDMA----NIOSII

Вопрос не по реализации, с ней все нормально, а по алгоритму. Дело в том, что здесь АЦП производит 256 измерений последовательно от 256 разных каналов и т.д. по кругу. Важен порядковый номер каждого байта, принятого в буфер ДМА.

Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере.

Как с этим бороться? Нужно придумать механизм самосинхронизации.

Дополнительно нумеровать байты очень не хочется (например, можно добавить один бит и выставлять его только для нулевого канала). Сбрасывать фифо не получается, т.к. оно заполняется непрерывно; в прерывании, возникающем по окончании ДМА трансфера этого делать нельзя, потому что фифа уже начала заполняться новыми данными.

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

Спасибо!
NJ



АЦП пишет в промежуточный буфер, далее проверяем количество записей. Если количество соответствует, переписываем их в кольцевой буфер. Придется добавить еще один буфер и еще один ДМА.
И еще вопрос, по каким причинам АЦП может не выдать байт?
можно сделать проверку, что если какой то канал не выдал данные тогда принудительно выставить какое то значение.
Go to the top of the page
 
+Quote Post
des00
сообщение Mar 9 2016, 09:42
Сообщение #3


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(sprutkmv @ Mar 9 2016, 15:02) *
АЦП пишет в промежуточный буфер, далее проверяем количество записей. Если количество соответствует, переписываем их в кольцевой буфер. Придется добавить еще один буфер и еще один ДМА.

О времена.... банальный 2D буфер (5 минут работы) решит все проблемы, без кучи всякой обвески


--------------------
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016