a9d 0 January 21, 2012 Posted January 21, 2012 · Report post Заметил интересный феномен в версии 3.10 на микроконтроллере ATmega168pa. OS_INTERRUPT void USART_RXC_vect() { OS::TISRW_SS ISRW; ..... } Это прерывание не срабатывает. Тоже самое и с TX. Заменил на ISR и заработало. Но это походу некорректно. В 4.0 это еще не проверял. Quote Share this post Link to post Share on other sites More sharing options...
Артём__ 1 January 21, 2012 Posted January 21, 2012 · Report post Заметил интересный феномен в версии 3.10 на микроконтроллере ATmega168pa. OS_INTERRUPT void USART_RXC_vect() { OS::TISRW_SS ISRW; ..... } Это прерывание не срабатывает. Тоже самое и с TX. Использовал нечто подобное на Меге128 (RXC и UDRE, а не TXC): #pragma vector=USART1_RXC_vect __interrupt void GSMUartRx() { OS::TISRW_SS ISRW; unsigned char i=UDR1; GsmRxPtr.WriteByte(i); #if (COPY_GSMUART_TO_EXTUART==1) ExtTxPtr.WriteByte(i); #endif } #pragma vector=USART1_UDRE_vect __interrupt void GSMUartTx() { OS::TISRW_SS ISRW; unsigned char i=GsmTxPtr.ReadByte(); UDR1=i; #if (COPY_GSMUART_TO_EXTUART==1) ExtTxPtr.WriteByte(i); #endif if (GsmTxPtr.BufferNotEmpty()==0) StopGsmUartTx(); } Никаких проблем не возникало. Возможно что-то неправильно с инициализацией прерываний? Заменил на ISR и заработало. ISR это - TISRW? Или scmRTOS_ISRW_TYPE? Или что? В 4.0 это еще не проверял. Проверял тоже в 3.10. Quote Share this post Link to post Share on other sites More sharing options...
a9d 0 January 21, 2012 Posted January 21, 2012 (edited) · Report post ISR(USART_RX_vect) { OS::TISRW_SS ISRW; .... } Это если без обверток ОС. В четвертой версии тоже не работает. Пля. Лоханулся. Нужно использовать USART_RX_vect и USART_TX_vect вектора а не USART_RXC_vect и USART_TXC_vect. Edited January 21, 2012 by a9d Quote Share this post Link to post Share on other sites More sharing options...
Артём__ 1 January 21, 2012 Posted January 21, 2012 · Report post Пля. Лоханулся. Нужно использовать USART_RX_vect и USART_TX_vect вектора а не USART_RXC_vect и USART_TXC_vect. Ясно. Опять Атмел с именами учудил. И что оно при использовании USART_RXC_vect и USART_TXC_vect компилировалось как ни в чём не бывало? Где тогда IAR нашёл их определение и что подставил? Quote Share this post Link to post Share on other sites More sharing options...
a9d 0 January 21, 2012 Posted January 21, 2012 · Report post Отлично компилируется, но не пашет. IAR я не использовал. Также заметил, что тулчейн из студии 5.1 получше WinAVR. Разница почти в сто байт. Компиляторы там одни и те-же, но в студии он посвежее. Quote Share this post Link to post Share on other sites More sharing options...
ReAl 0 January 22, 2012 Posted January 22, 2012 · Report post И что оно при использовании USART_RXC_vect и USART_TXC_vect компилировалось как ни в чём не бывало? Где тогда IAR нашёл их определение и что подставил?Как уже сказали, avr-gcc. И он обижается на неправильное имя, но ворчит, а не скандал поднимает: include <avr/interrupt.h> ISR(FOO_vect) { } $ avr-gcc -Os -mmcu=atmega8 -S isr.c isr.c:3: warning: ‘FOO_vect’ appears to be a misspelled signal handler Но кто же его предупреждения смотрит. Quote Share this post Link to post Share on other sites More sharing options...
Артём__ 1 January 22, 2012 Posted January 22, 2012 · Report post И он обижается на неправильное имя, но ворчит, а не скандал поднимает: isr.c:3: warning: ‘FOO_vect’ appears to be a misspelled signal handler[/code] Но кто же его предупреждения смотрит. C GCC не работал, вот и удивляюсь. IAR в таком случае ошибку выдаёт: Error[Pe020]: identifier "TCE3_OVF_vect" is undefined Quote Share this post Link to post Share on other sites More sharing options...