Возникла проблема с прерываниями RX USART1. Вызовы обработчика прерывания RX оказались синхронизированы с прерываниями системного таймера (при scmRTOS_SYSTIMER_NEST_INTS_ENABLE 1) или вызов обработчика не происходил совсем (при scmRTOS_SYSTIMER_NEST_INTS_ENABLE 0). При этом необходимые биты в регистрах были установлены - RXCIE1 в UCSR1B, RXC1 в USCR1A, I в SREG. USART0 работал корректно.
Причина проблемы по-видимому в переключения контекста scmRTOS с использованием программного прерывания (scmRTOS_CONTEXT_SWITCH_SCHEME 1), так как при scmRTOS_CONTEXT_SWITCH_SCHEME 0 проблема устраняется. Для переключения контекста в порте используется прерывание SPM_READY, которое имеет больший приоритет чем прерывания USART1.
Пока у меня есть две версии того что происходит:
1. Прерывание USART1_RX вызывается только по фронту, при установке бита RXC1 в 1 и если в этот момент прерывания были запрещены после их разрешения прерывание USART1_RX больше вызвано не будет. Насколько я понимаю документацию, обработка прерываний от USART не должена так работать:
Цитата
When the Receive Complete Interrupt Enable (RXCIEn) in UCSRnB is set, the USART Receive Complete interrupt will be executed as long as the RXCn Flag is set (provided that global interrupts are enabled).
2. У контроллер прерываний ATmega1284 остались какие-то недокументированные особенности так как в Atmel никто не ожидал что прерывание SPM_READY будет использоваться без переноса таблицы векторов прерываний в область бутлоадера:
Цитата
When using the SPM interrupt, the Interrupt Vectors should be moved to the BLS section to avoid that an interrupt is accessing the RWW section when it is blocked for reading.