Мурыжусь с lpc2148 и USB стеком(http://sourceforge.net/projects/lpcusb) для ее USB модуля. Со стороны PC тестируется с помощю прилагуха+ драйвер libusb(http://sourceforge.net/projects/libusb-win32)
в примерах для lpcusb есть два варианта
1. Не пользуем прерывания, полим в цикле обработчик, применительно к задачкам FreeRTOS :
Код
TTaskHandle UsbTaskHandle;
void UsbTaskCode( void * Parameters )
{
(void)Parameters; // обход предупреждений
UsbDevInit( false , 0 , 0 ); // инициализация USB без использования прерываний
while(1)
{
USBHwISR(); // обработка текущих запросов USB если они есть
TaskYield(); // переключение контекста
}
}
void UsbTaskCode( void * Parameters )
{
(void)Parameters; // обход предупреждений
UsbDevInit( false , 0 , 0 ); // инициализация USB без использования прерываний
while(1)
{
USBHwISR(); // обработка текущих запросов USB если они есть
TaskYield(); // переключение контекста
}
}
2. В торой вариант с участием прерываний
Код
static void _APP_IRQ_ATTR_ USBIntHandler(void)
{
USBHwISR(); // обработка текущих запросов USB вызвавших прерывание
VICVectAddr = 0x0; // сброс VIC
}
TTaskHandle UsbTaskHandle;
void UsbTaskCode( void * Parameters )
{
(void)Parameters; // обход предупреждений
uint8_t DeferredUsbIntStatus;
UsbDevInit( true , 15 , (uint32_t) USBIntHandler ); // инициализация USB c отработкой запросов в прерываниях
//UsbDevInit( false , 0 , 0 ); // инициализация USB c отработкой запросов методом полинга
while(1)
{
TaskSuspend(NULL); // задачке ниче делать не надо
}
}
{
USBHwISR(); // обработка текущих запросов USB вызвавших прерывание
VICVectAddr = 0x0; // сброс VIC
}
TTaskHandle UsbTaskHandle;
void UsbTaskCode( void * Parameters )
{
(void)Parameters; // обход предупреждений
uint8_t DeferredUsbIntStatus;
UsbDevInit( true , 15 , (uint32_t) USBIntHandler ); // инициализация USB c отработкой запросов в прерываниях
//UsbDevInit( false , 0 , 0 ); // инициализация USB c отработкой запросов методом полинга
while(1)
{
TaskSuspend(NULL); // задачке ниче делать не надо
}
}
Все работает, все замечательно но коряво:
1. в первом случае тратится время на полинг.
2. во втором процссор обрабатывает данные в режиме IRQ, косяГ..
хчется сделать как в книгах про светлое и чистое - в обработчике IRQ в том или ином виде реагировать лишь на флаги прервываний модуля USB, а обработку транзакции вести отложенно в зажаче. Примерно так же как в TNKernel-примере.
Непоучаеццо, мож кто уже сделал? Пример c TNKernel не предлагать - смотрел,