klen 1 7 февраля, 2008 Опубликовано 7 февраля, 2008 · Жалоба Здравствуйтею Мурыжусь с 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(); // переключение контекста } } 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); // задачке ниче делать не надо } } Все работает, все замечательно но коряво: 1. в первом случае тратится время на полинг. 2. во втором процссор обрабатывает данные в режиме IRQ, косяГ.. хчется сделать как в книгах про светлое и чистое - в обработчике IRQ в том или ином виде реагировать лишь на флаги прервываний модуля USB, а обработку транзакции вести отложенно в зажаче. Примерно так же как в TNKernel-примере. Непоучаеццо, мож кто уже сделал? Пример c TNKernel не предлагать - смотрел, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 7 февраля, 2008 Опубликовано 7 февраля, 2008 · Жалоба Здравствуйтею Сергей, а не на пАдонкАвскАм жаргоне? Ты ведь умеешь! Непоучаеццо, мож кто уже сделал? А в чем проблема с, например, лобовым решением xTaskResumeFromISR() той самой задачи, которая раньше полингом занималась, а теперь будет крепко спать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 7 февраля, 2008 Опубликовано 7 февраля, 2008 · Жалоба Сергей, а не на пАдонкАвскАм жаргоне? Ты ведь умеешь! А в чем проблема с, например, лобовым решением xTaskResumeFromISR() той самой задачи, которая раньше полингом занималась, а теперь будет крепко спать? Я не на подонковском, просто клава с третим продлением ресурса. пишу как короче и проще. в школе по всем предметам кроме русского и литературы было отлично, а по ним 2+, такто не пинайте пианиста - играет как может. не обращайте внимания. С TaskSuspend/xTaskResumeFrom ессесено я и делал. Проблема не в FreeRTOS а в том что я так и не понял как код USB модуля работает :( ламер.. USBHwISR() в нутрях сбрасывает флаги прерываний, поэтому тупо ее перенести в задачу нельзя - ISR зацикливается. void _USBSTACK_ATTR_ USBHwISR(void) { uint32_t dwStatus; uint32_t dwIntBit; uint8_t bEPStat, bDevStat, bStat; int i; // handle device interrupts dwStatus = USBDevIntSt; if (dwStatus & DEV_STAT) { /* Clear DEV_STAT interrupt before reading DEV_STAT register. This prevents corrupted device status reads, see LPC2148 User manual revision 2, 25 july 2006. */ [b]USBDevIntClr = DEV_STAT;[/b] bDevStat = USBHwCmdRead(CMD_DEV_STATUS); if (bDevStat & (CON_CH | SUS_CH | RST)) { // convert device status into something HW independent bStat = ((bDevStat & CON) ? DEV_STATUS_CONNECT : 0) | ((bDevStat & SUS) ? DEV_STATUS_SUSPEND : 0) | ((bDevStat & RST) ? DEV_STATUS_RESET : 0); // call handler if (_pfnDevIntHandler != NULL) { _pfnDevIntHandler(bStat); } } } // check endpoint interrupts if (dwStatus & EP_SLOW) { // clear EP_SLOW [b]USBDevIntClr = EP_SLOW;[/b] // check all endpoints for (i = 0; i < 32; i++) { dwIntBit = (1 << i); if (USBEpIntSt & dwIntBit) { // clear int (and retrieve status) [b]USBEpIntClr = dwIntBit;[/b] Wait4DevInt(CDFULL); bEPStat = USBCmdData; // convert EP pipe stat into something HW independent bStat = ((bEPStat & EPSTAT_FE) ? EP_STATUS_DATA : 0) | ((bEPStat & EPSTAT_ST) ? EP_STATUS_STALLED : 0) | ((bEPStat & EPSTAT_STP) ? EP_STATUS_SETUP : 0) | ((bEPStat & EPSTAT_EPN) ? EP_STATUS_NACKED : 0) | ((bEPStat & EPSTAT_PO) ? EP_STATUS_ERROR : 0); // call handler if (_apfnEPIntHandlers[i / 2] != NULL) { _apfnEPIntHandlers[i / 2](IDX2EP(i), bStat); } } } } // handle frame interrupt if (dwStatus & FRAME) { // clear int [b]USBDevIntClr = FRAME;[/b] // call handler if (_pfnFrameHandler != NULL) { _pfnFrameHandler(0); // implement counter later } } } Я пробывал вынести из USBHwISR() чтение и сброс флагов прерываний, а остаток доделывать в задаче. Вот это и не получилось. Я со временем разберусь или что чаще бывает нахер перепешу usb стек, но это время, вот и подумал мож ктото уже сделал это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 7 февраля, 2008 Опубликовано 7 февраля, 2008 · Жалоба Проблема не в FreeRTOS а в том что я так и не понял как код USB модуля работает :( ламер.. Сейчас нет времени вычитывать исходники :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 7 февраля, 2008 Опубликовано 7 февраля, 2008 · Жалоба Сейчас нет времени вычитывать исходники :( об этом и речь, с ходу невоткнуло, если разберусь то такому же как я в следущий раз не придется время тратить. время это самое ценное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться