|
Как правильно синхронизировать SGDMA? |
|
|
|
Mar 8 2016, 14:33
|
Участник

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

|
Здравствуйте, коллеги! Вот такая связка:
АЦП-----ОБРАБОТКА-----FIFO-----SGDMA----NIOSII
Вопрос не по реализации, с ней все нормально, а по алгоритму. Дело в том, что здесь АЦП производит 256 измерений последовательно от 256 разных каналов и т.д. по кругу. Важен порядковый номер каждого байта, принятого в буфер ДМА.
Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере.
Как с этим бороться? Нужно придумать механизм самосинхронизации.
Дополнительно нумеровать байты очень не хочется (например, можно добавить один бит и выставлять его только для нулевого канала). Сбрасывать фифо не получается, т.к. оно заполняется непрерывно; в прерывании, возникающем по окончании ДМА трансфера этого делать нельзя, потому что фифа уже начала заполняться новыми данными.
На самом деле такой потери синхронизации в железе не наблюдается, если только ее не вызвать намеренно, например прервав и запустив программу в дебагере. Но все, что может произойти, как известно, произойдет... Спасибо! NJ
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Mar 8 2016, 15:31
|
Участник

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

|
QUOTE (des00 @ Mar 8 2016, 18:41)  Заменить фифо на рам. Вах!!! Спасибо. (Почему я не догадался )
|
|
|
|
|
Mar 9 2016, 07:02
|
Участник

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

|
Цитата(smersh @ Mar 8 2016, 18:33)  Здравствуйте, коллеги! Вот такая связка:
АЦП-----ОБРАБОТКА-----FIFO-----SGDMA----NIOSII
Вопрос не по реализации, с ней все нормально, а по алгоритму. Дело в том, что здесь АЦП производит 256 измерений последовательно от 256 разных каналов и т.д. по кругу. Важен порядковый номер каждого байта, принятого в буфер ДМА.
Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере.
Как с этим бороться? Нужно придумать механизм самосинхронизации.
Дополнительно нумеровать байты очень не хочется (например, можно добавить один бит и выставлять его только для нулевого канала). Сбрасывать фифо не получается, т.к. оно заполняется непрерывно; в прерывании, возникающем по окончании ДМА трансфера этого делать нельзя, потому что фифа уже начала заполняться новыми данными.
На самом деле такой потери синхронизации в железе не наблюдается, если только ее не вызвать намеренно, например прервав и запустив программу в дебагере. Но все, что может произойти, как известно, произойдет... Спасибо! NJ АЦП пишет в промежуточный буфер, далее проверяем количество записей. Если количество соответствует, переписываем их в кольцевой буфер. Придется добавить еще один буфер и еще один ДМА. И еще вопрос, по каким причинам АЦП может не выдать байт? можно сделать проверку, что если какой то канал не выдал данные тогда принудительно выставить какое то значение.
|
|
|
|
|
Mar 10 2016, 12:29
|
Участник

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

|
QUOTE (des00 @ Mar 9 2016, 13:42)  О времена.... банальный 2D буфер (5 минут работы) решит все проблемы, без кучи всякой обвески Еще раз спасибо за идею. Я использовал Onchip Memory в режиме Dual-port access. Второй порт выведен из ниоса, в него пишутся данные и по окончанию цикла генерируется прерывание. Все получилось в разы компактнее и проще, чем с ДМА. Конечно, такое пройдет только с Ниосом, куда возможно встроить блок. NJ QUOTE (sprutkmv @ Mar 9 2016, 11:02)  И еще вопрос, по каким причинам АЦП может не выдать байт? можно сделать проверку, что если какой то канал не выдал данные тогда принудительно выставить какое то значение. АЦП не может не выдать. Может случиться, что его не заберет ДМА и ФИФО не опустошится. Тогда лишние байты в ФИФО останутся навсегда, если не принять никаких мер. (Или заберет не все байты, т.к. ДМА каждый цикл надо перезапускать из софта. Сделать режим Ping-Pong без управления ДМА из прерывания у меня не получилось) NJ
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|