Вкратце проблема такова:
перебросил проект из ИАРа в АВРСтудию. (проект атмеловский AVR323),
добавил немного своего кода, все компилируется без ошибок(в железе не работает), кроме варнинга:
../sms_com.c: In function 'SIGNAL':
../sms_com.c:100: warning: type of '__vector_11' defaults to 'int'
Пробовал с разной оптимизацией, по разному прерывание называл... все равно варнинг..
Вот код прерывания (прием байта из УСАРТ)
Код
//#pragma vector=USART_RXC_vect // Это оригинал из ИАРа
//__interrupt void USART0_RX_interrupt( void ) // ---..----
// ISR (USART_RXC_vect) // Это я пробовол эти варианты
//int ISR (SIG_UART_RECV)
int SIGNAL (SIG_UART_RECV)
{
unsigned char data; //Local variable
data = UDR; //Always read something
rx_buffer[ rx_wr_i++ ] = data; //Store new data
if( rx_wr_i > RX_BUFFER_MASK ) //Check for overflow
{
rx_wr_i = 0; //Reset write index
rx_overflow = 1; //Set flag high
UCSRB &= ~( 1 << RXCIE ); // Disable RX interrupt
}
if( searchFor[rx_i] == data ) //Test response match
{
rx_i++;
if( !searchFor[rx_i] ) //End of new_message string...received new message!
{
rx_i = 0;
if( searchStr == CMTI_ ) //+CMTI:
{
searchFor = searchStrings[ CRLF_ ]; //Wait for
searchStr = CRLF_;
}
else //Normal acknowledgement
{
rx_ack = 1; //Set new message flag
UCSRB &= ~( 1 << RXCIE ); // Disable RX interrupt
}
}
}
else
{
rx_i = 0; //Not valid search pattern...start again.
}
// return 0; // это тоже пробовал
}
//__interrupt void USART0_RX_interrupt( void ) // ---..----
// ISR (USART_RXC_vect) // Это я пробовол эти варианты
//int ISR (SIG_UART_RECV)
int SIGNAL (SIG_UART_RECV)
{
unsigned char data; //Local variable
data = UDR; //Always read something
rx_buffer[ rx_wr_i++ ] = data; //Store new data
if( rx_wr_i > RX_BUFFER_MASK ) //Check for overflow
{
rx_wr_i = 0; //Reset write index
rx_overflow = 1; //Set flag high
UCSRB &= ~( 1 << RXCIE ); // Disable RX interrupt
}
if( searchFor[rx_i] == data ) //Test response match
{
rx_i++;
if( !searchFor[rx_i] ) //End of new_message string...received new message!
{
rx_i = 0;
if( searchStr == CMTI_ ) //+CMTI:
{
searchFor = searchStrings[ CRLF_ ]; //Wait for
searchStr = CRLF_;
}
else //Normal acknowledgement
{
rx_ack = 1; //Set new message flag
UCSRB &= ~( 1 << RXCIE ); // Disable RX interrupt
}
}
}
else
{
rx_i = 0; //Not valid search pattern...start again.
}
// return 0; // это тоже пробовал
}
Если не писать перед ISR(SIGNAL) Int - то пишет 3 варнинга:
../sms_com.c:100: warning: return type defaults to 'int'
../sms_com.c: In function 'SIGNAL':
../sms_com.c:100: warning: type of '__vector_11' defaults to 'int'
../sms_com.c:139: warning: control reaches end of non-void function
Оригинальный проект был на меге 128, я писал для меги8.
В итоге, железо не работает, команду отсылает, но приема невидит, мало того происходит рестарт программы...
Я пробовал пошагово, но выловить не смог..
Мысли: - может непорядок со стеком(хотя проект занимает меньше 40% памяти и данных.
- может непорядок с прерыванием!
Подскажите плиз еще мысли!