Перейти к содержанию
    

lpcusb_lp2148 + FreeRTOS

Здравствуйтею

Мурыжусь с 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 не предлагать - смотрел,

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйтею

Сергей, а не на пАдонкАвскАм жаргоне? Ты ведь умеешь!

Непоучаеццо, мож кто уже сделал?

А в чем проблема с, например, лобовым решением xTaskResumeFromISR() той самой задачи, которая раньше полингом занималась, а теперь будет крепко спать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей, а не на пАдонкАвскАм жаргоне? Ты ведь умеешь!

 

А в чем проблема с, например, лобовым решением 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 стек, но это время, вот и подумал мож ктото уже сделал это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема не в FreeRTOS а в том что я так и не понял как код USB модуля работает :( ламер..

Сейчас нет времени вычитывать исходники :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас нет времени вычитывать исходники :(

об этом и речь, с ходу невоткнуло, если разберусь то такому же как я в следущий раз не придется время тратить. время это самое ценное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...