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

 
 
> LPC236x, scmRTOS. Как обработать переполнение UART?
meister
сообщение Nov 24 2008, 11:17
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Обработчик прерывания (ниже), если не доставать данные из rx очереди вылетает на

Код
assert(0 == (iir & util::bit<hw::UART::UxIIR_int_status>::value) && "At least one interrupt is pending.");


а должен в
Код
assert(0 && "UART RX FIFO overflow");
или
Код
assert(0 == (lsr & util::bit<hw::UART::UxLSR_RX_OE>::value));


Что я делаю не по мануалу?

Код
OS_INTERRUPT void interrupts::irq_uart2_handler(void)
{
    OS::TISRW ISRW;
    interrupt_leds();
    
    unsigned const iir = U2IIR;
    
    assert(0 == (iir & util::bit<hw::UART::UxIIR_int_status>::value) && "At least one interrupt is pending.");
    
    switch (iir & hw::UART::UxIIR_IRQ_mask)
    {
    default: PANIC("unknown UART interrupt", UART2_FAULT);
    case hw::UART::UxIIR_RLS_bit:
        {
            basic_uart_t::rx_channel_item_t item;
            
            {
                byte const lsr = U2LSR;
                
                if (lsr & util::bit<hw::UART::UxLSR_RX_OE>::value)
                {
                    assert(0 && "UART RX FIFO overflow");
                    item.value = '?';
                }
                else
                {
                    assert(lsr & util::bit<hw::UART::UxLSR_RX_RDR>::value);
                    item.value = U2RBR;
                }
                
                item.lsr = lsr & hw::UART::UxLSR_RX_error_mask;
            }
            
            if (uarts::uart2.rx_.get_free_size() > 0)
            {
                uarts::uart2.rx_.push(item);
            }
            else
            {
                assert(0 && "UART RX queue overflow");
                hw::LEDs::red(config::led_long_flash);
                uarts::uart2.overflow_ = true;
            }
        }
        break;
        
    case hw::UART::UxIIR_RDA_bit:
    case hw::UART::UxIIR_CTI_bit:
        while (uarts::uart2.rx_.get_free_size() > 0)
        {
            byte lsr = U2LSR;
            
            assert(0 == (lsr & util::bit<hw::UART::UxLSR_RX_OE>::value));
            
            if (lsr & util::bit<hw::UART::UxLSR_RX_RDR>::value)
            {
                basic_uart_t::rx_channel_item_t item;
                
                item.lsr = 0;
                item.value = U2RBR;
                
                uarts::uart2.rx_.push(item);
            }
            else
            {
                break;
            }
        }
        break;
        
    case hw::UART::UxIIR_THRE_bit:
        for (unsigned n = util::min_val<unsigned>(hw::UART::tx_batch_max_length, uarts::uart2.tx_.get_count()); n > 0; --n)
        {
            byte b;
            uarts::uart2.tx_.pop(b);
            U2THR = b;
        }
        break;
    }
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 00:16
Рейтинг@Mail.ru


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