Я є членом наукової групи дослідницької групи, яка працює над проектом, який передбачає передачу радіочастотних сигналів ASIC та його бездротовий приймач, який в кінцевому рахунку повинен надсилати дані на ПК.
Одержувач видає швидкий , безперервний, асинхронний нестандартний послідовний сигнал (тобто не SPI, I2C, UART тощо), тому моя робота полягає в написанні програмного забезпечення мікроконтролера для інтерфейсу приймача до комп'ютера. В даний час мій підхід полягає у використанні переривань, що викликаються краєм, щоб розмістити дані в круговому буфері і виконати весь процес розшифровки побітів в основному циклі. Мікроконтролер повинен одночасно виводити ці дані за допомогою USB (віртуального компонента) на комп'ютер.
Ось проблема, яка у мене є, і одна, яку я передчуваю:
Я не можу обробляти завантажені дані досить швидко навіть за допомогою мого досить потужного процесора ARM Cortex M3 72 МГц. Бітрейт становить 400 Кбіт / с (2,5 нас / біт). Для довідки, що залишає лише 180 циклів на біт (включаючи декодування AND ISR, що має ~ 30 циклів накладних оч!). MCU також має вирішувати безліч інших завдань, які він запитує в основному циклі.
USB-драйвер віртуального компорту також заснований на перериванні. Це робить мене майже впевненим, що драйвер врешті-решт перерве процесор настільки довго, що він пропустить вікно 2,5 мікросекунди (цикл 180), в яке може бути передано трохи. Я не впевнений, як нормально вирішуються подібні конфлікти / перегони.
Отже, питання просто, що можна зробити для вирішення цих питань або це взагалі не правильний підхід? Я також готовий розглянути менш програмно-орієнтовані підходи. Наприклад, використання виділеного USB-чіпа з якоюсь апаратною машиною стану для декодування, але це незнайома територія.