Вот столкнулся с примитивной, казалось бы, проблемой при написании своей программы на языке C:
Мне необходимо получить идентификатор, обозначающий номер вектора прерываний, задавая число=номеру прерывания. Причём этот номер задаётся с помощью директивы #define. Поясню с помощью кода:
Код
#define INT0N 3 // номер прерывания для линии INT0
#define INT1N 2 // номер прерывания для линии INT1
#define MAKE_VECTOR_NAME(n) INT##n##_vect
#define INT0_VECTOR MAKE_VECTOR_NAME(INT0N) // вектор прерывание для для линии INT0
#define INT1_VECTOR MAKE_VECTOR_NAME(INT1N) // вектор прерывание для для линии INT1
#define ENABLE_INT0 EIMSK=(EIMSK|(1<<INT1N))
#define ENABLE_INT1 EIMSK=(EIMSK|(1<<INT0N))
...
#pragma vector = INT0_VECTOR
__interrupt void int0_isr_routine(void)
{
}
#pragma vector = INT1_VECTOR
__interrupt void int1_isr_routine(void)
{
}
#define INT1N 2 // номер прерывания для линии INT1
#define MAKE_VECTOR_NAME(n) INT##n##_vect
#define INT0_VECTOR MAKE_VECTOR_NAME(INT0N) // вектор прерывание для для линии INT0
#define INT1_VECTOR MAKE_VECTOR_NAME(INT1N) // вектор прерывание для для линии INT1
#define ENABLE_INT0 EIMSK=(EIMSK|(1<<INT1N))
#define ENABLE_INT1 EIMSK=(EIMSK|(1<<INT0N))
...
#pragma vector = INT0_VECTOR
__interrupt void int0_isr_routine(void)
{
}
#pragma vector = INT1_VECTOR
__interrupt void int1_isr_routine(void)
{
}
В начале модуля задаётся номер прерывания INT0N, затем он используется для разрешения/запрещения данного прерывания (манипуляции с EIMSK). Также хотелось бы использовать этот номер при объявлении процедуры соответствующего прерывания "#pragma vector =xxxx". Однако, при компиляции приведённого выше кода, выдаётся ошибка ""INTINT0N_vect" is undefined", то есть в макросе MAKE_VECTOR_NAME не происходит подстановка числа вместо "INT0N".
Компилятор IAR for AVR.
Подскажите, может быть, существует другой способ решить эту проблему.