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

Передача пользовательских данных в ПК из прошивки blackfin E502.

Вы не вошли.

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

ET
02.03.2017 09:49:33
#1

Гость

Передача пользовательских данных в ПК из прошивки blackfin E502.

Попробую описать ситуацию.
1. Пользовательские данные формируются в модифицированной прошивке blackfin в размере 4 значений uint32_t от 0 до 3 раз в секунду.
2. По мере готовности, эти данные (максимум 12 значений в секунду) ставятся на передачу в ПК.
3. Параллельно работает передача синхронного ввода от АЦП. То есть, все по прежнему, как в штатной прошивке.
(usr_in_proc_data())
4. Передача в ПК пользовательских данных (с накладыванием соотв. маски) вызывается до передачи данных АЦП (внутри usr_in_proc_data(), и по тем же правилам)

Приблизительный код посылки пользовательских данных (макс.3 раза в сек):

    if ((my_data_array[curr_idx].ready) && (!my_data_array[curr_idx].sent))
    {
        if (hdma_send_req_rdy())
        {
            usr_arr[0] = 0x40000000 | (my_data_array[curr_idx].val1);
            usr_arr[1] = 0x40000000 | (my_data_array[curr_idx].val2);
            usr_arr[2] = 0x40000000 | (my_data_array[curr_idx].val3);
            usr_arr[3] = 0x40000000 | (my_data_array[curr_idx].val4);

            hdma_send_req_start (&usr_arr[0], 4, 0);
            my_data_array[curr_idx].sent = true;
        }
    }

На ПК данные "разгребаются" как рекомендовано:

err = X502_ProcessDataWithUserExt(hnd, rcv_buf, rcv_size, 0, adc_data, &adc_size, NULL, NULL, usr_data, &usr_size);

Массив usr_data (после накладывания обратной маски "вручную"(?), что, кстати, API делает автоматически с данными АЦП) содержит правильные значения, которые и были посланы.
Соотношения между принятыми данными АЦП и пользовательскими данными (внутри rcv_size = adc_size + usr_size ) объема данных - правильное.

Проблема заключается в том, что через некоторое время (10-30) минут функция X502_ProcessDataWithUserExt в принятом по X502_Recv потоке  вдруг находит не пользовательские данные, и не данные АЦП, а что-то другое. То есть возвращает код, X502_GetErrorString которого:
"Неизвестное сообщение в потоке синхронного ввода"

Если отключить отсылку:

hdma_send_req_start (&usr_arr[0], 4, 0);

то модифицированная прошивка сама по себе стабильна (24 часа отработала), что говорит, скорее всего, о проблемах вне алгоритма формирования пользовательских данных (п. 1).

Понимая, что алгоритм отсылки пользовательских данных пока не оптимальный и вносит небольшую, но излишнюю дефрагментацию, в поток данных, все же возникает вопрос - что это может быть, и есть ли строгие рекомендации по отправке пользовательских данных.
(Суммарная частота оцифровки сейчас не превышает 200 КГц.)

02.03.2017 10:49:56
#2

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

Re: Передача пользовательских данных в ПК из прошивки blackfin E502.

При такой передаче понадобится также изменить hdma_send_done() в прошивке.
В ней нужно проверить, что завершилась передача обычных данных, а не пользовательских (что-то вроде (addr - size) !=  &usr_arr[0]) в Вашем случае) и только в этом случае сделать stream_in_buf_free.

ET
02.03.2017 11:50:15
#3

Гость

Re: Передача пользовательских данных в ПК из прошивки blackfin E502.

Спасибо за подсказку! Будем думать.

Контакты

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

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

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

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