|
|
  |
WinAVR и C++, Не устанавливаются вектора прерываний |
|
|
|
May 9 2007, 17:38
|
Частый гость
 
Группа: Свой
Сообщений: 89
Регистрация: 31-10-06
Пользователь №: 21 829

|
Добрый день, уважаемый Ол! Создал в программе процедуру с именем USART_RX_vect. Компилирую сорец как Си - нет проблем. <- Дизассемблирую - вижу по адресу 0x00B релатив джамп - туда, куда нужно; тэщщю - всё работает! Ничего не меняю в исходнике. Компилирую сорец как Си++ (ключ -хс++) - есть проблема. <- Дизассемблирую - вижу по адресу 0x00B Релатив джамп - туда, куда НЕ нужно (всё равно, что нет у меня в программе процедуры обработчика); тэщщю - НИЧЕГО НЕ РАБОТАЕТ ! (и слава Богу, что не работает  если бы оно и в этом случае заработало - было бы хуже  Я так понимаю, проблема в линкере? Мож. кто чё посоветует, а? З.Ы.: Интим или отказ от С++ не предлогать! (до этого я и сам дойти могу; мне нужен корень зла!) З.Ы.2: 0x00B - это вектор прерывания по приходу байта в ЮДР. Спасибо.
|
|
|
|
|
May 9 2007, 19:52
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 12-04-06
Из: Haifa
Пользователь №: 16 042

|
Работаю с интераптами и С++ без проблем, правда сырец .срр (тогда компайлер и линкер знает что это С++)и использую екстернал makefile.
|
|
|
|
|
May 9 2007, 20:15
|
Частый гость
 
Группа: Свой
Сообщений: 89
Регистрация: 31-10-06
Пользователь №: 21 829

|
Цитата(Dibor @ May 9 2007, 22:52)  Работаю с интераптами и С++ без проблем, правда сырец .срр (тогда компайлер и линкер знает что это С++)и использую екстернал makefile. Вы имеете ввиду, что компилируете Ваш исходник, написанный на Си++, в котором определены обработчики прерываний (типа _VECTOR(11) ) при помощи avr-gcc и всё Ок? Я провёл сравнение и выяснил, что при компиляции одного и тогоже исходника в случае Си - асм. код -один (правильный, обработчик прерывания установлен), а при компиляции Си++ - (обработчика просто нет). -> Проблема в компиляторе Си++ (avr-cpp). Скажите плз. что в Вашем мейкфайле отличается от автосгенеренного ?
|
|
|
|
|
May 9 2007, 20:23
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 12-04-06
Из: Haifa
Пользователь №: 16 042

|
Я использую мейкфайл заделанный Mfile из WinAVR . В AVRStudio использую опцию "Use External Nakefile" Sourse с расширением .срр ! http://electronix.ru/forum/index.php?showtopic=19597
|
|
|
|
|
May 9 2007, 20:40
|
Частый гость
 
Группа: Свой
Сообщений: 89
Регистрация: 31-10-06
Пользователь №: 21 829

|
Цитата(Dibor @ May 9 2007, 23:23)  Я использую мейкфайл заделанный Mfile из WinAVR . В AVRStudio использую опцию "Use External Nakefile" Sourse с расширением .срр ! http://electronix.ru/forum/index.php?showtopic=19597Короче, у Вас прерывания работают (обработчики вызываются когда нужно) ?
|
|
|
|
|
May 9 2007, 20:49
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 12-04-06
Из: Haifa
Пользователь №: 16 042

|
Да, но я работал с Таймерами, так что про USART немогу ничего утверждать.
|
|
|
|
|
May 10 2007, 19:38
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Mos @ May 9 2007, 19:38)  Добрый день, уважаемый Ол!
Создал в программе процедуру с именем USART_RX_vect. "сам создал" или штатным макросом ISR(USART_RX_vect) ? Дело в том, что в C++ имена "перекорёживаются", чтобы различить перегруженные функции. И void USART_RX_vect(void) __attribute__("чего надо") после компиляции в режиме C++ будет иметь несколько другое имя, можно посмотреть, скомпилировав с ключиком -S или в листинг глянуть. Чтобы имя осталось нормальное, надо персонально эту функцию скомпилировать в режиме С, добавив перед ней extern "C", но єта штука недопустима, если весь файл компилируется как С. В стандартном макросе ISR() такое добавление делается условно, по #ifdef __cplusplus
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
May 13 2007, 09:59
|
Частый гость
 
Группа: Свой
Сообщений: 89
Регистрация: 31-10-06
Пользователь №: 21 829

|
Цитата(ReAl @ May 10 2007, 22:38)  "сам создал" или штатным макросом ISR(USART_RX_vect) ? Дело в том, что в C++ имена "перекорёживаются", чтобы различить перегруженные функции. И void USART_RX_vect(void) __attribute__("чего надо") после компиляции в режиме C++ будет иметь несколько другое имя, можно посмотреть, скомпилировав с ключиком -S или в листинг глянуть. Чтобы имя осталось нормальное, надо персонально эту функцию скомпилировать в режиме С, добавив перед ней extern "C", но єта штука недопустима, если весь файл компилируется как С. В стандартном макросе ISR() такое добавление делается условно, по #ifdef __cplusplus БРАТ!
|
|
|
|
|
Oct 2 2007, 08:38
|
Участник

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141

|
Так... мне тоже требуется помощь. Объявляю прерывание так: Код extern "C"{ void USART_RXC_vect(void) __attribute__((interrupt)); void USART_RXC_vect(void) { _delay_ms(1); } Ассемблерный код: Код sei push r1 push r0 in r0, 0x3f; 63 push r0 eor r1, r1 push r24 push r25 ldi r24, 0x66; 102 ldi r25, 0x0E; 14 sbiw r24, 0x01; 1 brne .-4; 0x210 <__vector_11+0x14> pop r25 pop r24 pop r0 out 0x3f, r0; 63 pop r0 pop r1 reti В этом случае прерывания не обслуживается. Если объявляю так: Код ISR(USART_RXC_vect) { _delay_ms(1); } ассемблер: Код push r1 push r0 in r0, 0x3f; 63 push r0 eor r1, r1 push r24 push r25 ldi r24, 0x66; 102 ldi r25, 0x0E; 14 sbiw r24, 0x01; 1 brne .-4; 0x20e <__vector_11+0x12> pop r25 pop r24 pop r0 out 0x3f, r0; 63 pop r0 pop r1 reti Прерывания обслуживаются. В чем дело? Мозг кипит. Да, смотрел таблицу прерываний, там все ок.
|
|
|
|
|
Oct 2 2007, 09:54
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Igor_U @ Oct 2 2007, 11:38)  В чем дело? Мозг кипит. Посмотреть в <avr/interrupt.h> как реализован макрос ISR() и чем его реализация отличается от вашей. Мозг залить пивом. А чем ISR() не устраивает?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 2 2007, 12:03
|
Участник

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141

|
__attribute__((interrupt)); __attribute__((signal)); Пока оставил ISR(), время нет разбираться. Но вообще если не забуду, надо будет разобраться обязательно. Как влияет разрешенное прерывание в начале функции не понимаю. Остальная переферия была выключена, а прерывания, кроме этого, запрещены. Да, еще забыл. __attribute__((interrupt)) использую часто. Первый раз нарвался. На меге 8-ой, практически ничего не делал.
Сообщение отредактировал Igor_U - Oct 2 2007, 12:05
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|