Форум: Техническая поддержка

Тема: E-502 изменение прошивки Blackfin

Вы не вошли.

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

Илья Б
18.05.2023 17:14:56
#1

Гость

E-502 изменение прошивки Blackfin

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

Поток только на ввод (ADC 1ch/ 2MHz + DIN), запуск от переднего фронта внешнего Sync1 (f=150Hz).
Требуется оцифровать 1024 измерений, затем сбросить АЦП и ждать следующего Sync1.
В файл stream.c штатной прошивки внесены изменения по мотивам сообщения от https://www.lcard.ru/forums/viewtopic.p … 253#p62253

Шаг прерывания по SPORT изменен на (4*1024).
В ф-ю void stream_proc(void)  добавлена проверка общего количества принятых по SPORT данных и, 
если принято (4*1024) и более точек, то устанавливается глобальный флаг сброса АЦП
             f_sport_data_counter += sport_rdy_size;           
             if( f_sport_data_counter >= 4096) {
                     ADC_reset_flag =1;
                      f_sport_data_counter = 0;
              }.
Флаг проверяется в main (после stream_proc();
        if (ADC_reset_flag) {
              reset_stream_in();
            ADC_reset_flag = 0;
    }

Для перезапуска используется ф-я
/* Reset ADC & DIN */
int32_t reset_stream_in(void)
{
    int32_t err = g_mode != L502_BF_MODE_STREAM ? L502_BF_ERR_STREAM_STOPPED : 0;
    if (!err) {                // stop

        fpga_reg_write(L502_REGS_IOHARD_GO_SYNC_IO, 0);
        sport_rx_stop();
        g_mode = L502_BF_MODE_IDLE;
        g_stream_in_state = IN_STREAM_STOP;

    }
    err = g_mode != L502_BF_MODE_IDLE ? L502_BF_ERR_STREAM_RUNNING : 0;
    if (!err) {                // init SPORT
        f_sport_in_put_pos = f_sport_in_get_pos = f_sport_in_proc_pos = 0;


        if (g_streams & L502_STREAM_ALL_IN) {
            sport_rx_start();
            g_stream_in_state = IN_STREAM_RUN;
        }
        f_set_streams(g_streams);

        fpga_reg_write(L502_REGS_IOHARD_PRELOAD_ADC, 1);
        fpga_reg_write(L502_REGS_IOHARD_PRELOAD_ADC, 1);
        fpga_reg_write(L502_REGS_IOHARD_GO_SYNC_IO, 1);

        g_mode = L502_BF_MODE_STREAM;
    }
    return err;
   

После загрузки прошивки модуль передает несколько пакетов данных (около 100),  после чего останавливается с ошибкой -11.
Анализ полученных данных показывает, что в то время, когда идет перезапуск АЦП
(виден разрыв в данных, позиция разрыва соответствует заданной точке = 1024),
сбор данных по DIN продолжается без остановки, что (видимо) и вызывает переполнение буффера.

Какие могут быть комментарии?

18.05.2023 18:38:47
#2

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

Re: E-502 изменение прошивки Blackfin

Здравствуйте.
Можете пояснить по поводу "Анализ полученных данных показывает, что в то время, когда идет перезапуск АЦП (виден разрыв в данных, позиция разрыва соответствует заданной точке = 1024), сбор данных по DIN продолжается без остановки", как именно определяете, что сбор DIN продолжается.

По описанию изменений прошивки, то в вашем методе перезапуска мне не нравится один момент. Вы останавливаете сбор данных по SPORT по приему заданного количества значений и тут же его перетаскаете прием с начала буфера, сбрасывая все позиции (f_sport_in_put_pos = f_sport_in_get_pos = f_sport_in_proc_pos = 0;). Но у Вас при этом данные еще могут не быть переданы в ПК из буфера в Blackfin по HDMA и реально hdma_send_done() в user_process может вызваться после перезапуска. А в этой функции вызывается stream_in_buf_free() для пометки, что данные в буфере переданы и свободны, при этом буфер у Вас уже значится пустым за счет сброса счетчиков при перезапуске и вызов stream_in_buf_free() приведет к некорректному значению f_sport_in_get_pos, что в свою очередь может привести к ошибочному определению прошивкой blackfin факта переполнения буфера, который определяется по соотношению этих позиций.

Поэтому в первую очередь я бы попробовал исправить эту проблему. Как видится, это можно сделать двумя способами:
1. Останавливать прием по sport также как у Вас, но запуск со сбросом счетчиков делать только по завершению передачи блока в ПК (в hdma_send_done() завершится передача вашего блока).
2. Не сбрасывать буфер а продолжать запись нового блока сразу за принятым блоком, при этом можно сразу запускать сбор без ожидания завершения передачи данных (т.е. как раз как сейчас у Вас). Т.е. на первый взгляд достаточно вместо f_sport_in_put_pos = f_sport_in_get_pos = f_sport_in_proc_pos = 0; сделать только f_sport_in_put_pos = f_sport_in_proc_pos;, чтобы отбросить только данные, которые успели приняться за вашим блоком и еще не обработались до перезапуска, если такие вообще есть, но счетчик обработанных и переданных слов не трогать.

Илья Б
19.05.2023 17:08:47
#3

Гость

Re: E-502 изменение прошивки Blackfin

Спасибо за подсказку. О том, что обнуленный указатель позиции в буфере может вызвать переполнение я не подумал.
По поводу исправления :
1. сброс АЦП (int32_t reset_stream_in(void) разделен соответственно на две части (останов и запуск). В main
остановка приема по SPORT -> ожидание глобального флага HDMA_done_flag (устанавливается в hdma_send_done
    stream_in_buf_free(size);
    if(ADC_reset_flag)    HDMA_done_flag    =1;
  -> запуск приема по SPORT -> сброс глобальных флагов
                ADC_reset_flag = 0;
            HDMA_done_flag = 0;
Принимаем 5 пакетов данных, первый нормальный (1024 отсчетов), остальные имеют на порядок больший размер (у всех разный), далее ошибка -11 переполнение внутреннего буфера (?)
2. если не сбрасывать буфер, т.е.  f_sport_in_put_pos = f_sport_in_proc_pos; - 1 пакет данных (до сброса) - нормальный, следующие после него  ошибка -140 "Неверный номер канала в потоке". Т.е. f_sport_in_get_pos где-то испортился (?)

По поводу "анализ...": lqmeasstudio не отображает DIN, поэтому в моей программе (LabView) включен стрим  в файл (TDMS). Пишется: количество принятых данных/ данные АЦП/ данные DIN, затем средствами LabView просматривается. Понимаю, что не совсем корректно, но как есть. Однако, ошибки и lqmeasstudio и программа (LabView) выдают одинаковые. Т.е. проблема в Blackfin.

Буду рад комментариям, спасибо.

22.05.2023 17:08:13
#4

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

Re: E-502 изменение прошивки Blackfin

Шаг прерывания по SPORT изменен на (4*1024).

Можете привести этот кусок кода, где конкретно изменили и как? И почему именно 4*1024 для 1024 точек?

Принимаем 5 пакетов данных, первый нормальный (1024 отсчетов), остальные имеют на порядок больший размер (у всех разный)

А как именно Вы разделяете данные на пакеты. Если сигнал старта приходит с частотой 150 Гц постоянно, то не совсем понятно, как Вы понимаете, и блоки идут сплошным потоком, то как Вы понимаете, что относится к какому блоку?

Илья Б
23.05.2023 17:31:18
#5

Гость

Re: E-502 изменение прошивки Blackfin

Добрый день, Алексей.
Файл stream.c
/** Шаг прерываний для приема данных по SPORT0 по-умолчанию */
//#define L502_DEFAULT_SPORT_RX_BLOCK_SIZE    (32*1024)
#define L502_DEFAULT_SPORT_RX_BLOCK_SIZE    (4*1024) - насколько я понимаю, шаг прерывания SPORT должен быть кратным этому параметру. Идея была иметь в буфере число отсчетов 1024 х 2(ADC+DIN) x 2(в конце посылки = 2048 отсчетов DIN = 0). Т.е. я вижу "ворота" полезного сигнала и могу разделять пакеты.
Recv из библиотеки настроен таким образом, чтобы принять как минимум 1024 отсчета, а если больше - прочитать (очистить) весь буфер. При этом я рассчитывал видеть DIN ("склейку" из пакетов) в виде импульсов со скважностью > 50%. Реально, картина с точностью наоборот, скважность < 10%.
Т.е. SPORT накапливает данные в тот момент, когда (по моим представлениям) должен быть сброшен (ждать следующего Sync1).
Если не возражаете, я бы перевел обсуждение в почту чтобы не засорять форум.

25.05.2023 15:42:30
#6

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

Re: E-502 изменение прошивки Blackfin

Хорошо, ответил на почту

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск