Имеется три процесса.
1. Первый передача запросов Модбас (USART0) после спячки Sleep(900);
Код
// Передача команд по MODBUS
template<> void TProc1::Exec()
{
for(;;)
{
Sleep(900);
// Запретить прием
UCSR0B &= ~( 1 << RXEN0 );
// Запретить прерывания на прием USART0
UCSR0B &= ~(1<<RXCIE0);
//---------------------------------------------------------------------------
...... передача по USART0 типа
// Ждять пока будет пуст буфер передачи
while ( !(UCSR0A & (1<<UDRE0)) );
// Передача байта
UDR0 = data;
//---------------------------------------------------------------------------
// Разрешить прием
UCSR0B |= (1 << RXEN0);
// Разрешить прерывания на прием USART0
UCSR0B |= (1<<RXCIE0);
}
}
2. Второй передача данных в PC (USART1) по прерыв. таймера 1 проспав Sleep(150);
Код
template<> void TProc2::Exec()
{
__watchdog_reset();
unsigned char i;
for(;;)
{
// Ожидание Timer1_CompA через 90 мс
Sleep(150);
Timer1_CompA.Wait();
.... пердача типа
while ( !(UCSR1A & (1<<UDRE1)) );
UDR1 = data;
}
}
3. Третий прием данных USART0 по прерываниям приема (заполнения приемного буфера)
Код
// Прием по Modbus
template<> void TProc3::Exec()
{
for(;;)
{
// Sleep(1);
// Сброс флага приема
Usart0_rxc.Wait();
cRxBuf[cRxBufCount] = UDR0;
cRxBufCount++;
}
}
Сами прерывания
Код
//---------------------------------------------------------------------------
#pragma vector=TIMER1_COMPA_vect
OS_INTERRUPT void Timer1_period_ISR()
{
OS::TISRW_SS ISRW;
ENABLE_NESTED_INTERRUPTS();
Timer1_CompA.SignalISR();
}
//---------------------------------------------------------------------------
#pragma vector=USART0_RXC_vect
OS_INTERRUPT void Usart0_rxc_ISR()
{
OS::TISRW_SS ISRW;
ENABLE_NESTED_INTERRUPTS();
Usart0_rxc.SignalISR();
}
В таком виде все глохнет при попадании первых байт в приемный буфер USART0
Приоритеты процессов выставлены по очереди 1,2,3.
Подскажите пожалуйста где я ошибаюсь?