Перейти к содержанию
    

ignoring #pragma vector

Хочу запустить пример с прерыванием:

#pragma vector=CANIT_vect

__interrupt void __interrupt_can_it(void)

 

но компилятор выдает:

warning:ignoring #pragma vector

error: syntax error before "void"

 

 

Мне кажется что вторая ошибка происходит из-за первого предупреждения, но почему это вылазит и как это побороть незнаю.

 

Помогите пожалуйста!

 

Заранее благодарен!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу запустить пример с прерыванием:

#pragma vector=CANIT_vect

__interrupt void __interrupt_can_it(void)

 

но компилятор выдает:

warning:ignoring #pragma vector

error: syntax error before "void"

 

 

Мне кажется что вторая ошибка происходит из-за первого предупреждения, но почему это вылазит и как это побороть незнаю.

 

Помогите пожалуйста!

 

Заранее благодарен!

Было вроде у меня такое я в ICCV7 for AVR пытался прерывание по 5 му вектору сделать.

В конце концов переделал программу под IAR

Изменено пользователем Мах

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу запустить пример с прерыванием:

#pragma vector=CANIT_vect

__interrupt void __interrupt_can_it(void)

 

но компилятор выдает:

warning:ignoring #pragma vector

error: syntax error before "void"

 

 

Мне кажется что вторая ошибка происходит из-за первого предупреждения, но почему это вылазит и как это побороть незнаю.

 

Помогите пожалуйста!

 

Заранее благодарен!

А Вы вектор правильно определили? Посмотрите, как он в заголовочном файле записан.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__interrupt

Нет такого слова. Есть __irq.

Ну, это как сказать.

/*      Interrupt handlers      */

#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Int(void)
        {
        TCNT0   = 100;                  // Reload TIMER0
        IntFlags |= TIMER0_BIT;         // Set the flag
        }

#pragma vector = TIMER1_COMPA_vect
__interrupt void Timer1_Int(void)
        {
        IntFlags |= TIMER1_BIT;        // Set the flag
        }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, это как сказать.

Смотрим на ветку, которая называется "IAR how to" и прямо говорим - нету.

Правда это подветка "AVR" которым я не пользуюсь...

Так-что варианты конечно возможны :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, это как сказать.

Смотрим на ветку, которая называется "IAR how to" и прямо говорим - нету.

Правда это подветка "AVR" которым я не пользуюсь...

Так-что варианты конечно возможны :-)

Кроме AVR еще и для MSP430 тоже используется вариант __interrupt. И для других тоже - это вообще их (IAR) традиционный вариант, который ранее был просто interrupt, а позже они привели его к более кошерному __interrupt. Т.ч. АРМ тут как раз в меньшинстве. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Вы вектор правильно определили? Посмотрите, как он в заголовочном файле записан.

В файле iocanxx.h определено вот так:

 

/* CAN Transfer Complete or Error */

#define CANIT_vect _VECTOR(18)

#define SIG_CAN_INTERRUPT1 _VECTOR(18)

 

Пробовал я писать #pragma vector=18

Тоже самое.

 

С __irq тоже самое.

 

Что делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кроме AVR еще и ...

Да __interrupt это максимально "правильное" всеми и вся используемое ключевое слово.

Я его не раз автоматически при переползании под EWARM писал и чертыхался. Поэтому так и

отреагировал :-( на сочетание IAR и __interrupt.

Интересно какого черта для ARM сделали "исключение"?

Короче, сейчас в свой любимый header вписал:

#define __interrupt __irq __arm

Дабы все "правильно" было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Вы вектор правильно определили? Посмотрите, как он в заголовочном файле записан.

В файле iocanxx.h определено вот так:

 

/* CAN Transfer Complete or Error */

#define CANIT_vect _VECTOR(18)

#define SIG_CAN_INTERRUPT1 _VECTOR(18)

 

Пробовал я писать #pragma vector=18

Тоже самое.

 

С __irq тоже самое.

 

Что делать?

Посмотрите в опциях проекта настройки C/C++ Compiler->Language

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня AVR Studio

В опциях проэкта я нашёл:

Custom Compilation Options:

All files -Wall -gdwarf-2 -O0

 

Используется WinAVR

 

Других настроек ненашёл.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня AVR Studio

В опциях проэкта я нашёл:

Custom Compilation Options:

All files -Wall -gdwarf-2 -O0

 

Используется WinAVR

 

Других настроек ненашёл.

Так и спрашивать надо было не в этом подфоруме. WinAVR - совершенно другой компилятор. Читайте в папке \doc в описании avrlibc как оформляются прерывания в WinAVR. Раздел (если память не изменяет) interrupt.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...