2014-09-28 2 views
1

При составлении в CCS6, я встретил эту ошибку:Что вызывает CCS6 для создания символов типа «__TI_int47»?

#10056 symbol "__TI_int47" redefined 

(Compiling для MSP430 с помощью Code Composer Studio с помощью Texas Instruments)

Это происходит при объявлении подпрограммы обслуживания прерывания, такие как:

#pragma vector=PORT1_VECTOR 
__interrupt void P1input_ISR() 
{ 
    P1IFG &= ~BIT0; // mark interrupt as "handled" 
} 

Что вызывает появление этих анонимных символов?

Как можно отследить код, сгенерированный символ?

ответ

1

Символ __TI_int47, вероятно, является своего рода псевдонимом для вашей функции ISR. Это всего лишь внутренняя информация о реализации того, как одна часть компилятора передает другой части информацию о том, какие ISR вы определили. Возможно, вы указали прагму, которую вы опубликовали. Бьюсь об заклад, что PORT1_VECTOR определяется как 47 конкретным файлом заголовка процессора.

Похоже, в вашем проекте имеется несколько фрагментов кода, определяющих один и тот же ISR, поэтому вам нужно будет удалить один или, возможно, позвонить один из другого.

+0

Да, было два места, где определялся '#pragma vector = PORT1_VECTOR'. Отличная дедукция. –

3

PORT1_vector является 47. #pragma vector 47 в CCS и IAR вызывает следующую функцию, чтобы установить для прерывания 47. Под капотом, по-видимому, он что, определив символ с именем __TI_int47, что компоновщик будет позже использовать для заполнения вектор прерывания Таблица. Ошибка возникает из-за того, что для одного и того же вектора определены две разные функции, что невозможно.

+0

Отличный ответ. Для парня PERL вы наверняка знаете свои вещи. Слишком плохо, что они не генерируют нечто более интуитивное, например 'port1_vector' в качестве имени функции. –