Обработчик прерывания (ниже), если не доставать данные из 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;
}
}