реклама на сайте
подробности

 
 
> AT91SAM7SE + scmrtos + usb
derstik
сообщение May 9 2012, 06:29
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 3-11-11
Пользователь №: 68 115



Добрый день!

Есть рабочий проект под scmrtos. Потребовалось использовать usb. Взял сэмпл usb-cdc-serial. Выдрал из него все что касается usb и пытаюсь запустить в своем проекте. результата нет. Без scmrtos работает нормально. Есть подозрения на низкоуровневую инициализацию - в сэмпле вообще есть такие строки:

// Disable RTT and PIT interrupts (potential problem when program A
// configures RTT, then program B wants to use PIT only, interrupts
// from the RTT will still occur since they both use AT91C_ID_SYS)
AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN);
AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN;

Убивают таймер ОС. Может кто поднимал usb под scmrtos? подскажите
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение May 9 2012, 07:47
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (derstik @ May 9 2012, 09:29) *
Может кто поднимал usb под scmrtos?
Я не поднимал, но если у вас несколько источников системного прерывания, то вы можете написать свой обработчик, из которого вызывать и обработчик системного таймера и обработчики остальных устройств. Примерно так:
CODE
OS_INTERRUPT void Sys_IRQ_handler()
{
    OS::TISRW ISR;

    SYSTEM_TIMER_HANDLER();

    Receiver_uart.handler();

    IRQ_DONE();
}
В обработчиках остальных устройств надо будет проанализировать флаг, на предмет - ваш ли источник вызвал системное прерывание. В обработчике системного таймера такой анализ есть (если это не прерывание от таймера, Tmp будет равен нулю):
CODE
// SYSTEM_TIMER_HANDLER(): while() used instead of do-while()
// to allow other interrupt sources on AT91C_ID_SYS.
// Write your own handler instead of OS::system_timer_isr() to handle other SYS sources
#define SYSTEM_TIMER_HANDLER()                                  \
    do                                                          \
    {                                                           \
        volatile uint32_t Tmp = AT91C_BASE_PITC->PITC_PIVR >> 20;  \
        while (Tmp)                                             \
        {                                                       \
            --Tmp;                                              \
            OS::system_timer_handler();                         \
        }                                                       \
    }                                                           \
    while(0)


Вот так у меня сделан обработчик DBGU:
CODE
template<uint_fast8_t rx_size, uint_fast8_t tx_size>
void uart<rx_size, tx_size>::handler()
{
    uint32_t Flags = pUART->US_CSR;
    Flags &= pUART->US_IMR;
    if(Flags & AT91C_US_TXRDY)
    {
        if(Tx_buffer.get_count())
        {
            uint8_t Data;
            Tx_buffer.pop(Data, 1);
            pUART->US_THR = Data;
        }
        else
            pUART->US_IDR = AT91C_US_TXRDY;
    }

    if(Flags & AT91C_US_RXRDY)
    {
        uint8_t Data = pUART->US_RHR;       // read anyway
        pUART->US_CR = AT91C_US_RSTSTA;     // clear errors if any
        if(Rx_buffer.get_free_size())
            Rx_buffer.push(Data);
    }
}

Думаю, что совершенно необязательно отказываться от PIT в качестве системного таймера - ведь разработчики кристалла предполагали совместное использование нескольких источников на системном прерывании.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 04:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016