Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


L-502 мусор в потоке

Вы не вошли.

 Поиск | Регистрация | Вход 

Руслан
22.05.2014 06:06:27
#1

Гость

L-502 мусор в потоке

Здравствуйте
Борюсь с одним неприятным глюком.

У меня довольно сильно модифицированная прошивка BlackFin на основе вашей. В ней не используется отправка в ПК значений DI и AI. Полученные по SPORT значения DI и AI BlackFin использует для отработки своих алгоритмов и не шлёт их в ПК как в оригинальной прошивке от Lcard.

Вместо этого в прошивке организована отправка от BlackFin в ПК блоков данных через поток (блоки данных содержат простую шапку, содержащую размер блока для того чтобы верхний уровень мог определять начало следующего блока и само тело блока данных). Размер блока вместе с шапкой всегда кратен 64 32-битным словам.

Отправка блоков делается функцией hdma_send_req_start(), из глобальных массивов, объявленных как volatile uint8_t с предварительным заполнением шапки блока.
Отправка всегда делается из одного потока (из основного цикла), никаких отправок из обработчиков прерываний.

Передача из ПК в BlackFin через поток не используется.

Простенький верхний уровень на C# принимает блоки из потока.
Всё прекрасно работает, пока в один прекрасный момент верх не получает на месте где должна быть очередная шапка блока мусор, соответственно верх пытается разобрать этот блок, определить смещение до следующей шапки и, конечно, ломается.

Мусор может прийти как через несколько минут после начала обмена, так и через несколько часов (обычно всё нормально работает часов 8-10, успешно принимается около 180000 блоков).

Понимаю, что по такому описанию проблемы трудно чем то помочь, вопрос скорее в том, не сталкивались ли вы с непроизвольным появлением мусора в потоке от BlackFin в ПК и не было ли критических исправлений драйвера устройства и прошивки BlackFin и ПЛИС где-то с ноября 2013, которые ещё не выложены в репозиторий.
Буду благодарен за любые подсказки, в какую сторону копать.

22.05.2014 08:04:29
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,338

Re: L-502 мусор в потоке

Честно говоря с таким не сталкивался....
Из общих соображений:
Во-первых конечно было бы не плохо знать начала мусора (можно использовать некую сигнатуру в начале пакета и crc по всему пакету, чтобы знать момент, когда пришло что-то левое).
Во-вторых, там в файле l502_stream.c управления входными потоками проверяется условие переполнения входного буфера, в случае чего посылается соответствующее слово - надо проверить что это не происходит.
В-третьих следует проверить, что на данные, переданные в hdma_send_req_start() не изменяются программой до вызова соответствующей функции обратного вызова, сообщающей, что данные переданы, а также перед вызовом - что есть свободные запросы через hdma_send_req_rdy.

Руслан
23.05.2014 10:50:59
#3

Гость

Re: L-502 мусор в потоке

Спасибо за ответ
1) Добавил в шапку блока crc16. Считается crc при заполнении шапки перед вызовом hdma_send_req_start(). Сам отправляемый массив - глобальный volatile, заполняется 1 раз при старте BlackFin нарастающим от нуля 32-битным целым (для отладки) и в дальнейшем не изменяется, а контрольная сумма блока считается перед каждой отправкой в ПК. Жду когда crc не сойдётся и смотрю что пришло - приходит блок, в теле которого кусок из 64 слов заполнен неверно. 4 полученных блока, не прошедших проверку crc:
http://pastebin.com/iFX68WPa
http://pastebin.com/9suEXRF1
http://pastebin.com/N0iyf1DD
http://pastebin.com/feWdVM4x
PS: Размер блока 1250 слов, с шапкой 1257. В hdma_send_req_start() в качестве длины передаётся длина блока с шапкой, дополненная до кратной 64, т.е. 1280.
2) Проверил, отправка слова о переполнении у меня закомментирована.
3) По программе нигде этот массив не меняется. На всякий случай в функцию обратного вызова добавил проверку массива на изменения - он не меняется после первичного заполнения, в т.ч. после получения верхним уровнем кривого блока.
Перед вызовом hdma_send_req_start() я проверяю, что есть свободные дескрипторы функцией hdma_send_req_rdy и если получаю < 1, инкрементирую счётчик неудачный отправок. Этот счётчик всегда нулевой.

23.05.2014 11:52:35
#4

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,338

Re: L-502 мусор в потоке

Руслан пишет:

Проверил, отправка слова о переполнении у меня закомментирована

а само условие переполнение где был этот код не происходит?

Вообще это как часто случается и через какое-то фиксированное время?

Руслан
23.05.2014 13:29:26
#5

Гость

Re: L-502 мусор в потоке

Алексей L Card пишет:

а само условие переполнение где был этот код не происходит?

нет, переполняния при приёме по sport нет. У меня стоит достаточно низкая частота сбора данных (~10кгц), BlackFin успевает обработать поток из sport до переполнения.

Алексей L Card пишет:

Вообще это как часто случается и через какое-то фиксированное время?

Случается по-разному, может через пару минут, а может час проработать без проблем. Это с учётом того, что я оставил только отправку большого блока (1280 слов) 10 раз в секунду, а в первом посте я описывал работу когда отправлялся короткий блок 64 слова 5 раз в секунду и большой блок 1280 слов 1 раз в секунду.
Сейчас я уже убрал из программы 90% моего кода, отключил обмен с ПЛИС по sport. в основном цикле программы осталась только отправка блока в ПК по флагу от таймера, ну и вызовы l502_cmd_check_req() и stream_proc(). Проблема остаётся.

23.05.2014 13:49:46
#6

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,338

Re: L-502 мусор в потоке

Можете тогда выслать минимальный вариант программы как для blackfin так и для ПК на которых это проявляется. на следующей неделе посмотрю

Руслан
23.05.2014 15:35:54
#7

Гость

Re: L-502 мусор в потоке

@Алексей L Card, Хорошо, куда слать?

23.05.2014 17:07:06
#8

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,338

Re: L-502 мусор в потоке

написал на указанную Вами почту. Либо если зарегистрируетесь на форуме, то будет видна моя почта тут