Несколько статей назад мы рассмотрели способ работы с USB-устройством с помощью библиотеки libusb. Данные в нашем устройстве генерировались по таймеру, поэтому мы не только были уверены, что рано или поздно они к нам придут, но даже могли предсказать, сколько времени это займет. Однако в анализаторе (что является конечной целью разработки) данные текут непредсказуемо.
Будут ли данные или нет, зависит от поведения объекта управления.
Поэтому, во-первых, было бы полезно посмотреть, сколько его уже перешло в буфер, чтобы понять, работает система или нет. Ну, а во-вторых, если данных нет и в помине, а все интересное уже вошло в нашу память, мы должны уметь перестать их получать и начать анализировать то, что уже накопилось.
Ни то, ни другое невозможно с использованием функций, обсуждаемых в эта статья .
По крайней мере со стороны ПК.
В прошивку ПЛИС не добавлено никаких читов.
Сегодня мы узнаем, как получить асинхронный доступ к библиотеке libusb. Это позволит вам примерно отслеживать объем уже поступивших данных, прерывать работу в любой момент и даже улучшать общую производительность системы.
Причём всё это будет делаться только путём вызова стандартных функций libusb. Мы не будем для этого модифицировать код FX3 и FPGA. Итак, давайте начнем.
Предыдущие статьи серии:
- Начинаем эксперименты с интерфейсом USB 3.0 через контроллер семейства FX3 от Cypress.
- Дорабатываем прошивку USB 3.0 с помощью анализатора SignalTap, встроенного в среду разработки Quartus.
- Учимся работать с USB устройством и тестируем систему на базе контроллера FX3
- Мы имеем дело с таймаутами при использовании USB 3.0 через контроллер FX3, возникающими при определенных условиях.
- Добавление поддержки команд Vendor на устройство USB3.0 на базе FX3
- Создание блока SPI to AVALON_MM для USB-устройства на базе FX3.
1 Зачем все это
Напомню, что в предыдущая статья о libusb Я читаю данные из FX3 так:Вот и все.int res = libusb_bulk_transfer(tester.m_hUsb,0x81,(uint8_t*)pData,bytesCnt,&actualLength,10000);
Пока таймаут не истечет (а для анализатора он может быть огромным), текущий поток будет выполняться внутри этой функции.
Никто не вернет мне контроль.
Мы будем ждать, ждать и ждать, как бедняга на вступительной картинке, отмеченный крестиком.
В отличие от такой работы (ее еще называют синхронной), любая уважающая себя USB-библиотека должна иметь еще и асинхронную.
Там мы вызываем функцию чтения и нам сразу возвращается управление.
Что произойдет дальше, зависит от конкретной библиотеки.
Где-то в нужный момент объект «Событие» перейдет в активное состояние.
Будет вызвана функция обратного вызова libusb. Короче говоря, мы получим сообщение о том, что наш запрос выполнен, как на вступительной картинке с галочкой.
И никто не запрещает нам в любой момент вызвать функцию, отменяющую процесс обмена.
При этом, если часть данных уже прошла через канал, она нам все равно будет передана.
Ничего не потеряется.
Мы скоро посмотрим, как это работает, но сначала я объясню, почему я не рассказал об асинхронной работе сразу после синхронной.
Дело в том, что при проверке асинхронной работы мы должны провоцировать ситуации с таймаутами.
Это значит, что наш таймер не должен молотить от начала жизни до бесконечности, а должен выдавать строго отмеренные порции данных.
Для этого мы должны им управлять.
Собственно, в двух предыдущих статьях мы освоили этот процесс.
Теперь мы можем легко отправлять запросы на шину AVALON_MM. Следовательно, подключив к этой шине таймер, мы сможем управлять и им.
Давайте начнем.
2 Завершение работы таймера
Да, я обещал, что мы будем работать только с использованием libusb. Но этот раздел ничему не противоречит. Здесь показана не работа, а доработка инструментов тестирования.Итак, модуль таймера Verilog, формирующий влияние, несколько изменился.
К нему добавилась шина AVALON_MM. Из самого счетчика удалены все поведенческие особенности.
Раньше после переполнения ресивера он запускался не сразу.
Теперь все просто.
В начале стоит. На шине AVALON_MM попросили сделать N тиков — отправит ровно столько слов, сколько они просили.
Я переслал его, и он все еще там.
Таким образом, наша программа сможет выдавать строго заданное количество 16-битных слов, которые пойдут на шину AVALON_ST, затем в FIFO, а оттуда в FX3 и USB 3.0.
Ниже приведен результирующий код таймера Verilog. Посмотреть код таймера.
module Timer_ST (
input clk,
input reset,
input [2:0] avalon_mm_address,
input [31:0] avalon_mm_data_in,
input avalon_mm_wr,
Теги: #Программирование микроконтроллеров #Компьютерное оборудование #Системное программирование #plice. fpga #FPGA #library libusb 1.0 #шина AVALON_MM #асинхронный метод
-
Таинственная Кнопка Reddit Все Еще Работает
19 Oct, 24 -
Есть Инвайты В Idealprice
19 Oct, 24